Kapsama ve Mutasyon — Yüzde Yüz Test, Hata Nasıl Geçti?
Önce şunu oku: TDD — Red, Green, Refactor
30 saniyede özet
Kapsama oranı bir satırın test sırasında çalıştığını söyler, doğru sonuç verdiğini değil. Mutasyon testi kodda bilerek küçük hatalar yapar ve testlerin onları yakalayıp yakalamadığına bakar; yaşayan değişiklik eksik kontrolü gösterir.
Bir yangın denetçisi evin bütün odalarını geziyor ve rapora “yüzde yüz kontrol edildi” yazıyor. Ama hiçbir alarmı denemiyor. Asıl denetim, her odada bilerek biraz duman çıkarıp hangi alarmın sessiz kaldığına bakmaktır.
-
Bayt: Havale ücreti fonksiyonunun kapsaması yüzde yüz. Testlerimiz sağlam olmalı.
-
Sen: Canlıda tam 10.000 TL'lik havalelerden yanlış ücret alınmış. Hiçbir test kırmızı olmadı.
-
Bayt: Testlere baktım: fonksiyonu çağırıyorlar ama sonucu hiç kontrol etmiyorlar!
-
Bayt: Odaları gezmek yetmiyor; her alarmı tek tek denememiz gerekiyor.
Kapsama neyi ölçer?
kapsama oranıTestler çalışırken kodun satırlarının ne kadarının en az bir kez çalıştığı. Satırların doğru sonuç verdiğini ölçmez.Sözlükte gör →, testler çalışırken kodun satırlarının ne kadarının en az bir kez çalıştığını söyler. Düşük kapsama işe yarar bir uyarıdır: orada hiç test yoktur.
Ama yüksek kapsama bir güvence değildir. Fonksiyonu çağıran ve hiçbir sonucu kontrol etmeyen bir test de her satırı çalıştırır.
Kafam karıştı, daha basit anlat
Kapsama “bu satır çalıştı” der, “doğru çalıştı” demez.
Satır kapsaması (code coverage) neyi ölçer?
Hiçbir şeyi kontrol etmeyen ama her satırı çağıran testlerin kapsaması nedir?
Bilerek hata koymak
Testler 500 TL için ücretin 5 TL, 20.000 TL için 20 TL olduğunu kontrol ediyor. Biri koddaki >= 10_000 koşulunu > 10_000 yaptı. Testler ne der? Cevabı göster
Yeşil kalırlar. 500 TL ve 20.000 TL için sonuç değişmedi. Fark yalnızca tam 10.000 TL’de ortaya çıkar ve o değer hiç denenmedi.
Adım adım oku
- Denetçi her odaya girdi: yüzde yüz gezildi.
- Ama hiçbir alarmı denemedi.
- Her odada bilerek biraz duman çıkar.
- Gezmek değil, alarmın çalması önemli.
mutasyon testiKodu kasten bozup testlerin fark edip etmediğini ölçer. Coverage'ın cevaplayamadığı asıl soruyu sorar: bu testler gerçekten bir şey koruyor mu?Sözlükte gör → tam bunu yapar: kodda küçük bir değişiklik yapar, testleri çalıştırır ve kırmızı olan bir test var mı diye bakar. Her değişiklik bir koşulu çevirmek, bir sayıyı değiştirmek ya da bir satırı silmek olabilir.
Hiçbir testin fark etmediği değişikliğe yaşayan mutantKodda yapılan küçük bir değişikliğe rağmen hiçbir testin kırmızıya dönmemesi. O davranışı kontrol eden test eksiktir.Sözlükte gör → denir. Her biri, o davranışı kontrol eden bir testin eksik olduğunu gösterir.
Kafam karıştı, daha basit anlat
Kodu bilerek boz, testler fark ediyor mu bak. Fark etmiyorsa orada bir test eksik.
Mutasyon testi nasıl çalışır?
Bir mutant 'yaşadı' (survived) ne demektir?
Kendin gör
Havale ücreti fonksiyonu ve dört küçük değişiklik
Tohum 749379Satır kapsaması: %100
- >= 10_000 yerine > 10_000
- return 5 yerine return 0
- amount <= 0 kontrolü silindi
- 0.001 yerine 0.01
Yakalanan değişiklik: 0/4
Şu an ne oldu?
Çağırır ama hiçbir şeyi kontrol etmez · kapsama %100
Araç kodda küçük bir değişiklik yapıp testleri çalıştırıyor.
Görevler0/3
Kapsama %100 olsun, hiçbir değişiklik yakalanmasınaçık
İpucu
Kontrol etmeyen testler.
Sınır değişikliği fark edilmeden geçsinaçık
İpucu
Yalnızca normal tutarlar.
Dört değişikliğin dördü de yakalansınaçık
İpucu
Sınır ve hatalı girdi.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Testler hiçbir şeyi kontrol etmiyor: kapsama yüzde yüz, dört değişikliğin hiçbiri yakalanmadı.
- “Yalnızca normal tutarlar” seç. Kapsama yüzde seksene düştü, ama iki değişiklik yakalandı. Sınır ve hatalı girdi yine geçti.
- “Sınır ve hatalı girdi de” seç. Dördü de yakalandı.
>= 10000 koşulu > 10000 yapıldığında testler yeşil kaldı. Eksik test hangisidir?
Kapsamanın düşük olduğu bir yer neyi kesin söyler?
Tuzaklar
Kapsamayı hedef yapmak. “Kapsama yüzde doksanın altına düşemez” kuralı, hiçbir şey kontrol etmeyen testlere yol açabilir. Kapsamayı test eksikliğini bulmak için kullan, başarı ölçüsü olarak değil.
Her commit’te bütün kodu mutasyona sokmak. Her değişiklik için testler yeniden çalıştığından pahalıdır. Değişen dosyalarla sınırla ya da gece çalıştır.
Eşdeğer mutantlar. Bazı değişiklikler davranışı hiç değiştirmez; hiçbir test onları yakalayamaz. Raporda bunları gözle ele.
Kafam karıştı, daha basit anlat
Kapsamayı hedef yapma, mutasyonu sınırlı çalıştır, davranışı değiştirmeyen değişiklikleri ele.
Kapsama oranı için hedef koymanın riski nedir?
Derinleş · Havale ücreti: sınırı ve hatalı girdiyi test etmek 4 dosya · ~71 satır · ilk okumada atlayabilirsin
Kendini sına
Kapsama oranı yüzde yüzse testler her hatayı yakalar.
Mutasyon testi neden her commit'te bütün kod için çalıştırılmaz?
Aklında kalacak üç şey
- 1 Kapsama oranı satırların çalıştığını ölçer; sonucun kontrol edildiğini ölçmez. Hiçbir şeyi kontrol etmeyen testler de yüzde yüze ulaşabilir.
- 2 Mutasyon testi kodda küçük bir hata yapar ve testleri çalıştırır. Fark edilmeyen her değişiklik, o davranışı kontrol eden bir testin eksik olduğunu söyler.
- 3 Hatalar en çok sınırlarda saklanır: tam sınır değerini ve hatalı girdiyi ayrı test et.
4 kart sonraki derste seni bekliyor