Ne kadar alay etmek “doğru?”


10

Soruyu şaka yollu bir şekilde yazdım çünkü "duruma bağlı" olduğundan eminim ama bazı sorularım var.

Çok derin bağımlılık katmanlarına sahip yazılımlarda çalışan ekibim, her bir kod modülünü altındaki bağımlılıklardan ayırmak için oldukça kapsamlı bir şekilde alay kullanmaya başladı.

Bu nedenle Roy Osherove'un bu videoda sadece% 5 gibi bir şeyle alay etmeniz gerektiğini önerdiğine şaşırdım . Sanırım% 70-90 arasında bir yerde oturuyoruz. Ben de zaman zaman benzer başka rehberler gördüm .

Neye gerçekten farklı isimler verilmesi gerektiği kadar farklı olan iki "entegrasyon testi" kategorisi olarak düşündüğümü tanımlamalıyım: 1) Birden fazla kod modülünü entegre eden proses içi testler ve 2) Konuşan proses dışı testler veritabanları, dosya sistemleri, web hizmetleri, vb.

Okuduğum topluluk rehberliğinin çoğu, çok sayıda yalıtılmış, ince taneli ünite testini ve az sayıda kaba taneli uçtan uca entegrasyon testini tercih etmenizi önerir, çünkü ünite testleri size tam olarak nerede olduğu konusunda kesin geri bildirim sağlar regresyonlar yaratılmış olabilir, ancak kurulumu zor olan kaba testler aslında sistemin uçtan uca işlevselliğini doğrulamaktadır.

Bu göz önüne alındığında, bu ayrı kod birimlerini izole etmek için alaycılığın oldukça sık kullanılması gerekli görünmektedir.

Aşağıdaki gibi bir nesne modeli verilmiştir:

resim açıklamasını buraya girin

... Ayrıca, uygulamamızın bağımlılık derinliğinin bu görüntüye sığabileceğimden çok daha derine ineceğini, böylece 2-4 katmanı ve 5-13 katmanı arasında birden çok N katmanı olduğunu düşünün.

Birim 1'de yapılan basit mantıksal kararları test etmek istersem ve her bağımlılık kod modülüne yapıcıya enjekte edilirse, örneğin 2, 3 ve 4 modül 1'e yapıcı enjekte edilir. görüntü, ben çok 2, 3 ve 4 sahte 1 enjekte ediyorum.

Aksi takdirde, 2, 3 ve 4 numaralı somut örnekler oluşturmam gerekirdi. Bu, bazı ek yazımlardan daha zor olabilir. Genellikle 2, 3 ve 4, tatmin etmek için zor olabilecek yapıcı gereksinimlerine sahip olacak ve grafiğe (ve projemizin gerçekliğine göre), inşaatçılarını tatmin etmek için N'den 13'e kadar somut örnekler oluşturmam gerekecek. 2, 3 ve 4.

Bu durum belirli bir şekilde davranmak için 2, 3 veya 4'e ihtiyacım olduğunda daha zorlaşıyor, böylece # 1'deki basit mantıksal kararı test edebiliyorum. Tüm nesne grafiğini / ağacını bir kerede anlamam ve "zihinsel olarak akıl yürütmem" gerekebilir. MyMockOfModule2.Setup (x => x.GoLeftOrRight ()) yapmak genellikle çok daha kolay görünüyor. İade (yeni Sağ ()); modül 2 sağa gitmesini söylediğinde modül 1'in beklendiği gibi yanıt verdiğini test etmek için.

2 ... N ... 13 somut örneklerini hep birlikte test edersem, test kurulumları çok büyük ve çoğunlukla çoğalırdı. Test başarısızlıkları, regresyon başarısızlıklarının yerlerini belirlemek için çok iyi bir iş yapmayabilir. Testler bağımsız olmazdı ( başka bir destekleyici bağlantı ).

Kabul edilirse, alt katmanın etkileşim tabanlı olmaktan ziyade duruma dayalı test yapılması genellikle mantıklıdır, çünkü bu modüllerin nadiren başka bağımlılıkları vardır. Ancak, en altta yer alan herhangi bir modülü izole etmek için tanım gereği alay etmek neredeyse gerekli görünmektedir.

Tüm bunlar göz önüne alındığında, kimse neyi kaçırdığımı söyleyebilir mi? Ekibimiz alayları gereğinden fazla mı kullanıyor? Ya da, tipik birim test kılavuzunda, çoğu uygulamadaki bağımlılık katmanlarının, tüm entegre kod modüllerinin bir araya getirilmesinin gerçekten makul olacağı kadar makul olacağına dair bir varsayım var mı (bizim durumumuzu "özel" yapıyor)? Ya da belki de farklı bir şekilde, ekibimiz sınırlı bağlamlarımızı yeterince sınırlamıyor mu?


Uygulamanız daha gevşek bağlantıdan faydalanabiliyormuş gibi geliyor. en.wikipedia.org/wiki/Loose_coupling
Robert Harvey

1
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")? <- Bu.
Robert Harvey

Ayrıca dikkat edilmelidir: Regresyon testlerinin (özellikle entegrasyon testi) amacı, yazılımınızın hala çalıştığını kanıtlamaktır, nerede kırıldığını belirlemek zorunda değildir. Sorun giderme ile bunu yapabilir, sorunu düzeltebilir ve daha sonra ek birim testleri ile ilgili kırılmayı kapatabilirsiniz.
Robert Harvey

Modül 1'in sadece I2, I3 ve I4'ten haberdar olduğunu söylemek için orijinal gönderide daha net olmalıydım. Modül 2 yalnızca I5, I6 ve I7'nin farkındadır. Tanımladığım zorluklara yol açacak şekilde 2, 3 ve 4'e 1 beton sunacağım, sadece alay kullanmadan test etmenin şüpheli hedefi. Aksi takdirde, zamanın% 5'inden daha fazla alay kullanarak sarılırız.
ardave

Durumumuzu yanlış bir şekilde "özel" hissettikleri için değerli sözleşmelere meydan okuyan birçok takım hakkında bir blog yazısı okuduktan sonra durumumuzun "özel" olmasından şaka oldum. Ancak bu aslında bizim durumumuzsa, bu, okuduğum bazı topluluk rehberliği ile ekibimin gerçek deneyimleri arasındaki eşitsizliği açıklar. (% 5 vs% 70-90)
13'te

Yanıtlar:


4

Ekibimiz alayları gereğinden fazla mı kullanıyor?

İlk bakışta değil.

1..13 modülleriniz varsa, her birinin kendi birim testleri olmalıdır ve tüm (önemsiz, güvenilmeyen) bağımlılıklar test sürümleriyle değiştirilmelidir. Bu , alay konusu anlamına gelebilir, ancak bazı insanlar adlandırma konusunda bilgiçtir, bu yüzden sahte, şim, boş nesneler ... bazı insanlar tüm test uygulamalarına "alay" demektedir. Bu ne kadar “doğru” olduğu konusundaki karışıklığın kaynağı olabilir.

Şahsen, sadece tüm test nesnelerini "alay" olarak adlandırıyorum çünkü bunların çeşitliliğini ayırt etmek genellikle yararlı değildir. Birim testlerimi hızlı, izole ve esnek tuttukları sürece ... Adlarının ne olduğu umrumda değil.


O zaman ben kod modüllerini tek başına entegre etmek için birden fazla kod modülünün test edilmesine karşı tek başına test etmek en iyisi için orada herhangi bir genel rehberlik olup olmadığını merak ediyorum . Başka türlü izole edebileceğim herhangi bir iki modülü entegre ettiğimde, kendimi bir dizi istenmeyen soruna açıyorum: Regresyonun kesin olarak belirlenememesi / tek bir regresyon için başarısız olan çoklu testler, aşırı test kurulumları, vb. Kendi sezgisel duyum var ("testleri dinle") ama bu beni% 70-90 alay seviyesinde bıraktı.
13'te

1
@nono - Deneyimlerime göre, bahsettiğiniz nedenlerden dolayı her şeyi ayrı ayrı test etmelisiniz . Eğer tek başına birim testi yok tek şey sen şeylerdir edemez bazı dosya sistemi ya da doğrudan başka bir dış kaynak aykırı çünkü ( bir şey sonuçta bunu vardır).
Telastyn

Bunu birkaç gün boyunca çiğnedikten sonra, sizinki mümkün olan en iyi açıklama gibi görünüyor: Eğer biri sahte test çiftinin aksine retrospektif etkileşim / davranış doğrulaması için kullanılan bir test türü olarak "sahte" ifadesinin katı tanımını kullanacaksa veya önceden belirli bir davranışı simüle etmek için yapılandırılmış bir test çift, o zaman evet,% 5 düzeyinde sarma görebiliyordu.
13'te
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.