Her birim testi, diğer testlerden bağımsız olarak çalışabilmeli midir?


24

Bir sınıfın iki yöntemi için testleriniz olduğunu söyleyin. İlk yöntem, verileri başka bir katmandan toplar ve çalışma zamanından (SQL tablosu gibi) bağımsız olarak bir tür depolama alanına koyar, bu nedenle bu test tarafından işlenen tüm veriler teste kodlanır. İkinci yöntem, ilk yöntemin bıraktığı yerden veri almak ve bir şekilde dönüştürmekle sorumludur (hesaplama, belirli parçaları başka bir yere taşımak, vb.).

Şimdi, bu ikinci yöntem birincisi gibi kodlanmış girdilere sahip olabilir ya da iki testin sıralı olarak gerçekleştirileceği ve ilk testin gerçekten ilk test tarafından saklanan verileri alarak bıraktığı yerden seçildiği varsayılabilir.

İkinci seçeneğe geçtiyseniz, iki yöntemin birlikte iyi oynadığı konusunda iyi bir fikre sahip olursunuz, ancak, ilk test başarısız olursa, başarısızlıktan sonraki tüm testler, böcekleri daha hızlı izole etmenize yardımcı olacak test avantajını ortadan kaldırır.

İlk seçeneğe geçtiyseniz, her yöntem bağımsız olarak izole edilir ve test edilir, ancak gerçekten birlikte doğru çalışabileceklerini asla bilemezsiniz.

Burada daha iyi seçenek hangisi? Her biri ayrı bir yöntemle bir arada kodlama ve daha sonra her iki yöntemi de bir arada içeren daha büyük testler gibi bir başka alternatif var mı?


2
Aslında her testte ünite testlerinin sırasını kolayca rastlayabilmeyi diliyorum. Şu anda, nispeten sabit bir düzende olsalar bile, bilinmeyen bir şekilde koşuyorlar.
İş

Yanıtlar:


11

İlk seçeneğe geçtiyseniz, her yöntem bağımsız olarak izole edilir ve test edilir, ancak gerçekten birlikte doğru çalışabileceklerini asla bilemezsiniz.

Yöntemleriniz gerçekten bağımsızsa, bunun önemi yoktur. İkinci yönteminiz:

a) Geçerli verilerle sunulduğunda doğru şekilde çalışın.

b) Geçersiz veriler sunulduğunda makul ve tutarlı bir şekilde başarısız olunması.

Aynı şekilde ilk yönteminiz de aynı şeyi yapmalı. Hata durumlarını ele aldığınız sürece, birlikte düzgün çalışacaktır.

Yöntemlerin birlikte doğru çalıştığını test etmek istiyorsanız, o zaman birim testi değil, entegrasyon testidir.


27

Testler bağımsız olarak çalışamazsa, o zaman birim testleri değildir.

Birim testi, veritabanı tablosunun içeriği gibi herhangi bir harici duruma dayanmamalıdır. Yalıtımda yalnızca bir ünite kodunu test etmelidir.

Belirli bir durumu değiştiren veya gerektiren testler geçerlidir, örneğin entegrasyon testinin bir bölümünü oluşturabilirler ve bu gibi durumlarda uygun kurulumun yapılmasının sağlanması önemlidir, ancak bunlar birim testleri olmayacaktır. Bu durumda, bir testin başka bir testin yapılmasını gerektirdiğini hala tavsiye etmem. Eğer bu durumdaysanız, muhtemelen gerekli olan ayrı bir kurulum yöntemine gereken kodu belirlemelisiniz. Örneğin sadece kurulum kodunu çağıran ve istisna atılmadığını doğrulayan bir testiniz olabilir, örneğin kurulum yönteminde ayarlanan verileri aktif olarak kullanan başka bir test.


@ Steve, öyleyse, bu örnekte şunu söylersiniz: yöntem 1 için bir test, yöntem 2 için bir test ve aynı testte 1 ve 2'yi çalıştıran bir test?
Morgan Herlocker

2
Evet. ilk ikisi birim testi, üçüncü ses ise entegrasyon testi gibi olacaktı.
Steve

Müşteri modülünüz ve sipariş modülünüz varsa ve müşteri ile ilişki kurmadan sipariş oluşturulamaz. Müşteri modülünden bağımsız olarak nasıl test edersiniz: sql ile müşteri kaydında müşteri kaydı oluşturun (müşteriye yerleştirin) veya Customer.createCustomer () kullanın. IMHO'nun ikincisini kullanması daha iyidir, çünkü sınamada herhangi bir mantığı zorlamanız gerekmez, ancak yalnızca müşteri yaratma konusundaki sınamanız geçerse işe yarar.
Dainius

@Dainius. Bir birim test senaryosunda, genellikle sahte nesneler kullanırsınız, böylece sahte müşteriyi sipariş modülünüze geçirirsiniz. Bu durumda sql kullanmak istemeyeceğiniz konusunda haklısınız.
Steve

B yönteminin A yöntemine bağlı olduğu herhangi bir senaryoda, hemen hemen her zaman A'yı çağıran ve sonra B'yi çağıran bir yöntem olacağı görülmektedir. Bu durumda, A, B ve C'yi bağımsız olarak test edebilirsiniz.
Morgan Herlocker

9

Eminim şu anda, birim test B'nin bıraktığı duruma bağlı olarak birim test B'ye sahip olmanın tamam göründüğüne eminim. Ancak bin birim testiniz olduğunda bir yılı düşünün. Değişiklik yapmak istediğiniz her seferde test takımınızın tamamının tamamlanması için on dakika beklemek ister misiniz?

Tabii ki gelişim tarzınıza bağlı, ancak bir özellik geliştirirken defalarca bireysel bir test uygulayabileceğiniz iyi bir teste dayalı gelişim umudunu istiyorsanız, her teste tek başına durma yeteneği vermenizi öneririm.


1
+1 Raskolnikov, bunun daha sonra "tüm testleri" yaptığımda bunun çok büyük bir zaman alıcı olacağını düşünmedim.
Morgan Herlocker

3

Görünüşe göre birkaç şekilde gerçekleştirilebilen test kurulumundan bahsediyorsunuz. Her test için test verilerinin (sabitleme adı verilir) temiz bir kopyasını almak istersiniz, bu nedenle bunların her biri birbirine bağlı olmamalıdır.

Bu tür testlere izin veren çeşitli çerçeveler ve testlerin ve test takımlarının başında ve sonunda veri yapılarını hızlı bir şekilde oluşturmanıza ve ayırmanıza olanak tanıyan DBUnit gibi araçlar vardır.

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.