Birim testi Anti-pattern kataloğu


203

anti-patern : gerçek bir paterni basit bir kötü alışkanlıktan, kötü uygulamadan veya kötü fikirden resmen ayırmak için en az iki anahtar unsur bulunmalıdır:

  • Başlangıçta yararlı gibi görünen, ancak sonuçta faydalı sonuçlardan daha kötü sonuçlar doğuran, tekrarlanan bazı eylem, süreç veya yapı paternleri ve
  • Açıkça belgelenmiş, gerçek uygulamada kanıtlanmış ve tekrarlanabilir yeniden düzenlenmiş bir çözüm.

Bir kerede "vahşi doğada" gördüğünüz TDD anti-paternine oy verin.
James Carr tarafından yazılan blog yazısı ve testdrivendevelopment yahoogroup ile ilgili tartışma

'Adsız' bir tane bulduysanız .. onları da gönderin. Anti-desen başına bir gönderi , oyların bir şey için sayılmasını sağlamak için lütfen .

Yaklaştığım ilgi top-n alt kümesini bulmak, böylece yakın gelecekte bir beslenme çantası buluşmasında onları tartışabiliyorum.


Aaron, bunun üzerinde gibi görünüyorsun :) Daha az kaydırma yapabilmemiz için etiket satırlarını veya sloganları yorum olarak eklemek iyi bir fikir olur mu?
Gishu

1
Bu oldukça iyi geliyor .. teşekkürler beyler. 'Em gelmeye devam .. en bilgilendirici SO mesajlarından biri IMHO
Gishu

2
+1 bu konuyu seviyorum !!! Ve bunların çoğu da çok doğru ve yaygın!
Chii

Güzel konu, neden bu topluluk wiki olsa ???
09:33

2
Coz bu bir ankettir - sadece en yaygın anti-desen türü yayınladığınız temsilci hasat etmek istemezsiniz;)
Gishu

Yanıtlar:


70

İkinci Sınıf Vatandaşlar - test kodu, çok sayıda yinelenen kod içeren üretim kodu kadar iyi bir şekilde yeniden düzenlenmez, bu da testleri sürdürmeyi zorlaştırır.


67

Free Ride / Piggyback - James Carr, Tim Ottinger Başka bir / farklı özelliği / işlevselliği
test etmek için yeni bir test senaryosu yöntemi yazmak yerine , yeni bir iddia (ve ilgili eylemleri, yani AAA'dan adımlar) mevcut bir test senaryosunda ilerliyor .


15
Evet, bu benim favorim. Onu her zaman yaparım. Oh ... bekle ... bunun kötü bir şey olduğunu söyledin . :-)
guidoism

1
Bunun bir anti-desen olduğundan emin değilim. Tüm değişmezler trueolası her mutasyona uğrama çağrısından sonra olmalıdır . Bu nedenle, her değişmezin truetest ettiğiniz her mutatör ve giriş verisi kombinasyonundan sonra olduğunu kontrol etmek isteyeceksiniz . Ancak çoğaltmayı azaltmak ve şu anda test hatalarına neden olmayanlar da dahil olmak üzere tüm değişmezleri kontrol ettiğinizden emin olmak istersiniz . Yani hepsini bir doğrulama fonksiyonuna koyuyorsunuz ve bunu her testte kullanıyorsunuz. Kod değişir ve başka bir değişmez eklenir. Elbette bunu da fonksiyona dahil ettiniz. Ama daha özgür bir insan. checkInvariants()
Raedwald

2
@Raedwald - Zaman içinde, test adı artık test ettiği her şeyle eşleşmiyor. Ayrıca iç içe geçmiş testler nedeniyle biraz daralmanız var; bir arıza, arızanın kesin nedenini göstermez. örneğin, bu testin standart bir örneği, tüm Düzenleme adımlarının Opak Süper Kümesi gibi bir şeyi okuyabilir >> Act >> Assert A >> Biraz daha >> >> B B >> biraz daha >> Assert C. Şimdi ideal olarak A ve C kırık, 2 test hatası görmelisiniz. Yukarıdaki testte, sadece bir tane görürsünüz, o zaman A'yı düzeltirsiniz ve bir sonraki çalıştırmada, şimdi C'nin kırık olduğunu söylerdi. şimdi 5-6 farklı testin birlikte kaynaştığını hayal edin ..
Gishu

1
"test adı artık test ettiği her şeyle eşleşmiyor" Yalnızca test başlangıçta mevcut olan post koşulu için adlandırılmışsa. Yöntem adı, ayar durumu ve giriş verilerinin (yöntem bağımsız değişkenleri) birleşimini adlandırırsanız, sorun yoktur.
Raedwald

"başarısızlık, hatanın kesin nedenini göstermez" iddiası başarısızlığı hiçbir zaman hatanın nedenini göstermez . Bu, uygulama ayrıntılarını incelemek gerektirir: bir regresyon başarısızlığı için hata ayıklama, bazı TDD çalışmaları için geliştirme durumu bilginiz.
Raedwald

64

Mutlu Yol

Test, sınırları ve istisnaları test etmeden mutlu yollarda (yani beklenen sonuçlar) kalır.

JUnit Antipatterns


Neden: Abartılı zaman kısıtlamaları veya açık tembellik. Yeniden düzenlenmiş çözüm: Yanlış pozitiflerden kurtulmak için daha fazla test yazmak için biraz zaman ayırın. İkinci nedenin bir kamçıya ihtiyacı var. :)
36'da Spoike

59

Yerel Kahraman

Çalıştırmak için yazıldığı geliştirme ortamına özgü bir şeye bağlı olan bir test durumu. Sonuç, test geliştirme kutularına geçer, ancak birisi başka bir yerde çalıştırmayı denediğinde başarısız olur.

Gizli Bağımlılık

Yerel kahramanla yakından ilişkili olan, test çalıştırılmadan önce mevcut verilerin bir kısmının doldurulmasını gerektiren bir birim testi. Eğer bu veriler doldurulmamışsa, test başarısız olacak ve geliştiriciye ne istediğini ya da nedenini kullanamayacağı verinin nereden geleceğini bulmak için onları bir dönümlük kod kazmaya zorlayacak.


Ne yazık ki, bu dll'lerden sorumlu üç geliştiriciyle kapsamlı bir danışma olmaksızın, makinenizde tek başına durmaksızın, herhangi bir üretim sisteminde sürekli olarak senkronize olmayan nebulous ve çeşitli .ini dosyalarına bağımlı olan eski .dll'lerle çok fazla kez görüldü. İç çekmek.


Bu WOMPC geliştirici kısaltmasının güzel bir örneğidir. "Bilgisayarımda çalışıyor!" (genellikle test cihazlarını arkanızdan uzaklaştırdığı söylenir.)
Joris Timmermans

58

Zincir Çetesi

Belirli bir sırayla çalışması gereken birkaç test, yani bir test sistemin global durumunu (global değişkenler, veritabanındaki veriler) değiştirir ve sonraki testler buna bağlıdır.

Bunu genellikle veritabanı testlerinde görürsünüz. teardown()Testler geri alma yerine , veritabanındaki değişikliklerini yapar. Diğer bir yaygın neden, genel durumdaki değişikliklerin, test başarısız olursa temizlenecek olan try / nihayet bloklarına sarılmamasıdır.


Bu sadece düz pis .. Testleri bağımsız bir kavram olmalıdır tatili. Ama bunu birçok yerde okudum .. sanırım 'popüler TDD' oldukça berbat
Gishu

56

Alay
Bazen alay etmek iyi ve kullanışlı olabilir. Ancak bazen geliştiriciler kendilerini kaybedebilir ve test edilmeyen şeyleri alay etme çabalarında. Bu durumda, bir birim test, test edilen sistemin hiç test edilmediği kadar çok sahte, taslak ve / veya sahte içerir, bunun yerine alaylardan döndürülen veriler test edilir.

Kaynak: James Carr'ın gönderisi.


2
Bunun sebebinin test edilen sınıfınızın çok fazla bağımlılığı olduğuna inanıyorum. Yeniden düzenlenmiş alternatif, izole edilebilen kodu çıkarmaktır.
Aralık'ta Spoike

@Spoike; Gerçekten sınıfın rolüne bağlı katmanlı bir mimarideyseniz; bazı katmanlar diğerlerinden daha fazla bağımlılığa sahip olma eğilimindedir.
krosenvold

Son zamanlarda, saygın bir blogda, sahte bir depodan döndürülecek bir sahte varlık kurulumunun oluşturulmasını gördüm. O NE LAN? Neden ilk etapta sadece gerçek bir varlığı somutlaştırmıyorsunuz? Kendim, ben sadece benim uygulama NotImplementedExceptions atmak alaycı bir arayüz tarafından yandı.
Thomas Eyde

40

Sessiz Alıcı - Kelly?
Bir istisna atılırsa geçen bir test .. gerçekte meydana gelen istisna bile geliştiricinin amaçladığından farklıdır.
Ayrıca Bakınız: Gizli Yakalayıcı

[Test]
[ExpectedException(typeof(Exception))]
public void ItShouldThrowDivideByZeroException()
{
   // some code that throws another exception yet passes the test
}

Bu zor ve tehlikeli (yani her çalıştırıldığında her zaman patlayan kodu test ettiğinizi düşünmenizi sağlar). Bu yüzden hem bir istisna sınıfı hem de mesaj içinde benzersiz bir şey hakkında spesifik olmaya çalışıyorum.
Joshua Cheek

34

Müfettiş
% 100 kod kapsamı elde etmek amacıyla kapsüllemeyi ihlal eden, ancak nesnede neler olup bittiğini çok iyi bilen bir birim testi, refactor için yapılan herhangi bir girişim mevcut testi kıracak ve herhangi bir değişikliğin birime yansıtılmasını gerektirecektir Ölçek.


'üye değişkenlerimi herkese açık hale getirmeden nasıl test ederim ... sadece birim test için?'


2
Neden: Beyaz kutu testine aşırı güven. .NET'te Pex gibi bu tür testleri oluşturmak için araçlar vardır. Yeniden düzenlenmiş çözüm: Bunun yerine davranışı test edin ve sınır değerlerini gerçekten kontrol etmeniz gerekiyorsa, otomatik araçların geri kalanını oluşturmasına izin verin.
Aralık'ta Spoike

1
Moq gelmeden önce, alaylarımı el yazısı lehine alaycı çerçeveleri terk etmek zorunda kaldım. Testlerimi gerçek uygulamaya bağlamak çok kolaydı ve yanındaki yeniden düzenlemeyi imkansız hale getirdi. Farkı söyleyemem, Adedi dışında, bu tür hataları nadiren yaparım.
Thomas Eyde

34

Aşırı Kurulum - James Carr
Teste başlamak için büyük bir kurulum gerektiren bir test. Bazen yüzlerce kod satırı, bir teste hazırlanmak için birkaç nesne kullanılır ve bu da devam eden tüm kurulumun “gürültüsü” nedeniyle neyin test edildiğini gerçekten zorlaştırır. (Src: James Carr'ın gönderisi )


Aşırı test kurulumunun genellikle bir) kötü yapılandırılmış koda veya b) yetersiz alaycılığa işaret ettiğini anlıyorum, doğru mu?
Topher Hunt

Her durum farklı olabilir. Yüksek kuplajdan kaynaklanıyor olabilir. Ancak genellikle senaryodaki her bir ortak çalışanı (sahte beklentileri) belirten bir aşırı şartlandırma durumudur - bu, testi uygulamaya uygular ve onları kırılgan hale getirir. Ortak çalışmaya çağrı test için tesadüfi bir detay ise, testte olmamalıdır. Bu aynı zamanda testin kısa ve okunabilir olmasına yardımcı olur.
Gishu

32

Anal Prob

Görevini yerine getirmek için çılgın, yasadışı veya sağlıksız yollar kullanmak zorunda olan bir test: Java setAccessible (true) kullanarak özel alanları okuma veya korumalı alanlara / yöntemlere erişmek için bir sınıfı genişletme veya sınava erişmek için belirli bir pakete koyma zorunluluğu paket global alanları / yöntemleri.

Bu modeli görürseniz, test altındaki sınıflar çok fazla veri gizleme kullanır.

Bu ve Müfettiş arasındaki fark, test edilen sınıfın test etmeniz gereken şeyleri bile gizlemeye çalışmasıdır. Yani amacınız% 100 test kapsamı elde etmek değil, hiçbir şeyi test edebilmektir. Yalnızca özel alanları, run()argümanları olmayan ve hiç alıcısı olmayan bir yöntemi düşünün . Kuralları ihlal etmeden bunu test etmenin bir yolu yoktur.


Michael Borgwardt'ın yorumu: Bu gerçekten bir test antipatterni değil, test edilen koddaki eksikliklerle uğraşmak pragmatizm. Elbette bu eksikliklerin giderilmesi daha iyidir, ancak 3. taraf kütüphaneler için bu mümkün olmayabilir.

Aaron Digulla: Katılıyorum. Belki de bu giriş bir antipattern için değil, "JUnit HOWTO" wiki için gerçekten daha uygundur. Yorumlar?


Müfettiş ile aynı değil mi?
Gishu

1
Hmm .. Bu çizgi 'test edilen sınıf, test etmeniz gereken şeyleri bile gizlemeye çalışıyor', sınıf ve test arasındaki güç mücadelesini gösterir. Test edilmesi gerekiyorsa .. bir şekilde herkesin
erişimine

2
npellow: Maven2'de bunun için bir eklenti var, değil mi?
Aaron Digulla

1
Bu gerçekten bir test antipatterni değil, test edilen koddaki eksikliklerle uğraşmak pragmatizm. Elbette bu eksiklikleri gidermek daha iyidir, ancak 3. taraf kütüphaneler için bu mümkün olmayabilir.
Michael Borgwardt

1
IDK, bir çeşit yan etkisi olmalı. Yan etkiyi test ederdim. Üçüncü taraf API'yi test etmekle ilgili ne demek istediğinizden emin değilim, kendi kodunuzda test edebileceğiniz doğru bir şekilde kullanıldığını, daha sonra entegrasyon testini üçüncü taraf API'sına karşı test etmeniz gerektiğini iddia ediyorum. Üçüncü taraf kodunun birim testi yapılmaz.
Joshua Cheek

26

İsimsiz Test - Nick Pellow

Hata izleyicide belirli bir hatayı yeniden oluşturmak için eklenen ve yazarı kendi düşünen bir isim garanti etmeyen test. Mevcut olmayan bir testi geliştirmek yerine testForBUG123 adlı yeni bir test oluşturulur.

İki yıl sonra, bu test başarısız olduğunda, öncelikle testin amacını bulmak için hata izleyicinizde BUG-123'ü bulmaya çalışmanız gerekebilir.


7
Çok doğru. Bu "TestMethod" adlı bir test biraz daha yararlı olduğunu
NikolaiDante

8
Bugtracker değişmedikçe ve eski izleyiciyi ve sorun tanımlayıcılarını kaybederseniz ... PROJECT-123 artık bir şey ifade etmiyor ....
Chii

25

Yavaş Poke

Son derece yavaş çalışan bir birim testi. Geliştiriciler onu başlattığında, tuvalete gitmek, sigara içmek veya daha da kötüsü, günün sonunda eve gitmeden önce testi başlatmak için zamanları var. (Src: James Carr'ın gönderisi )

diğer bir deyişle, gerektiği kadar sık ​​çalıştırılmayacak testler


Bazı testler doğası gereği yavaş çalışır. Bunları diğerleri kadar sık ​​çalıştırmamaya karar verirseniz, en azından bir CI sunucusunda mümkün olduğunca sık çalıştıklarından emin olun.
Chris Vest

Bu açık bir soru ama bunu düzeltmenin en genel yolları nelerdir?
Topher Hunt

Bu başlangıçta faydalı görünüyor, değil mi?
Kev

1
@TopherHunt Testler yavaştır çünkü pahalı bağımlılıkları vardır (yani dosya sistemi, veritabanı). İşin püf noktası, sorunu görene kadar bağımlılıkları analiz etmektir, daha sonra bağımlılığı çağrı kaydına doğru iter. Öğrencilerimin bağımlılıklarını gidererek
Joshua Cheek

20

Kelebek

Güncel tarihi içeren bir yapı gibi her zaman değişen verileri içeren bir şeyi test etmeniz gerekir ve sonucu sabit bir değere sabitlemenin bir yolu yoktur. Çirkin kısım, bu değeri hiç umursamamanızdır. Herhangi bir değer katmadan testinizi daha karmaşık hale getirir.

Kanatının yarasası dünyanın diğer tarafında bir kasırgaya neden olabilir. - Edward Lorenz, Kelebek Etkisi


Buradaki anti-desen nedir: Böyle bir test neye benziyor? Bir düzeltme var mı? System.DateTime.NowDaha basit veya daha belirleyici birim testlerine sahip olmanın yanı sıra, bir bağımlılığı hesaba katmak için test altındaki kodun tartışmalı bir avantajı var mı ?
Merlyn Morgan-Graham

1
Java'da örnek toString(), yöntemin üzerine yazılmayan bir nesneyi çağırmak olabilir . Bu size bellek adresine bağlı olan nesnenin kimliğini verecektir. Veya toString()nesnenin birincil anahtarını içerir ve testi her çalıştırdığınızda değişir. Bunu düzeltmenin üç yolu vardır: 1. Test ettiğiniz kodu değiştirin, 2. test sonuçlarının değişken parçalarını kaldırmak için regexp kullanarak veya 3. tahmin edilebilir sonuçlar döndürmelerini sağlamak için sistem hizmetlerinin üzerine yazmak için güçlü araçlar kullanın.
Aaron Digulla

Bu anti-paternin altında yatan neden, test edilen kodun test etmek için ne kadar çaba sarf etmediğiyle ilgilenmemesidir. Yani bir geliştiricinin hevesi kelebeğin başka bir yerde sorunlara neden olan kanadıdır.
Aaron Digulla

19

Titreşen Test (Kaynak: Romilly Cocking)

Belirli zamanlarda değil, nadiren başarısız olan ve genellikle test içindeki yarış koşullarından kaynaklanan bir test. Genellikle JMS gibi eşzamansız bir şeyi test ederken oluşur.

Muhtemelen ' Bekle ve Bak ' anti-desen ve ' Uyuyan ' anti-desen için bir süper set .

Yapı başarısız oldu, ah, sadece tekrar çalıştırın. - Anonim Geliştirici


@Stuart - "Araba Durdu - Şimdi Deneyin!" videosift.com/video/… Bu model "Şimdi Deneyin!" olarak da adlandırılabilir veya yalnızca - "The Flakey Test"
npellow

1
Bir keresinde uygun bir dağıtım sağlayan bir PRGN için bir test yazdım. Bazen rastgele başarısız olur. Git şekil. :-)
Chris Vest

1
Bunun olması iyi bir test olmaz mı? Bir test başarısız olursa, sorunun kaynağını bulmanız gerekir. 9p ile gece yarısı arasında başarısız olan bir test hakkında biriyle savaştım. Rastgele / aralıklı olduğunu söyledi. Sonunda zaman dilimleri ile ilgili bir hata izlendi. Git şekil.
Trenton

@Christian Vest Hansen: tohumlayamadın mı?
Andrew Grimm

@trenton Geliştiricilerin onu görmezden gelmek yerine rahatsız edip edemeyeceklerini test etmek (çoğu zaman geçtikçe kaçabilecekleri) iyi bir testtir.
Sheppard

19

Bekle ve gör

Bazı kurulum kodunu çalıştıran ve ardından test edilen kodun beklendiği gibi çalışıp çalışmadığını 'görebilmesi için belirli bir süre' beklemesi 'gereken bir test. Thread.sleep () veya eşdeğerini kullanan bir testMethod kesinlikle bir "Bekle ve Gör" testidir.

Genellikle, sınama, e-posta, http isteği veya sisteme bir dosya diske yazan sistem dışında bir olay oluşturan kodu test ediyorsa bunu görebilirsiniz.

Böyle bir test aynı zamanda bir Yerel Kahraman olabilir, çünkü daha yavaş bir kutuda veya aşırı yüklenmiş bir CI sunucusunda çalıştırıldığında BAŞARISIZ olacaktır.

Bekle ve Gör anti deseniyle karıştırılmamalıdır Uyuyan .


Hmm .. peki böyle bir şey kullanıyorum. çok iş parçacıklı kodu başka nasıl test edebilirim?
Gishu

@Gishu, gerçekten aynı anda çalışan birden çok iş parçacığı testi birim istiyor musunuz? Ben sadece run () yöntemi izole ne yaparsa birim birim test etmeye çalışıyorum. Bunu yapmanın kolay bir yolu, birim testinden start () yerine bloke edecek run () - yöntemini çağırmaktır.
npellow

@Gishu, iş parçacıklarının bir sonraki seviyeye ne zaman geçebileceklerini birbirlerine bildirmelerini sağlamak için CountDownLatches, Semaphores, Koşullar veya benzerlerini kullanır.
Chris Vest

Bir örnek: madcoderspeak.blogspot.com/2008/11/… Demleme düğmesi. Gözlemci aralıklarla yoklıyor ve değişen olayları artırıyor. Bu durumda, yoklama iş parçacıklarının test çıkmadan önce çalışma şansı elde etmesi için bir gecikme ekliyorum.
Gishu

Bence çizgi film bağlantısı kopmuş.
Andrew Grimm

17

Uygunsuz Paylaşılan Armatür - Tim Ottinger
Test armatüründeki birkaç test durumu, kurulum / sökme işlemlerini bile kullanmaz veya buna ihtiyaç duymaz. Kısmen yeni bir test fikstürü oluşturmak için geliştirici ataletinden dolayı ... kazığa bir tane daha test durumu eklemek daha kolay


1
Test edilen sınıfın çok fazla şey yapmaya çalışması da olabilir.
Mike Two

16

Dev

Test edilen nesneyi geçerli bir şekilde test etmesine rağmen, binlerce satıra yayılabilen ve çok sayıda test durumu içerebilen birim test. Bu, test edilen sistemin bir Tanrı Nesnesi (James Carr'ın gönderisi) .

Bunun kesin bir işareti bir kod satırından daha fazlasını kapsayan bir testtir. Genellikle, test o kadar karmaşıktır ki, kendi veya pul pul davranışı olan böcekleri içermeye başlar.


15

Bazı yanıp sönen GUI'leri gördüğümde buna inanacağım
Uygulamanın GUI'si üzerinden 'gerçek bir kullanıcı gibi' test edilmesiyle sağlıksız bir sabitleme / takıntı

İş kurallarını GUI aracılığıyla test etmek korkunç bir bağlantı şeklidir. GUI aracılığıyla binlerce test yazıp GUI'nizi değiştirirseniz, binlerce test kesilir.
Bunun yerine, GUI aracılığıyla yalnızca GUI şeylerini test edin ve bu testleri çalıştırdığınızda GUI'yi gerçek sistem yerine sahte bir sistemle birleştirin. GUI içermeyen bir API aracılığıyla iş kurallarını test edin. - Bob Martin

“Görmenin inanmakta olduğunu anlamalı, aynı zamanda inanmanın görüyor olduğunu da bilmelisin.” - Denis Waitley


1
Yanıp sönen GUI'lerin yanlış olduğunu düşünüyorsanız, GUI'yi başlatan ve devam etmek için kullanıcı etkileşimi gerektiren bir jUnit testi yazan birini gördüm. Test paketinin geri kalanını astı. Test otomasyonu için çok fazla!
Aralık'ta Spoike

Katılmıyorum. GUI'leri test etmek zordur, ancak aynı zamanda bir hata kaynağıdır. Onları test etmemek sadece tembel.
Ray

3
burada mesele GUI'leri test etmemelisiniz, aksine sadece GUI ile test etmemelisiniz. GUI ile 'başsız' test yapabilirsiniz. GUI'yi olabildiğince ince tutun - MVP aroması kullanın - daha sonra hiç test etmekten kurtulabilirsiniz. Eğer ince GUI katmanı her zaman kırpma hatalar bulursanız, testler ile örtün .. ama çoğu zaman, ben çabaya değer bulmuyorum. GUI 'kablolama' hatalarının düzeltilmesi genellikle daha kolaydır ...
Gishu

@Spoike: Kılavuzlu manuel testler kötü değildir ve birim testi olmayan otomatik testleri yürütmek için jUnit (veya başka bir birim test çerçevesi) kullanmaz. Bunları aynı projeye koymamalı ya da birim testleri gibi davranmamalısınız (örneğin sürekli veya her derlemeden sonra çalışmalısınız).
Merlyn Morgan-Graham

1
@ MerlynMorgan-Graham Kabul ediyorum ve GUI'yi test etmemeniz gerektiği anlamına gelmiyordum. Ekip üyelerinin kılavuzlu manuel testleri otomatik testlerle karıştırmanın uygun olduğuna dair inanç beni rahatsız ediyordu. Daha sonra, TDD'ye alışık olmayan herkesi kullanmayı bırakmanın mükemmel bir yolu olduğunu öğrendim. TDD sürecini takip etmek istiyorsanız, fonksiyonel testlerin (uçucu olan) birim testlerle (sabit olması gerekiyordu) karıştırılmasının kötü olduğunu düşünüyorum.
13'te

14

Uyuyan, yani Vezüv Yanardağı - Nick Pellow

Gelecekte belirli bir saat ve tarihte FAIL'a giden bir test. Bunun nedeni, bir Date veya Calendar nesnesi kullanan kodun test edilmesinde hatalı sınırların kontrol edilmesinden kaynaklanır. Bazen, gece yarısı gibi günün belirli bir saatinde çalıştırılırsa test başarısız olabilir.

'Uyuyan', ' Bekle ve Bak ' anti-deseniyle karıştırılmamalıdır.

Bu kod 2000 yılından çok önce değiştirilmiş olacak - 1960 yılında birçok geliştirici


Buna uyuyan bir Yanardağ diyebilirim :) .. ama neden bahsettiğinizi biliyorum .. örneğin bir testin gelecekteki tarihi olarak seçilen tarih, o tarihin şimdiki / son tarihi olacak ... testi kırarak geçer. Bir örnek verebilir misiniz .. sadece bunu göstermek için.
Gishu

@Gishu - +1. Ben de aynı şeyi düşünüyordum ama ikisi arasında karar veremedim. Bunu biraz daha açık hale getirmek için başlığı güncelledim;)
npellow

11

Ölü Ağaç

Bir saplamanın oluşturulduğu, ancak testin aslında yazılmadığı bir test.

Bunu aslında üretim kodumuzda gördüm:

class TD_SomeClass {
  public void testAdd() {
    assertEquals(1+1, 2);
  }
}

Bunun hakkında ne düşüneceğimi bile bilmiyorum.


8
:) - İşlem Uyumluluğu Arka Kapısı olarak da bilinir.
Gishu

1
Son zamanlarda tekrar tekrar yeniden test edilen bir test ve test altındaki yöntemde buna bir örnek verdik. Birkaç tekrardan sonra, test test edilen yönteme çağrı oldu. Ve yöntem artık geçersiz döndüğü için iddia edilecek herhangi bir iddia yoktu. Temel olarak, test sadece yöntemin bir istisna atmadığından emin oluyordu. Gerçekten yararlı veya doğru bir şey yapıp yapmadığı önemli değildi. Kod incelemesinde buldum ve "Peki ... burada ne test ediyoruz?" Diye sordum.
Marvo

11

Bugün bunu biraz bitirdim:

Islak Zemin :
Test, bir yerde kalıcı olan veriler oluşturur, ancak test tamamlandığında temizlenmez. Bu, testlerin (aynı test veya muhtemelen diğer testler) daha sonra başarısız olmasına neden olur test işlemlerinde .

Bizim durumumuzda, test, "temp" dizininde bulunan ve dosyayı ilk kez çalıştıran kullanıcının izinleriyle bir dosya bıraktı. Farklı bir kullanıcı aynı makinede test etmeye çalıştığında: bom. James Carr'ın sitesindeki yorumlarda Joakim Ohlrogge buna "Özensiz İşçi" olarak atıfta bulundu ve "Cömert Artıklar" ın ilham kaynağının bir parçasıydı. Adımı daha iyi seviyorum (daha az hakaret, daha tanıdık).


Islak zeminlerden kaçınmak için junit'in geçici klasör kuralını kullanabilirsiniz.
DaveFar

Bu tür bir Sürekli Entegrasyon anti-deseniyle ilgilidir. CI'de her geliştiricinin kendi çalışma alanı ve kaynakları olmalı ve derleme makinesi de kendi ortamı olmalıdır. O zaman izin sorunları gibi şeylerden kaçınırsınız (ya da belki onları sadece üretimde ortaya çıkmaları için
gizlersiniz

11

Cuckoo - Frank Carver
Diğerleriyle bir test senaryosunda oturan ve test durumundaki diğer testlerle aynı (potansiyel olarak uzun) kurulum sürecine sahip olan, ancak kurulumdan bazı veya tüm parçaları atan bir birim testi ve kendi
Gelişmiş Belirti: Uygunsuz Paylaşılan Fikstür


10

The Secret Catcher - Frank Carver
İddiaların olmaması nedeniyle ilk bakışta test yapmıyor gibi görünen bir test. Ancak "şeytan ayrıntıda gizlidir" .. test gerçekten atılacak bir istisnayı temel alıyor ve test çerçevesinin istisnayı yakalamasını ve hata olarak kullanıcıya raporlamasını bekliyor.

[Test]
public void ShouldNotThrow()
{
   DoSomethingThatShouldNotThrowAnException();
}

2
Bence bu, geçerli bir test, özellikle de bir regresyon testi olabilir.
Ilja Preuß

üzgünüm yine bunu Sessiz yakalayıcı ile karıştırdı ... birim testleri 'bu işe yaramalı' demek yerine neyin test edildiğini açıkça belirtmelidir .. (+1 tp hiçbir şeyden daha iyi. ülke)
Gishu

1
Bu tür testlerde, en azından İstisna yakalarım ve bir değişkene atarım. Sonra null olmadığını iddia ediyorum.
Thomas Eyde

4
Bazı çerçeveler, Assert.DoesNotThrow(SomeDelegateType act)bu gibi durumlarda özel olarak kullanılabilen bir stil iddiasına sahiptir. Ben bir yapıcı null olmayan döndüğünde başarılı, ancak yapıcı attığında başarısız bir test durumda sahip daha az brüt bulabilirsiniz. Bir kurucu asla null değerini döndürmez. (Not: yalnızca bir
kurucunun sıfırdan farklı

10

Çevresel Vandal

Çeşitli 'gereksinimler' için ortam değişkenlerini / bağlantı noktalarını kullanarak ve ayarlayarak ortamına yayılmaya başlayan bir 'birim' testi. Bu testlerden ikisinin aynı anda yapılması 'kullanılamayan bağlantı noktası' istisnalarına vb. Neden olacaktır.

Bu testler aralıklı olacak ve geliştiricileri 'sadece tekrar çalıştır' gibi şeyler söyleyecek.

Gördüğüm bir çözüm, kullanılacak bir bağlantı noktası numarasını rastgele seçmektir. Bu, çatışma olasılığını azaltır, ancak sorunu açıkça çözmez. Bu yüzden eğer yapabiliyorsanız, kodu her zaman taklit edilemeyecek bir kaynak ayırmayacak şekilde alay edin.


@gcrain .. testleri deterministik olmalıdır. IMO daha iyi bir yaklaşım, testten önce ve sonra doğru bir şekilde test etmek ve temizlemek için 'takımda iyi bilinen' bir bağlantı noktası kullanmaktır, böylece her zaman kullanılabilir ...
Gishu

1
@gishu - sorun, bu bağlantı noktalarını kullanarak işlemek için setup () ve teardown () yöntemlerinin bulunmaması değil. sorun, örneğin bir CI sunucusu çalıştırmak ve testin birden çok sürümünü aynı anda çalıştırmak ve aynı sabit test
kodlu

10

Turing Testi

Çok zeki bir veri akışı analizi kullanılarak test edilen sınıftan toplanan birçok, çok sayıda iddia içeren bazı pahalı araçlar tarafından otomatik olarak oluşturulan bir test çantası. Geliştiricileri, kodlarının iyi test edildiğine dair yanlış bir güven duygusuna sokar ve onları yüksek kaliteli testler tasarlama ve sürdürme sorumluluğundan kurtarır. Makine testleri sizin için yazabiliyorsa, neden parmağını dışarı çekip uygulamanın kendisini yazamıyor?

Merhaba aptal. - Dünyanın en akıllı bilgisayarı yeni çıraklara (eski bir Amiga çizgi romanından).


10

Kırk Ayak Direği Testi

Test etmeye çalıştıkları sınıfa çok yaklaşmaktan korkan bu testler, sayısız soyutlama katmanı ve kontrol ettikleri mantıktan binlerce kod satırı ile ayrılmış bir mesafede hareket eder. Bu nedenle, son derece kırılgandırlar ve ilgi sınıfına gidip gelen destansı yolculukta meydana gelen her türlü yan etkiye duyarlıdırlar.


9

Doppelgänger

Bir şeyi test etmek için, test edilen kodun parçalarını aynı ad ve pakete sahip yeni bir sınıfa kopyalamanız ve önce görünür olduğundan emin olmak için sınıf yolu büyüsünü veya özel bir sınıf yükleyiciyi kullanmanız gerekir (böylece kopyanız seçilir) kadar).

Bu kalıp, bir testten kontrol edemediğiniz sağlıksız miktarda gizli bağımlılığı gösterir.

Yüzüne baktım ... yüzüme! Ayna gibiydi ama kanımı dondurdu.


7

Anne Hen - Frank Carver
Gerçek test senaryolarının gerektirdiğinden çok daha fazlasını yapan ortak bir kurulum. Örneğin, testler sadece bir şeyin varlığı ya da yokluğu için öne sürüldüğünde, görünüşte önemli ve benzersiz değerlerle dolu her türlü karmaşık veri yapısının oluşturulması.
Gelişmiş Belirti: Uygunsuz Paylaşılan Fikstür

Ne yaptığını bilmiyorum ... Yine de ekliyorum, her ihtimale karşı. - Anonim Geliştirici


7

Hepsini Test Et

Bunun şimdiye kadar bahsedilmediğine inanamıyorum, ancak testler Tek Sorumluluk İlkesini ihlal etmemelidir .

Bu kadar çok kez karşılaştım, bu kuralı ihlal eden testler tanımı gereği sürdürmek için bir kabus.


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.