İş mantığı değiştiğinde başarısız olursa, Birim testi kırılgan kabul edilir mi?


27

Lütfen aşağıdaki kodu inceleyin; Kadın Cinsiyeti olan birinin teklif için uygun olup olmadığını görmek için test yapar1:

[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
    var personId = Guid.NewGuid();
    var gender = "F";
    var person = new Person(personId, gender);

    var id = Guid.NewGuid();
    var offer1 = new Offer1(id,"Offer1");
    Assert.False(offer1.IsEligible(person));
}

Bu birim testi başarılı. Ancak, gelecekte kadınlara 'Teklif 1' önerildiğinde başarısız olur.

Söylemesi kabul edilebilir mi - çevreleyen iş mantığı 1 teklifini değiştirirse, birim testinin değişmesi gerekir. Bazı durumlarda (bazı teklifler için) iş mantığının aşağıdaki gibi veritabanında değiştirildiğini lütfen unutmayın:

update Offers set Gender='M' where offer=1;

ve bazı durumlarda bu etki alanı modelinde:

if (Gender=Gender.Male)
{
  //do something
}

Ayrıca, bazı durumlarda arkasındaki etki alanı mantığının düzenli olarak değişiklik önerdiğini ve bazı durumlarda da değişiklik yapmadığını lütfen unutmayın.


2
Başka bir açıdan düşünün: Test edilen sistemdeki mantığı değiştirdiğinizde başarısız olmayan testlere sahip olmak ister misiniz?
Fabio,

Yanıtlar:


77

Bu her zamanki gibi kırılgan değildir. Test edilen davranışı etkilemeyen uygulama değişikliklerinden dolayı kırılırsa, bir birim testi kırılgan kabul edilir. İş mantığı kendisi değiştirirse, o zaman bu mantık test edilir sözde kırmak için.

Bununla birlikte, iş mantığı gerçekten sık sık değişiyorsa, beklentileri birim testlerine zorlamak uygun değildir. Bunun yerine, veritabanındaki yapılandırmaların teklifleri beklendiği gibi etkileyip etkilemediğini test edebilirsiniz.

Testin adı Returns False When Given A Person With A Gender Of Femalebir iş kuralını tanımlamıyor. Bir iş kuralı gibi bir şey olurdu Offers Applicable to M should not be applied to persons of gender F.

Dolayısıyla , bir teklif sadece M kişi için geçerli olarak tanımlanırsa, F tipi bir kişi için uygun olarak belirtilmeyeceğini onaylayan bir test yazabilirsiniz . Bu test, belirli tekliflerin yapılandırması değişse bile mantığın çalışmasını sağlayacaktır.


@ JaquesB, o zaman bir birim testi olmazdı? ya da olur mu? Veritabanının dahil edilmesi halinde bir entegrasyon testi olacağına inanıyorum. Bu doğru mu? İş mantığı çok değişirse birim sınamalarını kullanmadığınızı mı söylüyorsunuz?
w0051977

@ w0051977: Testi nasıl yazdığınıza bağlı. Test aslında veritabanındaki bir şeyi değiştirmeyi içeriyorsa, bir entegrasyon testi olur.
JacquesB

3
@ w0051977 daha iyi bir fikir - havuzun, iş kurallarını uygulamaktan sorumlu olan bileşenin bir bağımlılığı olması gerekmez. Depoyu çağıran ve ardından işletme kurallarını çağıran daha üst bir düzenlemeye sahip olun. Şimdi işletme kurallarını ayrı ayrı test edebilirsiniz.
Karınca P

5
@ w0051977 elbette öyle - testler davranışları belirler. Bir bileşenin davranışını yöneten kurallar değişirse, testlerdeki davranış değişikliğini yansıtacak şekilde değişmesi gerekir. Ne olmamalıdır değişikliğine ihtiyaç değişiyor şeyden başka davranışları belirtmek testlerdir. Davranış veritabanı tarafından belirlenirse, o zaman başka bir kodu içeren bir test doğal olarak ilgisizdir ve bu veritabanı mantığı testin kapsamı dışında olmadığı sürece değişmesi gerekmez. Bu kapsam sizin tanımlamanız ve bunun bir birim testi mi yoksa entegrasyon testi mi olduğu anlamını anlamıyor.
Ant P,

3
@ w0051977, bu fikri biraz genişletmek, eğer iş mantığı değişirse veya bir hata giderilirse ve testlerin ayarlanması gerekmiyorsa, testlerin yeterli vakayı kapsamadığının ve genel olarak genişletilmesi gerektiğinin bir işaretidir.
Morgen

14

Özellik, üretim veritabanında (veya test için bir klon) tanımlandığında, bu bir birim testi değildir . Bir birim testi, bir iş birimini kontrol eder ve çalışması için belirli bir dış durum gerektirmez. Bu Offer1, veritabanında tanımlanan ve yalnızca bir erkek teklifi olduğu varsayılmaktadır . Bu dışsal durum. Dolayısıyla bu daha çok bir entegrasyon testi , özellikle bir sistem veya kabul testidir. Kabul testlerinin genellikle yazılmadığını (test çerçevesinde çalıştırılmadığını fakat insanlar tarafından manuel olarak yapıldığını) unutmayın.

Özellik etki alanı modelinde bir ififade ile tanımlandığında , aynı test bir birim testidir. Ve kırılgan olabilir. Ancak asıl sorun, kodun kırılgan olmasıdır. Genel bir kural olarak, kodunuz yerine iş davranışı yapılandırılabilirse kodunuz daha dayanıklı olacaktır. Çünkü küçük bir kodlama hatasını düzeltmek için acele bir dağıtım nadir olmalı. Ancak, önceden bildirilmeksizin değişen bir iş gereksinimi sadece Salı (haftada bir şeyler oluyor).

Testi çalıştırmak için bir birim test çerçevesi kullanıyor olabilirsiniz. Ancak birim test çerçeveleri, çalışan birim testleriyle sınırlı değildir. Entegrasyon testlerini de yapabilirler ve yapabilirler.

Eğer bir birim testi yazma olsaydı, hem yaratacak personve offer1veritabanı durumuna hiçbir güven ile sıfırdan. Gibi bir şey

[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
    var personId = Guid.NewGuid();
    var gender = "F";
    var person = new Person(personId, gender);

    var id = Guid.NewGuid();
    var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
    offer1.markLimitedToGender("M");

    Assert.False(offer1.IsEligible(person));
}

Bunun işletme mantığına bağlı olarak değişmediğini unutmayın. offer1Kadınları reddettiği iddiası değil . Bu yapıyor offer1kadın reddeder teklifin türü.

Veritabanını testin bir parçası olarak oluşturabilir ve yapılandırabilirsiniz. C # 'da NUnit kullanarak veya Java’nın JUnit’inde veritabanını bir Setupyöntemle kurarsınız. Muhtemelen test çerçevenizin benzer bir fikri vardır. Bu yöntemde, veritabanına SQL ile kayıt ekleyebilirsiniz.

Üretim veritabanı için bir test veritabanı yerine kod yazmanız zorsa, uygulamanızdaki test zayıflığı gibi geliyor. Test için, ikame edilmesine izin veren bağımlılık enjeksiyonu gibi bir şey kullanmak daha iyi olacaktır. Daha sonra mevcut iş kurallarından bağımsız testler yazabilirsiniz.

Bunun bir yararı, işletme sahibinin (zorunlu olarak şirket sahibi değil, ürün hiyerarşisindeki bu üründen sorumlu kişi gibi) iş kurallarını doğrudan yapılandırması için genellikle daha kolay olmasıdır. Çünkü bu tür bir teknik çerçeveye sahipseniz, işletme sahibinin teklifi yapılandırmak için bir kullanıcı arayüzü (UI) kullanmasına izin vermek kolaydır. İşletme sahibi, kullanıcı arayüzünde sınırlamayı seçer ve markLimitedToGender("M")aramayı yapar. Sonra teklif veritabanına devam edildiğinde, bunu saklardı. Ancak bunu kullanmak için teklifi saklamanız gerekmez. Böylece testleriniz veritabanında bulunmayan bir teklif yaratabilir ve yapılandırabilir.

Sisteminizde açıklandığı gibi, işletme sahibi, uygun SQL'i yayınlayacak ve testleri güncelleyecek teknik gruba bir istekte bulunmak zorunda kalacaktır. Veya teknik grup kodunuzu ve testlerinizi (veya daha sonra kodları test ederek) düzenlemek zorundadır. Bu oldukça ağır bir yaklaşım gibi görünüyor. Bunu yapabilirsin. Ancak yazılımınız (sadece test değil) yapmak zorunda kalmazsanız daha az kırılgan olacaktır.

TL; DR : Böyle testler yazabilirsiniz, ancak yazılımınızı yazmaktan daha iyi olabilirsiniz, böylece yapmak zorunda kalmazsınız.


Cevabınızdaki bazı küçük detayları iyileştirme özgürlüğüne sahibim. Lütfen niyetini doğru mu anladım kontrol et.
Doktor Brown,

Orijinal gönderide bir veritabanının bulunduğuna dair herhangi bir gösterge yoktur. Bu nedenle, Offer1'in zaten veritabanında olduğunu iddia etmek tuhaf.
Winston Ewert

2
@WinstonEwert: net bir gösterge var, soruyu daha dikkatli okumak zorundasınız. Ben de ilk okumada farkında değildim, ama aslında OP'nin bahsettiği şey bu.
Doktor Brown,

@ mdfst13, Üzgünüm, bunu özledim. Bununla birlikte, OP'nin söylediği şey, koşulların bazen bir veritabanında ve bazen etki alanı modelinde olmasıdır. Cevabınız ilk vaka için mükemmel ve ikinci olarak da aldatıcı bir şekilde. Bu noktayı netleştirmek için cevabınızı düzenlerseniz, aceleci aşağı oy oyumu kaldıracağım.
Winston Ewert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.