Birim testi yazmaya başlamak: neyi, nasıl test etmeli?
Test yazmak çoğu zaman "sonra yaparım" listesinde kalır. Oysa küçük ve doğru seçilmiş birkaç test, hatayı canlıya çıkmadan yakalar ve kodu değiştirirken içini rahatlatır.
Birim testi nedir?
Birim testi, kodun küçük bir parçasını (genelde tek bir fonksiyon veya sınıf) dış dünyadan bağımsız olarak dener. Veritabanına, ağa veya dosya sistemine gitmez; bu yüzden hızlı çalışır.
İyi bir testin yapısı: AAA
def test_indirim_yuzde_onu_uygular():
# Arrange: hazırlık
sepet = Sepet(toplam=200)
# Act: çalıştır
sonuc = sepet.indirim_uygula(yuzde=10)
# Assert: kontrol et
assert sonuc == 180
Her test tek bir davranışı kontrol etmeli ve adı neyi beklediğini söylemeli.
Önce neyi test etmeli?
- İş kuralları: Fiyat hesaplama, yetki kontrolü, tarih aralıkları gibi hatası pahalıya patlayan yerler.
- Sınır değerleri: 0, boş liste, negatif sayı, en büyük değer, ay sonu, artık yıl.
- Daha önce hata çıkan yerler: Her düzeltilen hata için bir test yazarsan aynı hata geri gelmez.
Basit getter/setter'ları veya kullandığın kütüphanenin kendisini test etmene gerek yok.
Bağımlılıkları ayırmak
Fonksiyon doğrudan veritabanına veya saate bağlıysa test etmek zorlaşır. Bağımlılığı dışarıdan vermek işleri kolaylaştırır:
def gecikme_var_mi(teslim_tarihi, bugun):
return bugun > teslim_tarihi
datetime.now() fonksiyonun içinde çağrılsaydı her gün farklı sonuç verebilirdi. Dışarıdan aldığında test her zaman aynı sonucu verir.
Dillere göre yaygın araçlar
- Python:
pytest - JavaScript/TypeScript: Vitest, Jest
- PHP: PHPUnit
- Java: JUnit
- C#: xUnit, NUnit
Sık yapılan hatalar
- Bir testte çok fazla şeyi aynı anda kontrol etmek. Test kırıldığında sebebi bulmak zorlaşır.
- Testlerin birbirine bağımlı olması (sıra değişince kırılan testler).
- Kapsama oranını (coverage) hedef yapmak. Yüzde 100 kapsama, doğru şeyin test edildiği anlamına gelmez.
Başlamak için en iyi yer: bir sonraki hata düzeltmende önce hatayı gösteren testi yaz, sonra düzelt.