📋 Daftar Isi
1. Pengenalan Testing
Testing adalah proses memverifikasi bahwa kode berfungsi sesuai harapan. Dalam pengembangan perangkat lunak, testing membantu menemukan bug lebih awal, memastikan kode tidak rusak setelah perubahan (regression), dan memberikan dokumentasi tentang perilaku kode.
Jenis-jenis Testing
| Jenis | Deskripsi | Contoh |
|---|---|---|
| Unit Test | Menguji fungsi/komponen secara individual | Test fungsi hitung_total() |
| Integration Test | Menguji interaksi antar komponen | Test API + Database |
| Functional Test | Menguji fitur dari perspektif pengguna | Test login flow |
| End-to-End Test | Menguji seluruh alur aplikasi | Test checkout dari keranjang |
Mengapa pytest?
| Keunggulan | Penjelasan |
|---|---|
| Sintaks Sederhana | Cukup gunakan assert, tidak perlu method khusus |
| Auto-discovery | Otomatis menemukan file test yang dimulai dengan test_ |
| Fixtures | Sistem setup/teardown yang powerful dan reusable |
| Parametrize | Jalankan test yang sama dengan data berbeda |
| Rich Plugin Ekosistem | Ribuan plugin: coverage, HTML report, parallel, dll |
| Backward Compatible | Bisa menjalankan test dari unittest dan nose |
Diagram: Testing Pyramid
2. Memulai dengan pytest
Instalasi
Diagram
Contoh TDD: Membuat Class Keranjang Belanja
Python — Step 1: RED — Tulis test
# test_keranjang.py — Tulis test DULU (akan gagal karena class belum ada)
import pytest
from keranjang import Keranjang, Produk
class TestKeranjang:
@pytest.fixture
def keranjang(self):
return Keranjang()
@pytest.fixture
def produk_laptop(self):
return Produk(id=1, nama="Laptop", harga=10000000)
@pytest.fixture
def produk_mouse(self):
return Produk(id=2, nama="Mouse", harga=150000)
def test_keranjang_awalnya_kosong(self, keranjang):
assert keranjang.jumlah_item() == 0
assert keranjang.total() == 0
def test_tambah_produk(self, keranjang, produk_laptop):
keranjang.tambah(produk_laptop)
assert keranjang.jumlah_item() == 1
def test_tambah_produk_dengan_jumlah(self, keranjang, produk_mouse):
keranjang.tambah(produk_mouse, jumlah=3)
assert keranjang.jumlah_item() == 3
def test_total_harga(self, keranjang, produk_laptop, produk_mouse):
keranjang.tambah(produk_laptop)
keranjang.tambah(produk_mouse, jumlah=2)
assert keranjang.total() == 10000000 + (150000 * 2)
def test_hapus_produk(self, keranjang, produk_laptop):
keranjang.tambah(produk_laptop)
keranjang.hapus(produk_laptop.id)
assert keranjang.jumlah_item() == 0
def test_hapus_produk_tidak_ada(self, keranjang):
with pytest.raises(ValueError, match="Produk tidak ditemukan"):
keranjang.hapus(999)
def test_produk_string(self, produk_laptop):
assert str(produk_laptop) == "Laptop (Rp 10,000,000)"
Python — Step 2: GREEN — Tulis kode
# keranjang.py — Implementasi agar test lulus
class Produk:
def __init__(self, id, nama, harga):
self.id = id
self.nama = nama
self.harga = harga
def __str__(self):
return f"{self.nama} (Rp {self.harga:,.0f})"
class Keranjang:
def __init__(self):
self._items = {} # {produk_id: {'produk': ..., 'jumlah': ...}}
def tambah(self, produk, jumlah=1):
if produk.id in self._items:
self._items[produk.id]['jumlah'] += jumlah
else:
self._items[produk.id] = {'produk': produk, 'jumlah': jumlah}
def hapus(self, produk_id):
if produk_id not in self._items:
raise ValueError("Produk tidak ditemukan")
del self._items[produk_id]
def jumlah_item(self):
return sum(item['jumlah'] for item in self._items.values())
def total(self):
return sum(
item['produk'].harga * item['jumlah']
for item in self._items.values()
)
# Menjalankan:
# pytest test_keranjang.py -v
# Semua 7 test seharusnya PASSED ✅
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang pytest: