Mutasyon Testi Nedir? (Örnek)

⚡ Akıllı Özet

Mutasyon testi, kaynak koduna kasıtlı olarak küçük hatalar ekler ve ardından mevcut test paketini her hatalı sürüme karşı çalıştırarak, bu testlerin değişikliği tespit edecek kadar güçlü olup olmadığını ölçer.

  • 🔘 Tanım: Mutant, kasıtlı bir sözdizimsel değişikliğe uğramış programdır ve onu öldürmek, bir testin bu değişikliği tespit ettiğini kanıtlar.
  • ☑️ Proses: Mutant sürümler oluşturun, test paketini orijinal sürüme ve mutant sürüme karşı çalıştırın, çıktıları karşılaştırın, ardından hataları gözden kaçıran testleri güçlendirin.
  • Operator: OperaGen değişimi, ifade modifikasyonu ve ifade modifikasyonu, üç ana mutant ailesini üretir.
  • 🧪 Gol: Mutasyon skoru, öldürülen mutantların yüzdesidir ve salt kod yürütmesinden ziyade iddia gücünü ölçer.
  • takım: Stryker kapakları JavaSenaryo, TypeScriptC# ve Scala dillerini desteklerken, PIT ise Maven içinde JVM bayt kodunu değiştirir. Gradle oluşturur.
  • ⚠️ Tutar: Her mutant tüm test paketini yeniden çalıştırır, bu nedenle mutasyon testi otomasyon olmadan yavaş, pahalı ve pratik değildir.

Mutasyon Testi

Mutasyon Testi Nedir?

Mutasyon Testi Yazılım testinde, kaynak kodun belirli ifadeleri değiştirilerek veya mutasyona uğratılarak, test senaryolarının kaynak koddaki hataları bulup bulamayacağı kontrol edilir. Mutasyon testinin amacı, test senaryolarının sağlamlık açısından kalitesini güvence altına almak ve mutasyona uğramış kaynak koda karşı başarısız olmalarını sağlamaktır.

Mutant programda yapılan değişiklik, programın genel amacını etkilemeyecek kadar küçük tutulmalıdır. Mutasyon testi, programda kasıtlı olarak bir hata oluşturmayı içerdiği için hata tabanlı test stratejisi olarak da adlandırılır. Bu, bir tür test yöntemidir. Beyaz Box Test yapmak esas olarak şu durumlarda uygulanır: Birim Testi.

Mutasyon Testi, 1971 yılında Richard Lipton tarafından bir öğrenci makalesinde önerilmiş ve 1978 yılında DeMillo, Lipton ve Sayward tarafından "Test Verisi Seçimi Üzerine İpuçları" başlıklı makalede resmileştirilmiştir. O dönemin hesaplama maliyeti nedeniyle ivme kaybetmiş, ancak o zamandan beri gibi diller için yeniden önem kazanmıştır. Java, C#, Python, JavaKomut dosyası ve XML.

Mutasyon Testi nasıl yapılır?

Mutasyon testi veya mutasyon analizi olarak da bilinen işlemin adımları şunlardır:

1 Adım: Programın kaynak koduna, mutant adı verilen birçok sürüm oluşturularak hatalar eklenir. Her mutant tek bir hata içermelidir ve amaç, mutant sürümün başarısız olmasına neden olmaktır; bu da test senaryolarının etkinliğini gösterir.

2 Adım: Test senaryoları hem orijinal programa hem de değiştirilmiş programa uygulanır. Test Durumu yeterli olmalı ve bir programdaki hataları tespit edecek şekilde ayarlanmalıdır.

3 Adım: Orijinal programın ve değiştirilmiş programın sonuçlarını karşılaştırın.

4 Adım: Eğer orijinal program ve mutant program farklı çıktılar üretiyorsa, mutant program test senaryosu tarafından devre dışı bırakılır. Dolayısıyla test senaryosu, orijinal ve mutant program arasındaki değişikliği tespit etmek için yeterlidir.

5 Adım: Eğer orijinal program ve mutant program aynı çıktıyı üretiyorsa, mutant program çalışmaya devam eder. Bu gibi durumlarda, tüm mutantları öldürecek daha etkili test senaryoları oluşturulması gerekir.

Aşağıdaki diyagram tracOrijinal programdan mutant oluşumuna ve nihayetinde öldürülen veya hayatta kalan kararına kadar aynı beş adımı izler.

Mutasyon testi iş akışı, orijinal programı, oluşturulan mutantları, test yürütmesini ve mutantın öldürülüp öldürülmediğine dair sonucu göstermektedir.

Mutant Programlar Nasıl Oluşturulur?

Mutasyon, bir program ifadesinde yapılan tek bir sözdizimsel değişiklikten başka bir şey değildir. Her mutant program, orijinal programdan tam olarak bir mutasyonla farklılık göstermelidir.

Orijinal Program Mutant Programı
Eğer (x>y)
“Merhaba” yazdır
başka
“Merhaba” yazdır
Eğer (x
“Merhaba” yazdır
başka
“Merhaba” yazdır

Yukarıdaki örnekte yalnızca karşılaştırma operatörü değişti, ancak x'in y'den büyük olduğu bir test durumunda artık "Hello" yerine "Hi" yazdırılıyor. Bu örnek, sözdizimsel bir değişikliği göstermektedir.

Bir program ifadesine uygulanan tek bir sözdizimsel değişiklik, tek bir mutantın ortaya çıkmasına neden olur.

Mutant Programında Neler Değiştirilmeli?

Mutant programlar oluşturmak için kullanılabilecek çeşitli teknikler vardır. Aşağıdaki üç aile, araçların birlikte sunduğu mutasyon operatörlerinin çoğunu kapsamaktadır.

Operave yedek operatörler İfade değiştirme operatörleri İfade değiştirme operatörleri
İşlenen değeri başka bir işlenen değerle (x yerine y veya y yerine x) veya sabit bir değerle değiştirin. Bir program ifadesindeki operatörü değiştirin veya yeni bir operatör ekleyin. Programatik ifadeler mutant programlar oluşturmak için değiştirilir.
Örnek:
If(x>y) x ve y değerlerini değiştirin
If(5>y) x'i sabit 5 ile değiştirin
Örnek:
Eğer(x==y)
== yerine >= kullanabiliriz ve mutant programı şu şekilde elde edebiliriz:
If(x>=y) ve ifadeye ++ eklemek
Eğer(x==++y)
Örnek:
if-else ifadesindeki else kısmını silin
Programın nasıl davrandığını kontrol etmek için tüm if-else ifadesini silin.

İşte bazı örnek mutasyon operatörleri:

  • GOTO etiketinin değiştirilmesi
  • İade ekstresinin değiştirilmesi
  • Ekstre silme
  • Tekli operatör ekleme (örneğin – ve ++)
  • Mantıksal konnektörün değiştirilmesi
  • Karşılaştırılabilir dizi adı değiştirme
  • if-else ifadesinden else kısmını kaldırmak
  • Operatör ekleme veya değiştirme
  • Verileri değiştirerek ifade değiştirme
  • Değişkenler için veri değişikliği
  • Programdaki veri türlerinin değiştirilmesi

OperaSınır koşuluna temas eden torklar çoğunlukla hayatta kalır, bu nedenle mutasyon sonuçları sıklıkla boşluklara işaret eder. sınır değer analizi.

Mutasyon Testi Türleri

In Yazılım MühendisliğiMutasyon testi temel olarak üç türe ayrılır: ifade mutasyonu, değer mutasyonu ve karar mutasyonu.

  • İfade Mutasyonu – Bir ifade kesilip, yapıştırılıp veya silinirse, sonuç olarak bazı kod satırları kaldırılabilir.
  • Değer Mutasyonu – Birincil parametrelerin ve sabitlerin değerleri değiştirilir; örneğin, bir döngü sınırı veya bir eşik değeri değiştirilir.
  • Karar Mutasyonu – Kontrol ifadeleri değiştirilir, örneğin flip.ping İlişkisel bir operatör veya bir koşulun olumsuzlanması.

Araçlar, operatörlerini bu üç başlık altında gruplandırır; böylece hayatta kalan bir mutantı üreten aile, test edene hangi tür iddianın eksik olduğunu söyler. Hayatta kalan bir karar mutantı genellikle test edilmemiş bir dalı işaret eder ve bu dal, döngü testi.

Mutasyon Testinin Otomasyonu

Mutasyon testi son derece zaman alıcı ve manuel olarak yürütülmesi karmaşık bir işlemdir, bu nedenle otomasyon araçlarının kullanılması tavsiye edilir; bu araçlar aynı zamanda maliyeti de düşürür. Bir mutasyon aracı, mutantları derler, çalıştırmaları planlar, her başarısız testin hangi mutantı öldürdüğünü kaydeder ve puanı rapor eder.

Kullanılabilir araçların listesi:

  • Stryker — çeşitli sürümleri bulunan açık kaynaklı bir mutasyon test çerçevesi. JavaSenaryo ve TypeScript (StrykerJS), C# ve .NET (Stryker.NET) ve Scala (Stryker4s).
  • PITAyrıca PITest olarak da yazılan, mutasyon testi sistemi Java ve derlenmiş bayt kodunu değiştiren ve Maven'a bağlanan JVM. Gradle yan yana inşa ediyor JUnit.

İkisi de bir derleme adımı olarak çalışır, bu nedenle aynı yerde yer alırlar. sürekli entegrasyon boru hattının geri kalanı gibi otomasyon testi süit.

Mutasyon Puanı

Mutasyon skoru, toplam mutant sayısı içindeki öldürülen mutantların yüzdesi olarak tanımlanır.

Mutasyon Puanı = (Öldürülmüş Mutantlar / Toplam Mutant sayısı) * 100

Formül, çoğu aracın bildirdiği biçimde aşağıda gösterilmiştir.

Mutasyon skoru formülü, öldürülen mutant sayısını toplam mutant sayısına bölüp yüz ile çarparak elde edilir.

Test durumları, puan %100'e ulaştığında mutasyon açısından yeterli olarak tanımlanır. Pratikte payda hariç tutulmalıdır. eşdeğer mutantlar — Söz dizimi değiştirilmiş mutantlar, orijinaliyle tamamen aynı şekilde davranır, bu nedenle hiçbir test onları öldüremez. Bu nedenle araçlar, öldürülen mutantların sayısını öldürülen ve hayatta kalan eşdeğer olmayan mutantların sayısına bölerek rapor eder ve test edicinin eşdeğerleri işaretlemesine izin verir.

Deneysel sonuçlar, mutasyon testinin test senaryolarının yeterliliğini ölçmek için etkili bir yöntem olduğunu göstermiştir. Başlıca dezavantajı, mutantların oluşturulmasının ve her bir test senaryosunun her birine karşı yürütülmesinin maliyetidir.

Mutasyon Testi vs Code Kapsam

Yüksek test kapsamı Bu, güçlü testler olduğunu kanıtlamaz. Satır ve dal kapsamı, hangi ifadelerin çalıştırıldığını kaydeder, sonrasında herhangi bir şeyin doğrulanıp doğrulanmadığını değil; bu nedenle bir metodu çağıran ve hiçbir şey iddia etmeyen bir test yine de kapsanmış sayılır. Mutasyon Testi bu açığı kapatır, çünkü bir mutant yalnızca bir iddia gerçekten başarısız olduğunda ölür.

Görünüş Code kapsama Mutasyon skoru
Neyi ölçer Testlerin hangi satırlarda veya dallarda yürütüldüğü Testlerin tespit ettiği enjeksiyon hataları hangileriydi?
İddialara karşı hassas Hayır — sıfır doğrulama içeren bir test bile kapsamı artırır. Evet — hiçbir iddianın başarısız olmadığı durumlarda mutant hayatta kalır.
Bir koşunun maliyeti Bir adet ölçüm cihazlı test çalışması Hayatta kalan her mutant için bir test çalışması, şimdiye kadar daha yavaş.
Tipik kullanım Her commit'te hızlı bir kontrol Kritik modüller üzerinde daha kapsamlı periyodik kontroller
Hata modu Gerçek bir doğrulama olmaksızın %100 kapsama alanı Asla öldürülemeyen eşdeğer mutantlar

Bu iki ölçüt birbirini tamamlayıcıdır. Kapsama alanı, hiç erişilmeyen kodu belirtir; mutasyon skoru ise erişilen ancak hiç kontrol edilmeyen kodu belirtir. Her ikisi de aynı veriyi besler. kusur yönetimi süreci, aşağıdakiler gibi önlemlerin yanı sıra: kusur yoğunluğu.

Mutasyon Testinin Avantajları

Mutasyon Testinin avantajları şunlardır:

  • Bu, kaynak programın yüksek oranda izlenmesini sağlamak için güçlü bir yaklaşımdır.
  • Bu, başka hiçbir şeyin yapmadığı şekilde, test paketinin kendisini test eder. yazılım test tekniği Doğrudan yapar.
  • Mutasyon testi, yazılım geliştiricisine iyi bir hata tespit düzeyi sağlar.
  • Bu yöntem, kaynak koddaki belirsizlikleri ortaya çıkarır ve sıradan çalıştırmaların asla ulaşamayacağı hataları açığa çıkarma kapasitesine sahiptir.
  • Hayatta kalan mutantlar hakkında işlem yapılabilir: her biri, sistemin fark edemediği belirli bir satırı ve belirli bir değişikliği belirtiyor.
  • Müşteriler bu testler sayesinde daha güvenilir ve istikrarlı bir sisteme sahip olarak fayda sağlıyorlar.

Mutasyon Testinin Dezavantajları

Öte yandan, mutasyon testinin dezavantajları şunlardır:

  • Mutasyon testi son derece maliyetli ve zaman alıcıdır, çünkü çok sayıda mutant programın oluşturulması ve derlenmesi gerekir.
  • Zaman alıcı olduğu için, bu testin otomasyon aracı olmadan yapılamayacağını söylemek doğru olur.
  • Her mutant, orijinal programla aynı sayıda test senaryosuna tabi tutulur; bu nedenle, büyük bir mutant popülasyonunun tüm test paketine karşı çalıştırılması gerekir.
  • Eşdeğer mutantlar hiçbir testle öldürülemez ve onları gerçek hayatta kalanlardan ayırmak genellikle manuel inceleme gerektirir.
  • Bu yöntem kaynak kodunu değiştirdiği için aşağıdaki durumlarda uygulanamaz: Siyah Box Test yapmak.

Mutasyon Testi Ne Zaman Kullanılır?

Yukarıdaki maliyet profili, Mutasyon Testinin nadiren her commit'te tüm kod tabanında çalıştırıldığı anlamına gelir. Tespit edilmeyen bir hatanın maliyetli olduğu ve test edilen kodun hızla değişebilecek kadar küçük olduğu durumlarda kendini amorti eder.

  • Güvenlik açısından kritik veya finansal mantık — Ödeme hesaplaması, vergi kuralları ve yetkilendirme kontrolleri gibi, sessizce verilen yanlış bir cevabın kazadan daha kötü olduğu durumlar.
  • Şüpheli derecede yüksek kapsama alanına sahip süitler — Kapsama oranı %100'e yakın olmasına rağmen kusurların yine de gözden kaçtığı durumlarda.
  • Eski kod yeniden düzenleniyor. — Mutasyon sonuçları, mevcut testlerin bir gerilemeyi tespit edip edemeyeceğini ortaya koyuyor.
  • Kütüphaneler ve paylaşılan bileşenler — yeniden kullanılan bir şeydeki bir hata bileşen Her arayan kişide katlanarak artar.
  • Takımlar antrenman yapıyor. test odaklı geliştirme — Puanlama, önce yazılan testlerin gerçek iş hayatında işe yarayıp yaramadığını kontrol eder.

Genellikle, tek kullanımlık prototipler üzerinde, yetersiz bağlantı noktalarıyla veya dallanma mantığı içermeyen üretilmiş kodlarla ya da yavaş çalışan araçların hakim olduğu test paketleriyle çalışmaya değmez. entegrasyon testleri Zaten tek bir geçiş için saatler süren bir süreç.

Bu nedenle çoğu ekip, çalıştırmayı yalnızca değiştirilen dosyalarla sınırlandırır, önemli modüller için bir eşik belirler ve daha geniş kapsamlı bir yaklaşım benimser. gerileme testi süit geri kalanını taşıyor yazılım testi yaşam döngüsü.

SSS

Eşdeğer bir mutant, sözdizimini değiştiren ancak davranışı değiştirmeyen bir değişikliktir; örneğin, asla ulaşılmayan bir döngü sınırını değiştirmek gibi. Hiçbir test bunu ortadan kaldıramaz, bu nedenle puan güvenilir kabul edilmeden önce işaretlenmeli ve hariç tutulmalıdır.

Evrensel bir sayı yok. Ekipler genellikle ödeme veya güvenlik mantığı gibi kritik modüller için yüksek bir eşik belirlerken, diğer yerlerde daha düşük bir eşik belirlerler. Yüzde peşinde koşmak, yüksek riskli kodlardaki her bir hayatta kalan mutasyonu incelemekten daha az faydalıdır.

Bu teknik iki temel varsayıma dayanmaktadır. Birincisi, programcıların neredeyse doğru kod yazdığını, dolayısıyla gerçek hataların küçük olduğunu söyler. İkincisi ise, küçük hataları yakalayan testlerin, bunlardan türetilen karmaşık hataları da yakaladığını söyler.

Mutasyonları yalnızca mevcut dalda değiştirilen dosyalarla sınırlandırın, kapsama verilerini yeniden kullanarak yalnızca mutasyona uğrayan dosyaları etkileyen testlerin yürütülmesini sağlayın, mutasyonları paralel olarak çalıştırın ve mutlak bir rakam yerine puan düşüşü durumunda derlemeyi başarısız kılın.

Makine öğrenimi modelleri, hangi mutantların hayatta kalma olasılığının yüksek olduğunu tahmin ederek, olası eşdeğer mutantları inceleme için sınıflandırır ve tek tip operatör değişimleri yerine proje geçmişinde görülen hatalara benzeyen mutantlar üretir.

Evet, mekanik kısım için geçerli. Hayatta kalan bir mutant ve test edilen yöntem verildiğinde, Copilot eksik iddiayı veya uç durum testini taslak haline getirir. Bir gözden geçiren kişi yine de beklenen değerin doğru olduğunu ve mevcut davranıştan basitçe kopyalanmadığını onaylamalıdır.

Sonucu denetler. Test odaklı geliştirme, koddan önce testler üretir, ancak bu testlerin yeterince doğrulama sağladığını hiçbir şey garanti etmez. Aynı modüller üzerinde periyodik olarak çalıştırılan bir mutasyon, kırmızı-yeşil döngüsünün yanlış bir cevapta gerçekten başarısız olan testler üretip üretmediğini gösterir.

Hayır. Hata enjeksiyonu çalışma ortamını bozar ve tüy testi Uygulama değerlendirilirken, hatalı girdiler de kullanılır. Mutasyon testi ise kaynak kodu değiştirir ve test paketini değerlendirir, bu nedenle değerlendirilen nesne farklıdır.

Bu yazıyı şu şekilde özetleyin: