Mutasyon testler sayesinde testlerin kalitesini 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.

[su_members message=”Kaynak kodu indirmek ve testleri çalıştırmak için lütfen giriş yapınız %login%.” color=”#85804a” login_text=”Giriş Yap”]

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

[/su_members]

 

No Comments

Post a Comment

Comment
Name
Email
Website