“Nedir ve Neden Önemlidir: Mutasyon Testi (Mutation testing)”

Hüseyin ALKAN
FLO Teknoloji
Published in
3 min readSep 24, 2023

Mutasyon testi, aslında yazdığımız unit testlerin toleransını ve güvenilirliğini artırmak amacıyla kullanıyoruz. Mutasyon testi, kodun kalitesini değerlendirmek ve hataları tespit etmek için kullanılan bir tekniktir. Temel amacı, yazılımın test edilmesi sırasında yapılan hataları ve eksiklikleri tespit etmektir.

Mutasyon testleri, yazılım geliştirme sürecinin bir parçası olarak kullanılır ve yazılımın daha güvenilir ve hata toleranslı hale gelmesine yardımcı olur. Bu testler, kodun hatalarını tespit etmek ve gidermek için güçlü bir araçtır, çünkü kodunuzun farklı senaryolarda nasıl davrandığını test etmenizi sağlar. Mutasyon testleri, kod kalitesini artırmak, güvenilirliği sağlamak ve hataları erken aşamalarda tespit etmek için önemli bir rol oynar.

**Hata Tespiti**

Mutasyon testinin temel prensibi, kodunuzdaki hataları tespit etmektir. Örneğin, aşağıdaki PHP kodunu düşünün:

// calculator.php

public function toplama($a, $b) {
return $a + $b;
}

Bu kod toplama işlemi yapması gerektiğini iddia ediyor, ancak aslında çıkarma işlemi yapıyor. Mutasyon testi, bu tür hataları tespit etmek için kullanılır. Önce bu kodu test ederiz:

// calculator_test.php

require 'calculator.php';

// Test 1: Toplama işlemini doğrula
$result = toplama(5, 3);
$this->assertEquals(8, $result);

Bu test, toplama işleminin 5 ve 3 için doğru sonuç vermesini bekler.

Şimdi, PHP mutasyon testini kullanarak bu testi nasıl uygulayabileceğimize bakalım. Bir mutasyon operatörü kullanarak kodu değiştirip testin başarısız olmasını sağlayabiliriz. Örneğin, “+” işaretini “-” ile değiştirelim:

// calculator_mutated.php

public function toplama($a, $b) {
return $a - $b; // Değişiklik: + işareti - işareti ile değiştirildi
}

Şimdi bu değiştirilmiş kod üzerinde testi çalıştırırsak, test başarısız olacaktır:

// calculator_mutated.php

require 'calculator.php';

// Test 1: Toplama işlemini doğrula
$result = toplama(5, 3);
$this->assertEquals(8, $result);
// Bu test şimdi başarısız olacaktır.

Bu örnek, mutasyon testlerinin gerçek dünya projelerinde nasıl kullanılabileceğini göstermektedir. Mutasyon testleri, kodunuzun hatalarını tespit etmek için farklı mutasyon operatörlerini kullanır ve başarılı olan testlerin başarısız olmasını sağlar. Bu sayede kodunuzun güvenilirliğini artırabilir ve potansiyel hataları erken aşamalarda yakalayabilirsiniz.

**Mutasyon Operatörleri**

Mutasyon testi, mutasyon operatörleri olarak adlandırılan özel değişiklikler kullanır. Bu operatörler, kodunuzu değiştirerek küçük hatalar oluşturur. Örneğin:

- Mutasyon operatörü, “+” işaretini “-” ile değiştirebilir.
- Mutasyon operatörü, “<” işaretini “>” ile değiştirebilir.
- Mutasyon operatörü, “!=” işaretini “==” ile değiştirebilir.

Bu operatörler, kodunuzun farklı yollarla bozulmasını simüle eder. Ardından, mutasyon testi bu değişiklikleri algılayarak kodunuzun güvenilirliğini test eder.

**Başarılı Testlerin Başarısızlığı**

Mutasyon testi, başarılı olan testlerin başarısız olmasını hedefler. Örneğin, başlangıçta bir toplama işlemi için yazılmış bir testiniz varsa ve kod yanlışlıkla çıkarma işlemi yapıyorsa, mutasyon testi bu hatayı tespit etmelidir. Başarılı bir test, değiştirilmiş kodun beklenen sonucu vermeyeceğini göstermelidir.

Yukarıdaki örneklerlerden de anlaşılacağı gibi mutasyon testinin temel prensiplerini ve mantığını testlerimizin ne kadar dogru ve kapsamlı oldugunu ölçmek diyebiliriz. Mutasyon testi, yazılımcıların kodlarının güvenilirliğini artırmalarına ve hataları daha erken aşamalarda tespit etmelerine yardımcı olan güçlü bir araçtır.

Peki hangi kod bloklarının mutasyon testine tabi tutmalıyız.

Kritik ve Karmaşık Kod Blokları:

  • Öncelikle, yazılımınızın kritik ve karmaşık kod bloklarını tanımlayın. Bu, iş mantığınızın anahtar bileşenlerini ve kritik işlemleri içeren kod parçalarını içerebilir.

Hata Geçmişi:

  • Daha önce hataların sık sık bulunduğu veya sık sık değişiklik yapılan kod bloklarına odaklanın. Bu kod blokları, mutasyon testlerine tabi tutulmaya daha uygun olabilir çünkü hata yapma olasılığı daha yüksektir.

Yüksek Riskli İşlemler:

  • Yazılımınızın işlevselliği için kritik olan ve hataları kabul edilemez hale getiren kod parçalarını tanımlayın. Bu işlemler, genellikle mutasyon testlerine tabi tutulmalıdır.

İstikrarlı Kod Blokları:

  • Eğer bir kod bloğu uzun süre boyunca değişmeden kalmışsa ve istikrarlı bir şekilde çalışıyorsa, mutasyon testine tabi tutma ihtiyacı daha az olabilir. Ancak, kodun bu kadar istikrarlı olup olmadığını dikkatlice değerlendirin.

Sonuç olarak, mutasyon testlerini uygulayacak kod bloklarını seçerken, projenizin özgün gereksinimlerini, risklerini ve kaynaklarını göz önünde bulundurmalısınız. Bu, yazılımınızın güvenilirliğini artırmak için mutasyon testlerini en etkili şekilde kullanmanıza yardımcı olacaktır. Ayrıca, zamanla daha fazla kod bloğunu mutasyon testlerine tabi tutmayı düşünebilir ve bu süreci sürekli olarak iyileştirebilirsiniz.

Mutasyon testleri, kodunuzun hatalarını tespit etmek için farklı mutasyon operatörlerini kullanır ve başarılı olan testlerin başarısız olmasını sağlar. Bu sayede kodunuzun güvenilirliğini artırabilir ve potansiyel hataları erken aşamalarda yakalayabilirsiniz.

https://tsh.io/blog/mutation-testing-php/

--

--