Yapay Zekanız Asla Başarısız Olamayan Testler Yazıyor
Bir yapay zekadan test yazmasını istersiniz. Size on iki tane yeşil (başarılı) test verir. CI süreciniz geçer. Kodu birleştirirsiniz. Üç gün sonra, bir hata canlı ortama (production) ulaşır. Testlere bakarsınız. Geçmişlerdir ama hiçbir şeyi test etmemişlerdir.
Yeşil bir test kanıt değildir. Bir hipotezdir. Yapay zeka, asla başarısız olmayan hipotezler yazar.
Şu fonksiyona bakın:
func Discount(total int) int {
if total > 100 {
return total - 10
}
return total
}
Bir yapay zeka şöyle bir test yazabilir:
func TestDiscount(t *testing.T) {
got := Discount(150)
if got < 0 {
t.Errorf("result should not be negative")
}
}
Bu test yeşildir. Kodu çalıştırır, bu yüzden kapsama (coverage) oranınız iyi görünür. Ancak test sadece sonucun sıfırdan küçük olup olmadığını kontrol eder. İndirim miktarını matematiksel bir hataya dönüştürseniz bile test yeşil kalmaya devam eder. Davranışı kontrol etmez. Sadece ışıkların yanıp yanmadığını kontrol eder.
Bu bir tuzaktır. Kapsama (coverage), dokunduğunuz satırları sayar. Önemli olan doğrulamaları (assertions) saymaz. %90 kapsama raporu, bozuk bir kodu gizleyebilir.
Yapay zeka, yeşil ışığa giden en kısa yolu ister. Zayıf doğrulamalar (soft assertions) ve hiçbir şeyi test etmeyen mock'lar seçer.
Bunu düzeltmek için tek bir kural kullanın: Bir testin nasıl başarısız olacağını bildiğinden emin olun.
Kodunuzu bilerek değiştirin. Eğer test yeşil kalmaya devam ediyorsa, o test işe yaramazdır. Çöpe atın.
Gerçek bir test şuna benzer:
func TestDiscount(t *testing.T) {
if got := Discount(150); got != 140 {
t.Errorf("Discount(150) = %d, want 140", got)
}
}
Mantığı bozarsanız, bu test anında kırmızıya döner. Hata verir.
Bunu her test için elle yapamazsınız. Bunun yerine mutasyon testi (mutation testing) kullanın. Go'daki Gremlins gibi araçlar kodunuza küçük değişiklikler uygular. Testlerinizin bu değişiklikleri yakalayıp yakalamadığını kontrol ederler.
Eğer bir değişiklik bir testi başarısız kılmıyorsa, test setinizde (suite) bir boşluk var demektir.
Bunu yapay zeka kodları için kullanıyorum. Yapay zekanın işini bitirdiğini beyan etmesine izin vermiyorum. Bir kontrol noktası (gate) çalıştırıyorum. Araç kodu mutasyona uğratıyor. Eğer test yeşil kalmaya devam ederse, yapay zeka onu yeniden yazmak zorunda kalıyor. Testin iyi olup olmadığına yapay zeka değil, mutasyon karar veriyor.
Hiçbir yapay zeka testi, başarısız olabileceğini kanıtlamadan kod tabanıma girmez. Başarısız olamayan bir test, hiç test olmamasından daha kötüdür. Eksik bir test barizdir. Sahte bir test ise tehlikelidir.
Yeşil ışıklara güvenmeyi bırakın. Bir test, yalnızca üretebildiği kırmızı kadar değerlidir.
Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57
Optional learning community: https://t.me/GyaanSetuAi
