Mutasyon testler sayesinde testlerin kalitesi artıyor

Bir soruyla başlamak istiyorum; aşağıdaki yordamın %100 doğru çalışacağından emin olmak için nasıl bir birim test yazardını ?

public boolean yourMethod(int a) { int min = 1; // iyi degil biliyorum int max = 5; // ayni sekilde if ((a >= min) && (a <= max)) { return true; } return false; }

Böyle birim test tatmin edici olur mu ?

@Test public void testYou() { MyClass sut = new MyClass(); assertFalse(sut.yourMethod(0)); assertTrue(sut.yourMethod(3)); }

Fena gözükmüyor sanki peki olaya kod kapsama (code coverage) raporlarına bakarak ilerleyelim, işte o rapor :

%100 kapsama ulaşmak müthiş bir başarı. Konuyu kapatıp huzur içinde yeni planlama (test yaz) — kodla — sonuçları gör ve iyileştir evresine geçebiliriz derken aslında tablonun hiçte bu kadar iyi olmadığını öğreniyoruz. İşte mutasyon testlerinin sonuç raporu :

Nasıl yani deyip birazda daha detay için MyClass.java içerisinde tıkladığınızda karşınıza o gerçek çıkıyor, işte detay raporu :

Bu şimdi ne demek ? Şu demek %100 kod kapsamanın ötesinde eksiklerimiz olduğunu mutasyon test tarafından gösteriliyor. Neden mutasyon testlere ihtiyacımız var ? Kısacası zayıf testlerin üzerinden gelinmesi için mutasyon testlere kesinlikle öneriyorum. Yukarıdaki mutasyon testinin sonucu iyileştirmek için testi aşağıdaki gibi değiştiriyorum :

@Test public void testYou() { MyClass sut = new MyClass(); assertFalse(sut.yourMethod(0)); assertTrue(sut.yourMethod(3)); assertTrue(sut.yourMethod(1)); // alt sinir assertTrue(sut.yourMethod(5)); // ust sinir }

Alt sınır ve üst sınırları da teste dahil ettiğimde mutasyon test raporu olumlu cevap dönüyor, işte yeni sonuçlar :

Bu yaklaşım inanıyorum ki yazılım testlerin kalitesinde müthiş bir kalite artışı getirecektir. Çok kısa bir nokta daha belirtmek istiyorum. Diyelim ki çok basit bir topla() yordamı yazdık :

public int topla(int a, int b) { return a + b ; }

topla() yordamının aşağıdaki birim test içerisindeki gibi test edersek :

@Test public void testTopla() { MyClass sut = new MyClass(); sut.topla(2,5); }

Kod kapsama raporu sizce ne olur ?

Doğru bildiniz %100. Peki testTopla() yordamının içerisinde unuttuğumuz çok önemli birşey yok mu ? Dilerseniz neyi unuttuğumuzu bize mutasyon test mekanizması söylesin :

Hatanın Türkçesi şöyle : “Birim test içerisinde assertEquals yazmayı unuttunuz.” Müthiş ! Düzeltmek için birim testi aşağıdaki gibi düzeltiyorum

@Test public void testTopla() { MyClass sut = new MyClass(); assertEquals(7, sut.topla(2,5)); }

ve işte mutlu son :

Mutasyon testler sayesinde birim testlerin (unit testing) kalitesinin artacağı çok açık. Mutasyon testi için ben bu örneklerde PiTest aracını kullandım ama özellikle Java teknolojileri için başka araçlarda mevcut.

https://github.com/altuga/pit-example

Originally published at kodcu.com.