Mutation Testing
Mutaston Testi Nedir?
Mutasyon Testi, kaynak koddaki belirli ifadeleri değiştirdiğimiz(mutant) ve test senaryolarının hataları bulabildiğini kontrol ettiğimiz bir tür yazılım testidir. Temelde birim testi(unit test) için kullanılan bir beyaz kutu testi türüdür. Mutant programdaki değişiklikler son derece küçük tutulur, bu nedenle programın genel hedefini etkilemez.
Mutasyon testinin amacı, mutant kodunu kaldıracak kadar sağlam olması gereken test vakalarının kalitesini değerlendirmektir. Bu yöntem, programda bir hata oluşturmayı içerdiği için hata tabanlı test stratejisi olarak da adlandırılır.
Mutasyon Testi Nasıl Çalışır?
Mutasyon testi(mutasyon analizi) yürütmek için adımlar şunlardır:
Adım 1: Hatalar, mutantlar adı verilen birçok sürüm oluşturarak programın kaynak koduna sokulur. Her mutant tek bir hata içermelidir ve amaç mutant versiyonunun başarısız olmasına neden olmaktır, bu da test case başarısını gösterir.
Adım 2: Test case orijinal programa ve ayrıca mutant programa uygulanır. Bir programdaki hataları tespit etmek için ayarlanmıştır.
Adım 3: Orijinal ve mutant programın sonuçlarını karşılaştırın.
Adım 4: Orijinal program ve mutant programlar farklı çıktıyı üretirse, mutant test durumu tarafından öldürülür. Bu nedenle test durumu, orijinal ve mutant program arasındaki değişimi tespit etmek için yeterince iyidir.
Adım 5: Orijinal program ve mutant program aynı çıktıyı üretirse, Mutant canlı tutulur. Bu gibi durumlarda, tüm mutantları öldüren daha etkili test case oluşturulmalıdır.
Mutant Program Nasıl Oluşturuluyor?
Öncelikle şunu belirtmeliyiz. Birim testi yazdığımız gibi mutant programı biz yazmıyoruz. Kullanacağımız pitest kendisi mutant programlar üretmektedir.
Ek olarak hangi kodun mutasyona uğradığını ve hangi testlerin çalıştırıldığını sınırlayabilirsiniz (pitest inceleyebilirsiniz.)
Kısa örnek bir kod ile mutant program örneği vermek gerekirse;
Orjinal kodumuz şöyle olsun;
Mutation -> Koşul ifadesini değiştiriyor.
Mutation -> Geçersiz koşul ifadesi veriyor.
Mutation -> return ifadesi değiştiriyor.
Mutation Testing Projemize Nasıl Ekleriz?
Eğer projenizde gradle kullanıyorsanız;
https://gradle-pitest-plugin.solidsoft.info/ adımları inceleyebilirsiniz.
plugins {
id 'info.solidsoft.pitest' version '1.4.6'
}
Bağımlılığını ekliyoruz.
gradle pitest
Komutunu çalıştırdığımızda target/pit-reports/YYYYMMDDHHMM klasörüne dosyalarımızı çıkartacaktır.
Ayrıntılı bilgi için pitest adresini ziyaret edebilirsiniz.
Eğer projenizde maven kullanıyorsanız;
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-parent</artifactId>
<version>1.1.10</version>
<type>pom</type>
</dependency>
Maven pitest bağımlılığını ekliyoruz.
mvn org.pitest:pitest-maven:mutationCoverage
Komutunu çalıştırdığımızda target/pit-reports/YYYYMMDDHHMM klasörüne dosyalarımızı çıkartacaktır.
Ben örnek olması açısından todoapp projeme ekledim.
Sonucunda oluşan klasörler içerisinde index.html ve test classlarının html dosyaları oluşmaktadır.
Örnek olması açısından service.impl klasöründeki index.html’i açıyorum.
Burada benim test coverage %61 iken mutation test ile aslında gerçek test coverage oranımın %38 olduğunu görmüş oluyoruz. )
Detaylı kod analizi için bulunan .java dosyalarına girip 5 maddemizden hangileri nasıl çalışıp/çalışmadığını inceleyebilirsiniz.
Mutation testi SonarQube ile kullanabiliyoruz.
Ayrıntılı bilgi için -> Mutation Testing With SonarQube