pytest adalah test runner Python yang banyak dipakai karena sintaksnya sederhana dan laporan kegagalannya jelas. Test dapat berupa fungsi biasa dengan nama yang diawali test_; assertion memakai pernyataan assert bawaan Python.
Pasang pytest dan tulis test pertama #
Buat virtual environment dan pasang pytest:
python -m venv .venv
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
python -m pip install pytest
Misalnya discount.py berisi fungsi pemberian diskon:
def apply_discount(price, percent):
if price < 0 or not 0 <= percent <= 100:
raise ValueError("invalid price or discount")
return price * (1 - percent / 100)
Buat file test_discount.py untuk menguji harga normal dan input yang harus ditolak:
import pytest
from discount import apply_discount
def test_menerapkan_diskon_persen():
assert apply_discount(80, 25) == 60
def test_menolak_diskon_di_atas_seratus_persen():
with pytest.raises(ValueError, match="invalid price"):
apply_discount(80, 120)
Jalankan pytest dari direktori utama proyek. pytest menemukan file dan fungsi test lewat konvensi nama.
Gunakan fixture untuk resource bersama #
Fixture menyediakan nilai atau resource yang dibutuhkan test, misalnya direktori sementara, client aplikasi, atau sesi database. Letakkan setup dekat dengan test dan pastikan cleanup dilakukan jika resource perlu dilepas.
import pytest
@pytest.fixture
def keranjang():
return {"items": [], "total": 0}
def test_keranjang_baru_kosong(keranjang):
assert keranjang["items"] == []
assert keranjang["total"] == 0
pytest membuat fixture untuk test lalu memasukkannya berdasarkan nama parameter. Fixture seharusnya memperjelas dependensi, bukan menyembunyikan setup rumit di balik rangkaian fungsi yang tidak terlihat.
Buat kegagalan mudah dipahami #
Uji perilaku yang penting dan pilih nama test yang menjelaskannya. Pisahkan ekspektasi yang tidak berhubungan bila itu membuat penyebab kegagalan lebih jelas. Gunakan pytest.raises untuk exception yang diharapkan.
Hindari state mutable yang dipakai bersama. Fixture dengan scope fungsi adalah default dan memberi state baru bagi tiap test. Untuk layanan eksternal, gunakan fake atau layanan test, bukan kredensial developer atau koneksi jaringan pribadi.