Bir test nasıl yapılır, başka bir testin sonuçlarına bağlıdır?


13

Diğer birçok sınıf tarafından kodunuzun her yerinde kullanılan bazı yaygın statik yöntemleri sağlayan bir yardımcı sınıf olduğunu varsayalım .

Şebeke testlerinden herhangi biri geçmezse testlerinin başarısız olması için tesis testlerini tesisin tüketicileri için nasıl tasarlarsınız? Bunu yapabilir misiniz ya da hizmet sınıfı testlerinin tamamının yeşil olup olmadığını kendiniz kontrol etmek zorunda mısınız?

Örneğin, bir mesaj ayrıştırıcı tarafından kullanılan bir mesaj ayırıcı yardımcı programı (ya da onun çıktısı) var. İleti ayrıştırıcısı sınanmadan önce ileti ayırıcısının düzgün çalıştığından emin olmak istiyorum.

Her ikisi için de testler yazdım, ancak bunları birleştirmenin ve bir testin başka bir testin sonucuna bağlı olmasını sağlamanın bir yolu var mı?

Bunun için uygun bir etiket bulamadım ama Visual Studio'nun birim test motorunu kullanıyorum.


1
Yardımcı program başarısız olursa ayrıştırıcının düzgün çalışmadığını anlıyorum. Ancak testlerinizi yaparsanız, yardımcı program testlerinin başarısız olduğunu göreceksiniz. Neden diğer testlerin de başarısız olmasını istiyorsunuz?
Eugen Martynov

1
Bunu daha önce isteyen birini hiç duymadım. Neyi başarmaya çalışıyorsun?
Esben Skov Pedersen


Ayrıştırıcı testleri için veri hazırlamak için bazı yardımcı program işlevlerini kullanıyorum, bu yüzden başka bir şey test etmeden önce yardımcı programın düzgün çalıştığından emin olmak istiyorum.
t3chb0t

3
@ t3chb0t Yardımcı programınızın çalıştığından emin olmak istiyorsanız, yardımcı programınızı doğrulamak için birim testleri yazmanız gerekir. Birim testleri atomik olmalıdır. Sadece tek bir bileşeni test etmelerini istersiniz.
maple_shaft

Yanıtlar:


11

Sisteminizdeki her hatanın tam olarak bir testi attığından emin olmanın bir anlamı yoktur .

Test takımının bir işi vardır: bilinen bir kusur olmadığını doğrulama. Bir kusur varsa, bir testin başarısız olup olmadığı önemli değildir. 10. Test paketinizin başarısız olmasına alışırsanız, programınızın başarısız testleri sayarak ne kadar kötü olduğunu ölçmeye çalışırsanız , regresyon testini doğru şekilde kullanmak. Test paketi, kodu yayınlamadan önce tüm testleri geçmelidir .

Onlar eksik işlevini test eğer testini atladığı için geçerli sebebi ve onlar testine zannediyorsunuz şeyi uygularken daha iyi kullanmak için koymak olabilir o zaman bir aşırı miktarda alır. (Bu, yalnızca test odaklı katı bir geliştirme yapmıyorsanız, ancak sonuçta geçerli bir seçimdir.)

Aksi takdirde, test takımınızı tam olarak neyin yanlış olduğunu söyleyen bir göstergeye dönüştürmeye çalışmayın. Asla kesin olmayacak ve olması gerekmiyor. Sizi aynı hatayı iki kez yapmaktan korumak gerekiyor, hepsi bu.


8

Takımınıza bağlıdır, ancak muhtemelen yapamazsınız (yapmamalısınız)

Bazı Birim sınama çerçeveleri ( örneğin PHPUnit'i alın ), bir düzeyde başarısız olan sınamanın diğer sınamaları gerçekleştirmemesi için sınamaları 'zincirlemenize' izin verir. Ancak, bunun bu durumla ilgili sorununuzu çözeceğinden şüpheliyim.

Garantili test sırası yürütmesine izin verilmemesi, testlerin birbirinden izole edilmesini zorlar ve genellikle iyi bir şey olarak kabul edilir. Testler sadece kendilerini değil, aynı zamanda diğer testlerin üzerinde çalışacağı verileri de sağlarsa ne olacağını hayal edin ...

Bu yardımcı yöntemleri ayrı bir çözüme veya test kategorisine koyabilirsiniz. Test çalıştırıcınızda görsel olarak 'öne çıktıklarından' veya bu kategorinin önce çalıştığından ve bu kategorideki testlerin başarısız olması durumunda başka test yapmadığından emin olun *. Bu testlerden biri başarısız olduğunda, başarısızlık muhtemelen tüm testlerde artacaktır ve testleri kimin çalıştırırsa, ilk önce bu başarısız testleri düzelterek başlamayı bildiğinden emin olmalısınız. Aynı şey Birim Testleri ve Entegrasyon Testleri için de geçerlidir. Unittest başarısız olursa, Entegrasyon testlerinde artar ve her türlü kargaşaya neden olur. Herkes, Birim VE Entegrasyon testleri başarısız olduğunda, Unittestleri kontrol ederek başlayacağınızı bilir ...

* Otomatik bir derleme veya test komut dosyasıyla önce bu kategoriyi çalıştırabilir, sonucu kontrol edebilir ve diğer testleri yalnızca bu ilk test grubu geçerse çalıştırabilirsiniz.


5

Birim testi atomunuzu tutmaya çalışın. Otomatik test kodunun da kod tabanınızın bir parçası olduğunu, ancak kendisinin test altında olmadığını unutmayın, bu yüzden mümkün olduğunca basit ve açık tutun.

Sorunuzu daha doğrudan cevaplamak için, testlerin yürütülme sırasının garantisi yoktur, bu nedenle diğer testleriniz yapılmadan önce faydalı testinizin başarılı olduğunu garanti etmenin bir yolu da yoktur. Bu nedenle, tüm testleriniz için hala tek bir test paketiniz varken istediğinizi elde etmenin garantili bir yolu yoktur.

Yardımcı programları kendi çözümüne taşıyabilir ve mevcut projenizde ortaya çıkan dll'sine bir referans ekleyebilirsiniz.


4

Özet olarak, amaçlanandan başka şeyler yapmak için araçlar / teknikler kullanmak istemezsiniz.

Yapmaya çalıştığınız şey, bir CI (sürekli entegrasyon) uygulamasıyla kolayca çözülebilecek bir endişe gibi geliyor.

Bu şekilde, testlerinizi daha önce önerildiği gibi atomik tutabilirsiniz ve CI'nin testlerinizi doğrulamasına özen gösterin.

Herhangi bir test başarısız olursa, kodunuzun yayınlanmasına izin vermeyecek şekilde ayarlayabilirsiniz.


4

Ben her zaman uygulama seviyesi kodu çerçeve seviyesi kodu farklılaştırmak için alışkanlık var, bu yüzden oldukça sık tarif ettiğiniz sorunla karşılaştı: genellikle herhangi bir uygulama seviyesi kodu test edilmeden önce tüm çerçeve seviyesi kodu test etmek istiyorum . Ayrıca, çerçeve seviyesi kodu içinde bile, diğer tüm çerçeve modülleri tarafından kullanılan bazı temel çerçeve modülleri vardır ve temelde bir şey başarısız olursa, başka bir şeyi test etmenin gerçekten bir anlamı yoktur.

Maalesef, test çerçevelerinin tedarikçileri, kreasyonlarının nasıl kullanılması gerektiği hakkında biraz katı fikirlere sahip olma eğilimindedir ve bu fikirleri oldukça korumalıdır, ancak çerçevelerini kullanan kişiler, sorgulamadan amaçlanan kullanımı kabul etme eğilimindedir. Bu sorunludur, çünkü deney ve yeniliği boğar. Başkalarını bilmiyorum, ama bir şeyi tuhaf bir şekilde yapma özgürlüğüne sahip olmayı ve sonuçların, ilk etapta işlerimi yapıyorum.

Bu yüzden, bence, test bağımlılıkları harika bir şey olurdu ve bunun yerine, testlerin hangi sırayla yürütüleceğini belirleme yeteneği bir sonraki en iyi şey olacaktır.

Test siparişi konusunu ele almanın tek yolu dikkatli bir adlandırmadır, böylece test çerçevelerinin testleri alfabetik sırayla yürütme eğiliminden yararlanmaktır.

Bunun Visual Studio'da nasıl çalıştığını bilmiyorum, çünkü henüz C # ile kapsamlı testler içeren bir şey yapmadım, ancak dünyanın Java tarafında şu şekilde çalışıyor: Bir projenin kaynak klasörü altında genellikle iki alt klasörümüz var, biri "ana", üretim kodunu içerir ve biri "test", test kodunu içerir. "Main" altında, kaynak kodumuzun paket hiyerarşisine tam olarak karşılık gelen bir klasör hiyerarşisi vardır. Java paketleri kabaca C # ad alanlarına karşılık gelir. C #, klasör hiyerarşisini ad alanı hiyerarşisiyle eşleştirmenizi gerektirmez, ancak bunun yapılması önerilir.

Şimdi, insanların Java dünyasında genellikle yaptıkları şey, "test" klasörü altında "ana" klasör altında bulunan klasör hiyerarşisini yansıtmalarıdır , böylece her test test ettiği sınıfla aynı pakette bulunur. Bunun ardındaki mantık, test sınıfının sıklıkla test edilen sınıfın paket-özel üyelerine erişmesi gerektiğidir, bu nedenle test sınıfının test edilen sınıfla aynı pakette olması gerekir. Dünyanın C # tarafında ad alanı-yerel görünürlük diye bir şey yoktur, bu nedenle klasör hiyerarşilerini yansıtmak için bir neden yoktur, ancak C # programcılarının klasörlerini yapılandırırken aynı disiplini az ya da çok takip ettiğini düşünüyorum.

Her durumda, test sınıflarının test edilen sınıfların paket yerel üyelerine erişmesine izin verme fikrini yanlış yönlendirilmiş olarak buluyorum, çünkü uygulamaları değil, arayüzleri test etme eğilimindeyim. Bu nedenle, testlerimin klasör hiyerarşisinin üretim kodumun klasör hiyerarşisini yansıtması gerekmez.

Yani, yaptığım şey, testlerimin klasörlerini (yani paketleri) şu şekilde adlandırmaktır:

t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...

Bu, "SomeSubsystem" için yapılan tüm testlerin "SomeOtherSubsystem" için yapılan tüm testlerden önce yürütüleceğini garanti eder ve bu işlemlerin tümü "AndYetAnotherSubsystem" için yapılan tüm testlerden önce yürütülür ve bu böyle devam eder.

Bir klasör içinde, ayrı ayrı test dosyaları şu şekilde adlandırılır:

T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java

Elbette, modern IDE'lerin sadece birkaç tıklama ve tuş vuruşuyla tüm paketleri (ve tüm alt paketleri ve bunlara referans veren tüm kodu) yeniden adlandırmanıza izin veren güçlü yeniden düzenleme yeteneklerine sahip olmasına büyük ölçüde yardımcı olur.


2
I don't know about everyone else, but I would prefer to have the freedom to try to do something in an odd way, and see for myself whether the results are better or worse++ dostum. Çözümü sevdiğimi bilmiyorum, ama orada sergilediğin tavrı seviyorum.
RubberDuck
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.