Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Mutasyon testi, birim testlerimizin kalitesini değerlendirmenin bir yoludur. Mutasyon testi için Stryker.NET aracı kodunuzda mutasyonları otomatik olarak gerçekleştirir, testler çalıştırır ve sonuçları içeren ayrıntılı bir rapor oluşturur.
Örnek test senaryosu
İndirimi dikkate alarak fiyatı hesaplayan bir yöntemine sahip örnek bir Calculate
sınıfını göz önünde bulundurun.
public class PriceCalculator
{
public decimal CalculatePrice(decimal price, decimal discountPercent)
{
if (price <= 0)
{
throw new ArgumentException("Price must be greater than zero.");
}
if (discountPercent < 0 || discountPercent > 100)
{
throw new ArgumentException("Discount percent must be between 0 and 100.");
}
var discount = price * (discountPercent / 100);
var discountedPrice = price - discount;
return Math.Round(discountedPrice, 2);
}
}
Yukarıdaki yöntem aşağıdaki birim testleri kapsamındadır:
[Fact]
public void ApplyDiscountCorrectly()
{
decimal price = 100;
decimal discountPercent = 10;
var calculator = new PriceCalculator();
var result = calculator.CalculatePrice(price, discountPercent);
Assert.Equal(90.00m, result);
}
[Fact]
public void InvalidDiscountPercent_ShouldThrowException()
{
var calculator = new PriceCalculator();
Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(100, -1));
Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(100, 101));
}
[Fact]
public void InvalidPrice_ShouldThrowException()
{
var calculator = new PriceCalculator();
Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(-10, 10));
}
Yukarıdaki kod, biri PriceCalculator
gibi davranan hizmet için diğeri test projesi olan iki projeyi vurgular.
Genel aracı yükleme
İlk olarak Stryker.NETyükleyin. Bunu yapmak için komutunu yürütmeniz gerekir:
dotnet tool install -g dotnet-stryker
stryker
çalıştırmak için, birim testi projesinin bulunduğu dizindeki komut satırından çağırın:
dotnet stryker
Testler çalıştırıldıktan sonra konsolda bir rapor görüntülenir.
Stryker.NET ayrıntılı bir HTML raporunu StrykerOutput dizinine kaydeder.
Şimdi, mutantların ne olduğunu ve 'hayatta kalma' ve 'öldürülme'nin ne demek olduğunu düşünün. Mutant, kodunuzda Stryker'ın bilerek yaptığı küçük bir değişikliktir. Bu basit bir fikirdir: Testleriniz iyiyse, değişikliği yakalamalı ve başarısız olmalıdır. Yine de geçerlerse, testleriniz yeterince güçlü olmayabilir.
Örneğimizde, bir mutant price <= 0
ifadesinin yerini alacak, örneğin, price < 0
ile, birim testleri çalıştırıldıktan sonra.
Stryker çeşitli mutasyon türlerini destekler:
Türü | Açıklama |
---|---|
Eşdeğer | Eşdeğer işleç, bir işleci eşdeğeriyle değiştirmek için kullanılır. Örneğin, x < y x <= y olur. |
Aritmetik | Aritmetik işleci, bir aritmetik işleci eşdeğeriyle değiştirmek için kullanılır. Örneğin, x + y x - y olur. |
Dize | Dize işleci, bir dizeyi eşdeğeriyle değiştirmek için kullanılır. Örneğin, "text" "" olur. |
Mantıklı | Mantıksal işleç, bir mantıksal işleci eşdeğeriyle değiştirmek için kullanılır. Örneğin, x && y x \|\| y olur. |
Ek mutasyon türleri için Stryker.NET: Mutasyonlar belgelerine bakın.
Artımlı geliştirme
Kodunuzu değiştirdikten sonra birim testleri başarıyla geçerse, yeterince sağlam değillerdir ve mutasyon hayatta kalmıştır. Mutasyon testinden sonra beş mutant hayatta kalır.
Sınır değerleri için test verileri ekleyelim ve mutasyon testlerini yeniden çalıştıralım.
[Fact]
public void InvalidPrice_ShouldThrowException()
{
var calculator = new PriceCalculator();
// changed price from -10 to 0
Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(0, 10));
}
[Fact] // Added test for 0 and 100 discount
public void NoExceptionForZeroAnd100Discount()
{
var calculator = new PriceCalculator();
var exceptionWhen0 = Record.Exception(() => calculator.CalculatePrice(100, 0));
var exceptionWhen100 = Record.Exception(() => calculator.CalculatePrice(100, 100));
Assert.Null(exceptionWhen0);
Assert.Null(exceptionWhen100);
}
Gördüğünüz gibi, eşdeğer mutantları düzeltdikten sonra yalnızca dize mutasyonları kaldı ve özel durum iletisinin metnini kontrol ederek kolayca 'öldürebiliyoruz'.
[Fact]
public void InvalidDiscountPercent_ShouldThrowExceptionWithCorrectMessage()
{
var calculator = new PriceCalculator();
var ex1 = Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(100, -1));
Assert.Equal("Discount percent must be between 0 and 100.", ex1.Message);
var ex2 = Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(100, 101));
Assert.Equal("Discount percent must be between 0 and 100.", ex2.Message);
}
[Fact]
public void InvalidPrice_ShouldThrowExceptionWithCorrectMessage()
{
var calculator = new PriceCalculator();
var ex = Assert.Throws<ArgumentException>(() => calculator.CalculatePrice(0, 10));
Assert.Equal("Price must be greater than zero.", ex.Message);
}
Mutasyon testi, testleri daha güvenilir hale getiren fırsatlar bulmaya yardımcı olur. Sizi yalnızca 'mutlu yol' değil, aynı zamanda karmaşık sınır durumlarını da denetlemeye zorlayarak üretimdeki hataların olasılığını azaltır.