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.

Kaynak kodu indirmek ve testleri çalıştırmak için lütfen giriş yapınız Giriş Yap.

 

No Comments

Sorry, the comment form is closed at this time.