Başarısız ünite testlerinde kontrolün değeri nedir?


13

Birim testlerinin yürütülmesini engellemenin yolları olsa da, başarısız birim testlerinde kontrolün değeri nedir?

Basit bir örnek kullanacağım: Büyük / Küçük Harfe Duyarlılık. Geçerli kod büyük / küçük harfe duyarlıdır. Yönteme geçerli bir girdi "Cat" dir ve bir Animal.Cat enum döndürür. Ancak, yöntemin istenen işlevselliği büyük / küçük harfe duyarlı olmamalıdır. Bu yüzden açıklanan yöntem "kedi" geçirilirse, Animal.Cat yerine Animal.Null gibi bir şey dönebilir ve birim testi başarısız olur. Basit bir kod değişikliğinin bu işi yapmasına rağmen, daha karmaşık bir sorunun düzeltilmesi haftalar alabilir, ancak hatayı bir birim testle tanımlamak daha az karmaşık bir iş olabilir.

Şu anda analiz edilmekte olan uygulama "çalışır" kod 4 yıl vardır. Bununla birlikte, birim testlerle ilgili son tartışmalar kodda kusurlar bulmuştur. Bazıları sadece açık uygulama belgelerine (örn. Büyük / küçük harfe duyarlı veya değil) veya şu anda nasıl çağrıldığına bağlı olarak hatayı yürütmeyen koda ihtiyaç duyar. Ancak, hatanın görülmesine ve geçerli girdiler olmasına neden olacak belirli senaryoları çalıştırarak birim testleri oluşturulabilir.

Birisi kodu düzeltmek için etrafta dolaşana kadar hatayı kullanan birim testlerini kontrol etmenin değeri nedir?

Bir yapının yürütülen testlere göre başarılı olup olmadığını belirlemek için bu birim testi yoksay, öncelik, kategori vb. İle işaretlenmeli mi? Sonunda, kod çözüldüğünde kodun yürütülmesi için birim testi oluşturulmalıdır.

Bir yandan, tanımlanan hataların giderilmediğini gösterir. Öte yandan, günlüklerde görünen ve bir kod check-in işlemi nedeniyle başarısızlıklara karşı başarısızlıklara karşı başarısız olanların arasında ayıklanan yüzlerce başarısız birim testi bulmak zor olabilir.


Bu test kapsamı sayısını artırmanın bir yolu budur.
JeffO

Ünite testini yazmak için zaten çaba sarf ettiyseniz, sorunu düzeltmeye karar verdiğinizde neden yeniden yazmak zorundasınız? Teslim edildiği için, süitte çalıştırılması gerektiği anlamına gelmez. ("Bilinen Sorunlar" için bir kategori oluşturabilir ve bu testleri bir biriktirme listesi / YAPILACAKLAR listesi olarak değerlendirebilirsiniz.)
Caleb

Yanıtlar:


17

Ben kırık unittests aramadı sevmiyorum gereksiz gürültü üretirler çünkü. Her unittest sonra tüm başarısız sorunları (kırmızı) kontrol etmek gerekir. Kırmızı mı, çünkü yeni bir sorun mu var, ya da düzeltmek / yapmak için eski bir açık olması mı? 20'den fazla birim testi varsa bu doğru değildir.

Bunun yerine kullanıyorum

  • [Ignore("Reason")]sonucu sarı yapan özellik veya
  • throw new NotImplementedException()sonucu gri yapar

Not: .net için NUnit kullanıyorum. "Grey" özelliğinin diğer unittest çerçevelerinde olup olmadığından emin değilim.

Bu yüzden birim test sonuçlarının aşağıdaki anlamını seviyorum.

  • yeşil: hepsi bitti
  • gri: yapılması gereken ancak düşük önceliğe sahip planlanmış yeni özellikler
  • sarı: hatalar henüz düzeltilmedi. Yakında düzeltilmelidir
  • kırmızı: yeni böcekler. Derhal düzeltilmelidir

"Kırmızı" hariç her şey kontrol edilebilir.

Soruyu cevaplamak için: "kırmızı-başarısız testisleri" kontrol etmek için değerden daha fazla zarar vardır, ancak "sarı gözardı edilmiş testler" veya "gri-NotImplementedYet-testleri" kontrol etmek yapılacaklar listesi olarak yararlı olabilir.


bu yaklaşımda gördüğüm sorun, göz ardı edilen testlerin muhtemelen hiçbir zaman düzeltilmeyeceğidir. Ayrıca, tüm test kodunu da kaldırabilirsiniz, fark ne olurdu (Burada biraz ukala olduğum)
Lovis

4
will probably never be fixedotomatik testlerde efor harcamak istiyorsanız politik bir karardır. "Yok sayılan testler" ile bunları düzeltme şansınız vardır. "Yoksayılan testleri" atmak "artık yok olana kadar otomatik testlerden vazgeçmek" anlamına gelir.
k3b

8

Bunun endüstri standardı gibi davranmayacağım, ancak kırık testleri, bana veya diğer proje üyelerime kod veya ünite testinin kendisinde hala bir sorun olduğunu hatırlatmanın bir yolu olarak kontrol ediyorum.

Düşünülmesi gereken bir şey, geliştirme politikalarınızın başarısız testlerin ceza gerektirmeden izin verip vermediğidir. Test odaklı geliştirme yapan bir dükkanda çalışan bir arkadaşım var, bu yüzden her zaman başarısız testlerle başlıyorlar ...


5
Ancak derhal başarısız bir sınamayı kontrol etmemelisiniz çünkü derleme sunucunuz bozuk bir sınamayla bir proje oluşturmamalıdır.
CaffGeek

@Chad: Bina ve test, bir otomatik adımın iki ayrı parçasıdır. Bina her şeyin derlenmesini sağlar. Test, yapının sonucunun geçerli olmasını sağlar. Soruya ilişkin yorumum "Derlenmeyen kodu kontrol etmeli miyim?" Bunun yerine, "Başarısız olacağını bildiğim bir testi kontrol etmeli miyim?"
unholysampler

1
Ben sadece dikkate almak için bir nokta ekliyordu, bazı sürekli entegrasyon derleme sunucuları testleri çalıştırın ve başarısız olursa, onlar konuşlandırılmaz. Haklı olarak, derleme başarısız gibi, kod başarısız olur ve bozuk olduğu bilinen bir ürünü konuşlandırmanın bir anlamı yoktur.
CaffGeek

@Chad: Doğru, CI sunucularını tamamen unuttum. Bu kesinlikle dikkate alınması gereken bir nokta olacaktır. "Kırık" testlerle ne demek istediğimizi açıklığa kavuşturmaya değer; sadece basit "kötü" testler mi, yoksa API bir şekilde değiştiği için test başarısız mı?
Tieson T.

Soru daha açık olmalıydı. Test derlenecek, ancak beklenen sonuç başarısız olacaktır.

6

Başarısız ünite testleri, geliştirme ekibine kararlaştırılan spesifikasyonlara uymak için ne yapılması gerektiğine ilişkin görüş sağlar.

Kısacası, başarısız birim testleri ekibe bir "YAPILACAKLAR" listesi verir.

Bu nedenle, başarısız birim testleri hiçbir birim testinden çok daha iyidir. *
Birim testlerinin olmaması geliştirme ekibini karanlıkta bırakır; teknik özellikler manuel olarak tekrar tekrar onaylanmalıdır .

[* Birim testlerinin gerçekten yararlı bir şeyi test etmesi şartıyla.]


2
Yapılacaklar listesini korumanın daha iyi yolları vardır, örneğin beyaz tahta, yapılacaklar listesi uygulaması veya sorun izleme sistemi. Her zaman tam olarak geçmesini bekliyorsanız bir test paketi kullanmak çok daha kolaydır ve görünen herhangi bir test hatası derhal düzeltilecek yeni bir sorundur.
bdsl

6

Birim testlerin amacı, hataları belgelemek için değil, bir sistemin beklenen davranışını ortaya koymaktır. Hataları test etmek için birim testleri kullanırsak, beklenen davranışı öne sürmek için bunların yararlılığı azalır. "Bu test neden başarısız oldu?" "Ah, kırılmayı beklemediğim bir şey bozuldu." Test arızasının beklenip beklenmediği bilinmemektedir.

Eski Kod ile Etkili Çalışma bölüm 13'ün başından bir paragraf :

Otomatik birim testleri çok önemli bir araçtır, ancak en azından doğrudan değil, hata bulma için değildir. Genel olarak, otomatik testler, var olan davranışı yerine getirmek veya korumaya çalışmak istediğimiz bir hedefi belirtmelidir. Doğal gelişim akışında, belirtilen testler koruyan testler haline gelir . Hatalar bulacaksınız, ancak genellikle bir test ilk çalıştırıldığında değil. Beklemediğiniz davranışı değiştirdiğinizde sonraki çalıştırmalarda hata bulursunuz.


3

Ancak yeni bir projedeki hataları tanımlayan kırık olanlar, böyle adlandırılır. Bu şekilde kırılmaları gerektiğini görebilirsiniz ... Sabitlendikçe, yeşile dönecekler ve normal test odasına taşınacaklardı.

NOT: Derleme sunucunuz derlemeyi bozan checkin'leri engelliyorsa, bu projenin derleme sunucusunda oluşturulamayacak şekilde ayarlanması gerekir (bozuk bir derlemeyi tüm testlerin geçmediği bir tane olarak tanımladığınızı varsayarak)


Check-in yapıp yapmama konusunda cevap olmasa da +1 önemli bir argüman var: build server
k3b

Böyle bir testi ayrı bir projeye taşımak yerine işaretlemek için bir özellik kullanmayı tercih ederim.
CodesInChaos

2

Birim testleri, bir işlevin başarı durumlarına ek olarak hata durumlarını da test etmelidir. Bir işlev, hatalı girdiyi açıkça reddetmeli veya hangi girdinin geçerli kabul edildiğini açıklayan belgelere sahip olmalıdır.

Bunlardan hiçbirini yapmayan bir fonksiyonunuz varsa, bu bir hatadır ve var olduğunu kaydetmenin bir yoluna sahip olmalısınız. Bu sorunu gösteren bir birim testi oluşturmak bunu yapmanın bir yoludur. Hata biletinin dosyalanması başka bir seçenektir.

Birim testinin amacı% 100 başarı elde etmemek, amaç koddaki hataları bulmak ve düzeltmektir. Test yapmamak% 100 başarı elde etmenin kolay bir yoludur, ancak bu proje için çok yararlı değildir.


Woah ... "Birim testinin amacı% 100 başarılı olmak değil", hepsinin geçmesine gerek olmadığını mı söylüyorsun !?
CaffGeek

2
@Chad: Önemli olan, başarısız olacağını bildiğiniz testlere sahip olmanın daha iyi olması, ancak testin yapılmaması yerine gerçek bir sorun olduğunu göstermektir, böylece her gece oluşturma / testin sonunda yeşil onay işaretine sahip olabilirsiniz.
Mayıs

8
@ unholysampler, kesinlikle "zorunluluk" kırılma olarak işaretlenmedikçe (farklı bir projede yer alarak) asla kırık testler yapmamışlardır. Aksi takdirde, gürültü haline gelirler ve bir testin ne zaman geçmesi gerektiğini bilmezsiniz. Sürekli Entegrasyonun amacını tamamen
ortadan kaldırır

2
@Chad: Bence bu tanımların anlambilimine giriyor. OP'ye dayanarak, bir hata yapan geçerli bir test oluşturmaktan bahsediyor gibiydi. Bununla birlikte, hata düşük önceliğe sahiptir ve hemen düzeltilmesi muhtemel değildir. Otomatik sürece çok daha katı kısıtlamalar getiren Sürekli Entegrasyonu getiren sizsiniz.
Mayıs

4
@ unholysampler, CI veya CI yok, mesele, testleri çalıştırdığınızda ve bazı Kırmızı ışıkları görmeye alışkın olduğunuzda, buna alışırsınız. Peki, yeşil olan bir şey kırmızıya döndüğünde ... nereden biliyorsun?!? Bu korkunç bir uygulamadır ve testin birçok kuruluşta kabul edilmemesinin nedenlerinden biri.
CaffGeek

1

Her hata için bir hata gönderin ve test sonucuna dikkat edin. Daha sonra eyleminizi bir araya getirip hatayı düzeltirseniz, testiniz geçer ve bunu test sonucundan silebilirsiniz. Sorunları asla görmezden gelmeyin.


-3

TDD'nin bitmemiş bir kod için testlerin uygulanmasıyla nasıl yapıldığını gördüğümde, ilk önce [ExpectedException] özniteliği veya benzeri bir test yazın. Bu, başlangıçta eksik kodun içinde herhangi bir mantık olmayacağı ve içine yeni bir atma yeni Exception () kodu yazacağı için geçmelidir. İstisnalar yanlış olsa da, bu en azından testlerin başlangıçta geçmesini ve check-in için uygun olmasını sağlayacaktır. Yok sayılan bir testi unutabiliriz, ancak kesinlikle eksik kodu toplayabilir veya doldurabiliriz. Bunu yaptığımızda, otomatik olarak bir ekspertiz bekleyen test otomatik olarak başarısız olmaya başlayacak ve düzeltmeniz için sizi uyaracaktır. Bu, ExpectException'dan kurtulmak ve bunun yerine gerçek varsayımlar yapmak için testte hafif bir değişiklik yapılmasını içerebilir. CI, Dev, test ve müşterilerin hepsi mutlu ve bir kazan-kazan durumu?


1
Bu soruya cevap vermiyor. TDD'nin ne olduğunu ve neden beklenen istisnaları test ettiğini sormuyor.
Andy Wiesendanger
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.