Infection ile Mutasyon Testi
Testlerinizin gerçekte ne kadar iyi olduğunu ölçün.
Infection ile Mutasyon Testi, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Kapsama Yanıltır
%100 satır kapsaması güven verici görünür; ancak yalnızca sınamalarınızın kodu çalıştırdığını kanıtlar — kodda bir hatayı yakalayacaklarını değil. Bir sınama bir satırı çalıştırıp anlamlı hiçbir şeyi doğrulamayabilir. Mutasyon sınaması gerçek ölçümü yapar: Kod ince bir biçimde bozulmuş olsaydı sınamalarınız başarısız olur muydu? Infection bunun için standart PHP aracıdır.
composer require --dev infection/infectionTemel Fikir: Mutasyonlar
Infection, kapsanan kodunuzu alıp küçük hatalar — mutasyonlar — ekler. > işaretini >= ile, + işaretini - ile, && işaretini || ile değiştirir, bir return ifadesini kaldırır ve benzeri işlemler yapar. Ardından sınamalarınızı her mutasyona karşı yeniden çalıştırır:
- Bir sınama başarısız olursa → mutasyon etkisizleştirilmiştir (iyidir — sınamalarınız hatayı yakalamıştır).
- Tüm sınamalar başarılı olursa → mutasyon hayatta kalmıştır (kötüdür — buradaki gerçek bir hata fark edilmeyecektir).
İş Başında Hayatta Kalan Bir Mutasyon
Şu işlevi ve zayıf bir sınamayı düşünün. Infection, >= işaretini > olarak değiştirecektir. Hiçbir sınama tam sınır durumunu (miktarın eşiğe eşit olmasını) denetlemiyorsa bu mutasyon hayatta kalır ve sınanmamış bir uç durumu ortaya çıkarır.
<?php
function qualifiesForFreeShipping(float $total): bool
{
return $total >= 50.0; // Infection mutates >= to >
}
// Weak test only checks 100 and 10 -> never tests exactly 50.0
var_dump(qualifiesForFreeShipping(100.0)); // true
var_dump(qualifiesForFreeShipping(10.0)); // false
var_dump(qualifiesForFreeShipping(50.0)); // true <-- the boundary the mutant exposes
Mutasyonu Etkisizleştirme
Sınır doğrulamasını eklediğinizde >=-> mutasyonu etkisizleşir: Değiştirilmiş kodda 50.0 > 50.0 ifadesi false olur ve sınama başarısız olur — tam olarak istediğimiz şey budur. Mutasyon sınaması, hangi doğrulamaların eksik olduğunu doğrudan gösterir.
<?php
use PHPUnit\Framework\TestCase;
final class ShippingTest extends TestCase
{
public function test_threshold_is_inclusive(): void
{
// Kills the >= -> > mutant
self::assertTrue(qualifiesForFreeShipping(50.0));
}
}
Yapılandırma: infection.json
Infection, infection.json5 tarafından yönetilir. Hangi dizinlerin mutasyona uğratılacağını, günlüklerin nereye yazılacağını ve CI'nin başarılı olması için gereken asgari puan eşiklerini bildirirsiniz. source.directories değerini yalnızca üretim kodunuza yöneltin — sınamalarınıza asla yöneltmeyin.
{
"source": {
"directories": ["src"]
},
"logs": {
"text": "build/infection.log",
"html": "build/infection.html"
},
"mutators": {
"@default": true
},
"minMsi": 80,
"minCoveredMsi": 90
}MSI Ölçümleri
Infection, Mutasyon Puanı Göstergesi'ni raporlar:
- MSI = etkisizleştirilen / toplam mutasyon sayısı. Kapsanmayan kod nedeniyle düşer (bu mutasyonlar etkisizleştirilemez).
- Kapsanan MSI = kapsanan satırlardaki mutasyonlardan etkisizleştirilenlerin sayısı / bu mutasyonların toplamı. Sınama yaptığınız yerlerde doğrulamalarınızın ne kadar iyi olduğunu ölçer.
- Mutasyon Kodu Kapsaması = Infection'ın mutasyona uğratabildiği kodun oranı.
Yüksek satır kapsamasıyla birlikte düşük Kapsanan MSI, doğrulaması zayıf sınamaların klasik göstergesidir.
Infection'ı Verimli Çalıştırma
Mutasyon sınaması pahalıdır — her mutasyon için sınama paketini bir kez yeniden çalıştırır. İki büyük hız kazanımı şunlardır: sınamaları --threads ile paralel çalıştırmak ve Git fark filtrelemesiyle yalnızca mevcut dalınızın dokunduğu kodu mutasyona uğratmak; bu, birleştirme isteklerinde CI için idealdir.
vendor/bin/infection --threads=max --git-diff-lines --git-diff-base=origin/mainHayatta Kalanları Okuma
Değer, Infection'ın hayatta kalan her mutasyon için yazdırdığı fark çıktısındadır. Sınamalarınızın algılayamadığı değişikliği ve tam satırı gösterir. Hayatta kalanları yapılacaklar listesi olarak ele alın: ya eksik doğrulamayı ekleyin ya da mutasyonun zararsız olduğunu (eşdeğer bir mutasyon olduğunu) kabul edin.
- return $total >= 50.0;
+ return $total > 50.0;
# Mutant survived: no test asserts the inclusive boundary (total === 50.0)Eşdeğer Mutasyonlar ve Yok Sayma
Bazı mutasyonlar eşdeğerdir — kodu değiştirirler ancak gözlemlenebilir davranışını değiştirmezler; bu nedenle hiçbir sınama onları etkisizleştiremez. Bunlar etkisizleştirilemez ve MSI'yi haksız yere düşürür. Sınamaları bunların peşinden koşacak şekilde değiştirmek yerine, bilinen yanlış pozitif sonuç üreten mutasyon işleçlerini belirli kodlarda bastırın.
{
"mutators": {
"@default": true,
"Plus": {
"ignore": ["App\\Math\\Statistics::variance"]
}
}
}Mutasyon Sınamasının Fayda Sağladığı Yerler
Yavaş olduğu için hedefi iyi seçin:
- Temel alan mantığına — fiyatlandırma, izinler ve hesaplamalar gibi sessiz hataların maliyetli olduğu yerlere — uygulayın.
- Birleştirme isteklerini tüm depo yerine değiştirilmiş satırların Kapsanan MSI değerine göre koşula bağlayın.
- Genel olarak %100'ün peşinden koşmayın; azalan getiriler ve eşdeğer mutasyonlar bunu verimsiz kılar.
- Zayıf doğrulamaları bulmak için kullanın, ardından sınamaları düzeltin — puan araçtır, amaç değil.
Hızlı Olmak İçin Kapsama Verisine İhtiyaç Duyar
Infection yalnızca sınamalarınızın gerçekten kapsadığı satırlarda mutasyon oluşturur; bu nedenle sınama çalıştırıcınızın kapsama verisini yeniden kullanır. Xdebug ile bu işlem yavaştır; pcov, satır kapsaması için çok daha hızlıdır ve mutasyon çalıştırmaları için önerilen sürücüdür. Infection kapsama verisini kendisi de oluşturabilir veya CI içinde daha önce ürettiğiniz bir kapsama raporunu kullanabilir.
# Faster mutation runs: use pcov instead of Xdebug for coverage
php -d pcov.enabled=1 vendor/bin/infection --threads=max
# Or reuse coverage already generated by your PHPUnit step:
vendor/bin/infection --coverage=build/coverage --skip-initial-testsKısa Kontrol
Hayatta kalan bir mutasyon size ne söyler?
Özet
Yalnızca miktarı değil, sınama kalitesini de ölçmeyi öğrendiniz:
- Mutasyon sınaması küçük hatalar (mutasyonlar) ekler; etkisizleştirilenler yakalanmış, hayatta kalanlar ise bir boşluk olduğunu gösterir.
- Kapsama çalıştırmayı gösterir; Kapsanan MSI ise doğrulamaların gücünü gösterir.
infection.json5ile MSI eşiklerini yapılandırın; hız için--threadsve Git fark filtrelemesiyle çalıştırın.- Hayatta kalanlar yapılacaklar listesidir; eşdeğer mutasyonlara dikkat edin ve bunları bilinçli olarak yok sayın.
- Temel mantığı hedefleyin ve birleştirme isteklerini genel olarak %100'ün peşinden koşmak yerine değiştirilmiş satırların MSI değerine göre koşula bağlayın.
Sıkça Sorulan Sorular
“Infection ile Mutasyon Testi” dersi ücretsiz mi?
Evet — “Infection ile Mutasyon Testi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Infection ile Mutasyon Testi” dersinde ne öğreneceğim?
Testlerinizin gerçekte ne kadar iyi olduğunu ölçün. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Infection ile Mutasyon Testi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Test Odaklı Geliştirme İş Akışı
- Mockery ile Taklit ve Sahte Nesne Kullanımı
- Entegrasyon ve İşlevsel Test
- Infection ile Mutasyon Testi