Birim testleri yalnızca 'işlevsel' yazılımı kapsamalı mı


9

Biz kullandığınız StructureMap yeni bir yazılım geliştirme projesinde. Ekip üyelerinden biri, temel olarak StructureMap konteyner yapılandırmasını test eden bir birim testi uyguladı . Bunu aşağıdakileri yaparak yapar;

  • Uygulama ad alanımızdaki sınıflar için yapılandırılmış derleme örneği sayısını sayar.
  • Sınıf düzeyinde beklenen örnekleri tanımlar
  • Beklenen örneklerin toplam bulunan örneklerle eşleştiğini iddia eder.
  • Beklenen örneklerin testte tanımlananlarla eşleştiğini iddia eder

Bunun bir örneği;

var repositories = container.GetAllInstances<IEnvironmentRepository>();
Assert.AreEqual(1, repositories .Count());
foundInstances = foundInstances + repositories .Count();

Ayrıca aşağıdaki sınıf için 'birim testlerimiz' bulunmaktadır;

public MyClass(IEnvironmentRepository environmentRepository)
        {

        }

Bu testlerde, IEnvironmentRepository ile alay ediyoruz, bu yüzden canlı sistemde olduğu gibi kaptan enjekte etmeyeceğiz.

Bir meslektaş, "Birim testi yalnızca kendi yapılandırmasını test eder" satırındaki bir yorumla yapı haritası yapılandırmasındaki birim testini yok saydı. Bu testin amacı açıktı ve bence tamamen geçerli. Testi yok sayan adamdan IEnvironmentRepository(test hala yok sayılırken) için yapı haritası yapılandırmasını kaldırmasını ve tam birim test paketini çalıştırmasını istedim, hepsi geçti. Daha sonra uygulamayı çalıştırdık ve kap yapılandırması artık geçersiz olduğundan uygulama sona erdi. Bence bu testin değerini kanıtladı, meslektaşım hala aynı fikirde değildi. Sadece konfigürasyonu test etmememiz gerektiğini belirtti, ancak bunun bir birim testin sorumluluğu içinde olduğunu düşünüyorum.

Yani birkaç soru;

  • Geçerli bir birim testi mi - Konteynırın yapılandırmasını test ediyoruz, yapı haritası çalışmıyor (ama örtüşmeyi görebiliyorum)
  • Değilse, yapılandırmayı test etmeden nasıl doğrulayabilirsiniz? Birisinin gerekli kod satırını yanlışlıkla silmesini ve teslim etmesini nasıl durdurabilirsiniz?
  • Should MyClassbirim test örneğini çözmek IEnvironmentRepositorykaptan ve bu geçiş?

10
Testlerle ilgili 10 anlaşmazlıktan 9'u, çerçevelerin tüm formlarında otomatik testleri desteklemesinden ve insanların belirli bir otomatik testin iyi ve uygun bir birim testi olup olmadığı konusunda semantiğe girmek istemesinden kaynaklanmaktadır . Tanımladığınız test, sesin olması ve otomatikleştirilmesi (ve check-in sırasında çalıştırılması) için çok yararlı olabilecek bir birim-olmayan-test-testi gibi sesleri - sadece bir birim testi olarak adlandırmayın. Testin açıkça ayrılmış kendi özelliğinde / klasöründe yaşayıp yaşamadığını meslektaşınızın gece daha iyi uyup uymayacağını sorun.
Jeroen Mostert

2
Bu da benim görüşüm, muhtemelen yararlı ve kesinlikle bir birim test olmasa da, değer katıyor ve bu kanıtlandı. Onun yanıtı, diğer birim testlerinin bunu almasıydı, ama bence, katı birim testleri olarak yazılmış olsaydı, bağımlılıklarla alay edersiniz ve bu nedenle yapılandırmayı kullanana kadar geçerli olup olmadığını asla bilemezdim.
ChrisBint

4
İş arkadaşınızın yapılandırmayı test etmemesini söylediğinde, dağıtım başına gerçekten değişebilen gerçek yapılandırma test edilemeyeceği / test edilmemesi gerektiği gibi bir anlamı var - kim "kırmızı" yanlış ve "mavi" değil? Test sıkıca bir düzene bağlanır. Ancak kod artefaktlarına bağlı yapılandırma bir istisnadır, çünkü değişmez ve yanlış yapmanın açık yolları vardır. İdeal olarak, derleme zamanında DRY meta verilerinden oluşturulan böyle bir yapılandırmaya sahip olursunuz, ancak bunun mümkün olmadığı durumlarda böyle bir test değer katar. Önlenebilir bir dağıtım hatasından daha iyi.
Jeroen Mostert

2
Açıkladığınız şey bir birimi test etmez, üçüncü taraf bir yazılım parçasının yapılandırmasını test eder. Bu şeyleri test eden testlere sahip olmak fevkalade faydalıdır , ancak bunlar birim testler değil, entegrasyon testleridir ve bağlantı kesme, anlaşmazlığın kökü olabilir.
Phoshi

3
@ChrisBint İyilik nezaket yok, kendime bir sürü konteyner testi yazdım. Çok değerleri var, sadece birim testler değiller. Bu iyi, entegrasyon testleri, birim testlerin yapamayacağı şeyleri yakalamak için son derece değerlidir .
Phoshi

Yanıtlar:


13

Bu, son derece geçerli bir otomatik testtir. Kod tabanınızın iskelet bileşenlerinin sağlamlığını doğruladıkları için onlara "mimari testler" diyorum.

IoC kapsayıcısı uygulamadaki tüm nesne ağaçlarını çözebilir ve oluşturabilir mi? Otomatik Eşleyici, kayıtlı tüm nesneleri arasında başarısızlıkla eşleşebilir mi? Soğan Mimarisindeki merkezi katman harici bir şeye referans vermiyor mu?

Bu testler, bir yapılandırma hatası içeri girdiğinde, tam suçluyu işaret ederek size çok zaman kazandırabilir. İyi çerçeveler, neyin yanlış olduğu hakkında çok kesin hata mesajları verecektir ve eğer şansınız varsa bir çalışma zamanı yığın izinin derinliklerine gömmek yerine testleri (ideal olarak, sürekli) çalıştırır etmez onları alırsınız.

Birim testleri olup olmadıkları ... muhtemelen değil, ama yine de çoğunlukla bellekte çalışıyorlar ve oldukça hızlı çalışıyorlar. Sonra tekrar bilmiyorum, evrensel olarak kabul edilen bir birim test tanımı varmış gibi değil.


İronik bir şekilde, bunu meslektaşımla açıkladım ve hatta doğrulama ile (konteyner örneklerinden birini silin ve uygulamayı çalıştırın) hala hiçbir değer görmüyordu. Herkesin kendi görüşü olduğunu anlıyorum ve benimkileri seslendirdim;) "Mimarlık testi" terimini çok seviyorum, bunu çalacağım!
ChrisBint

6

Böyle bir testin problemi, programın içselliğini bir zorunluluktan ziyade test eder. Program gerektiği gibi çalışsa bile test başarısız olabilir.

Sizin durumunuzda, kap kurulumunu her değiştirdiğinizde, enjekte edilmesi gereken yeni bir bağımlılığınız olabilir, testinizi bozarsınız.

Ayrıca, ekstra bağımlılık gereksinimi eklerseniz, ancak bunu kaba eklemeyi ve konteyner testini değiştirmeyi unutursanız. her şey geçecek, ama programınız çökecek.

Daha iyi bir otomatik test, programı başlatmak ve çöküp çökmediğini görmek olacaktır.

Ünite testlerinden geçse bile entegrasyon veya UI testinde bu tür hataları yakalamanız gerekir.

Bunu söyledikten sonra, konteyner kurulumunun artan karmaşıklığı, kıçta bir acıdır. Belki de bazı 'kötü' testler buna değer.


1

Ünite test kodunu test eder. Bunun dışındaki her şey "diğer" otomatik testtir - buna ne istediğinizi söyleyin. Burada yapılandırmayı test ediyor gibi görünüyorsunuz. Yapılandırma ortama bağlı olarak değişebiliyorsa, birim testine ait değildir. Testin diğer testlerden farklı bir tipte olduğunu belirtmek için bir test özelliği eklemeyi düşünün.


Yapılandırma statiktir, ortam tarafından yönlendirilmez, yapılandırmada bulunan tüm sınıflar tüm ortamlarda aynı şekilde kullanılacaktır. Evet, config olabilir örneklerinin sayısı config örneklerinin sayısını eşleşmesi gerekir ise testin bir parçası. Örneğimin gösterdiği gibi, IEnvironmentRepository öğesini kaldırmak diğer birim testlerinin geçmesine izin verdi. Belirli kap testi 2 Ekte başarısız olurdu; 1 - Olası örnek bildirimlerinin toplam sayısı eşleşmedi ve 2 - IEnvironmentRepository'nin belirli örnek sayısı eşleşmedi.
ChrisBint

1
Kabın doğruluğu kodlayıcı tarafından tanımlanır. Hem test altındaki kodun hem de testin kendisinin her bir modifikasyon için değişmesi gerektiği, alarm zillerinin hemen çalmasını sağlar. DI, kendi başına bir amaç değil, bir amaçtır. Benim görüşüme göre bir bona fide birim testi değil yapı yapısı olmadan DI tarzı kod yazmak mükemmel bir şekilde mümkündür. Konteynerin kanıtlanması gerekir, ancak bunu otomatik testlerle yapmanın etkinliği, burada sağlanan sınırlı bilgilerle biraz tartışmalı görünmektedir.
Robbie Dee

2
Birim testlerinin yapılması 10 dakika sürdü. Dağıtım bir saatten fazla sürebilir.
ChrisBint

1
Birim testinin bir kısmı, yapılandırmada tek bir hattın varlığını özellikle doğrular, bunun nasıl daha izole edilemeyeceğinden emin değildir. Kabul edebileceğim genel sayım.
ChrisBint

1
O zaman onlarda biraz kilometre olabilir - bir yargı gerçekten sizi çağırır. Ancak fiziksel olarak ya da bazı niteliklerle ayrılmalıdır.
Robbie Dee

0

Bağımlılık enjeksiyon kabının sorumluluğu, bir çalışma uygulamasında farklı modülleri yapıştırmaktır .

Uygulamanız için otomatik testler yazarsanız, uygulamanızın tüm boru hattını test edecek, belirli test senaryosunda yer alan tüm modüllerin birbirine yapıştırıldığı "uçtan uca testler" yürüten birkaç "entegrasyon (veya kabul) testiniz olmalıdır. doğru şekilde .

Dolayısıyla, bağımlılık enjeksiyon kabı düzgün yapılandırılmamışsa bu entegrasyon testleri başarısız olur. Bu, kapsayıcı için birim testlerini işe yaramaz hale getirir, çünkü entegrasyon testi kap yapılandırmasında olası hataları göstermelidir.

Entegrasyon testlerinde olası tüm test senaryolarını kapsamak zorunda değilsiniz, her özellik için kullanıcı arayüzünden veritabanına kadar tam bir test senaryosu.

Entegrasyon test senaryoları belirli bir bağımlılığın somutlaştırılmasını kapsamıyorsa, böyle bir tane eklemeniz yeterlidir.

Entegrasyon testleriyle, konfigürasyonları için birim testlerini yeniden yazmadan kapları özgürce değiştirebilirsiniz.


0

IMO, cevaplar:

  1. Geçerli bir birim testi mi - Konteynırın yapılandırmasını test ediyoruz, yapı haritası çalışmıyor (ama örtüşmeyi görebiliyorum)

    • Projeniz için değil, yapı haritası için geçerli birim testi , üniter bir test, belirli bir kodu test eder ve uygulanan mantığı test etmek için gerekirse tüm bağımlılıkları alay eder. Yapılandırma mantığı bu nedenle bu kütüphane, iç StructureMap uygulanmaktadır gerekir iyi test edilmesi ve içermelidir Bahsettiğiniz bunun gibi birim testleri ve daha: böyle testlerde, çalışma zamanında dinamik olarak çeşitli yapılandırmaları alay ve görmek için test yüzlerce içermelidir konteyner gerektiği gibi davranır.
  2. Değilse, yapılandırmayı test etmeden nasıl doğrulayabilirsiniz? Birisinin gerekli kod satırını yanlışlıkla silmesini ve teslim etmesini nasıl durdurabilirsiniz?

    • Yapılandırmayı ihtiyaç duyulan ortamda manuel olarak test edebilir ve ayrıca, ihtiyacınız olan belirli yapılandırmayı test eden (çalışma zamanında bir şeyler yapmanıza gerek yoktur) için bir otomasyon (otomatik test) oluşturabilirsiniz.
  3. MyClass birim testi, konteynerden IEnvironmentRepository örneğini çözmeli ve bunu geçirmeli mi?

    • Hayır, bu mükemmel bir birim testtir, çünkü bağımlılığı alay eder ve MyClass mantığını izole bir şekilde test edersiniz.

-1

UnitTest , birimin ayırmadaki istediğiniz davranışını doğrular .

Bu her türlü ifade eder konfigürasyonda olduğu değil kapsamındaki unittests .

Bununla birlikte, yapılandırmalarınız için otomatik testlere sahip olmalısınız, ancak bunlar UnitTest'ler değildir ...


Nerede Units tanımını bulabilirsiniz?
ChrisBint

Ben biri gibi Roy Osherove içinde unittesting Art Of A Birimi değişime aynı nedeni vardır (üretim-) kodun herhangi bir yığınıdır. Ben dünyam, bu genellikle tek bir sınıftan üç veya beşe kadar değişiyor ...
Timothy Truckle

Bu test edilen üretim kodudur.
ChrisBint

Sadece nitpickers'ların dikkatini dağıtmak istedim , bunun başka bir şekilde çalışmasını beklemiyordum ...; o)
Timothy Truckle
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.