Tek onaylı birim testleri DRY ilkesini ihlal etmiyor mu?


12

Birim testleri ne zaman yazsam , testler başarısız olduğunda hata ayıklamayı kolaylaştırmak için her zaman test başına tek bir onaylamaya çalıştım . Ancak bu kurala uyduğumda, her testte aynı kodu sürekli kopyaladığımı hissediyorum ve daha fazla teste sahip olmak, okumak ve korumak için geri dönmek zorlaşıyor.

Tek onaylama testi DRY'yi ihlal ediyor mu?

Ve iyi bir denge bulmak için izlenecek iyi bir kural var mı , mesela yöntem başına sadece bir test yaptırmak gibi ? *

* Muhtemelen tek bir boyutun tüm çözümlere uymadığını, ancak buna yaklaşmanın önerilen bir yolu olduğunu fark ettim?



@IsmailBadawi kulağa hoş geliyor. Bu yöntemlerin test ettiğim sınıf nesnesinin bir örneğini döndürmesi gerektiğini varsayalım
Korey Hinton

1
Belirli bir durumda test edilecek bir şey mi yaratıyorsunuz? Bu bir fikstür gibi geliyor.
Dave Hillier

@DaveHillier evet, bugün yeni bir kelime öğrendim. Teşekkürler :)
Korey Hinton

test başına 1 assert'i nasıl yorumladığınıza bağlıdır, eğer bir Assert * çağrısını kastediyorsanız, evet, aynı zamanda değişmezlerin hala beklemesini sağlamak istiyorsanız (daha sonra bunu bir yönteme çıkartın) veya yapabileceğiniz birden çok efekt varsa t Tek bir Assert'te test yapın (ya da bunu yaptıysanız neden başarısız olduğunu açıklığa kavuşturamazsınız)
cırcır ucube

Yanıtlar:


14

Doğru birim testlerinde, neyin başarısız olduğunu hemen belirlemenize yardımcı olan bir adlandırma kuralı vardır:

public void AddNewCustomer_CustomerExists_ThrowsException()

Bu nedenle, her bir yöntemin (ve adının) iddia ettiğiniz koşula karşılık gelmesi için test başına bir iddiaya sahipsiniz.

Doğru bir şekilde işaret ettiğiniz gibi, her yeni testte benzer kurulum kodu olacaktır. Herhangi bir kodda olduğu gibi, çoğaltmayı azaltmak veya ortadan kaldırmak ve kodunuzu daha KURU hale getirmek için ortak kodu kendi yöntemine yeniden aktarabilirsiniz. Bazı test çerçeveleri, kurulum kodunu tek bir yere koymanıza izin vermek için özel olarak tasarlanmıştır .

TDD'de hiçbir test YAGNI değildir, çünkü testleri yalnızca kodunuzun yapmasını istediğiniz şeye göre yazarsınız. İhtiyacınız yoksa testi yazmazsınız.


Tek bir yönteme yeniden odaklanmak kulağa hoş geliyor. Belirli bir durumda olması için sınıfın bir örneğine ihtiyacım olsaydı, yeniden oluşturulmuş yöntemde o nesnenin yeni bir örneğini oluşturabilir ve geri döndürebilirim ya da sizin gibi ilk test kurulumu için test çerçevesi tarafından sağlanan yöntemleri kullanmanızı öneririz.
Korey Hinton

Son noktada, ben ediyorum işlevsellik için testler yazabilirsiniz eminim gibi gerekli ziyade işlevsellik daha kod olması
joelb

5

Tek onaylama testi DRY'yi ihlal ediyor mu?

Hayır, ama ihlali teşvik ediyor.

Bununla birlikte, iyi nesne yönelimli tasarım, birim testleri için pencereden dışarı çıkma eğilimindedir - çoğunlukla iyi bir nedenden dolayı. Ünite testlerinin birbirinden izole edilmesi daha önemlidir, böylece test izole olarak sorgulanabilir ve gerekirse diğer testleri kırmamanız için güvenle düzeltilebilir. Temel olarak, test doğruluğu ve okunabilirliği, boyutundan veya sürdürülebilirliğinden daha önemlidir.

Açıkçası, açıkladığınız nedenlerden ötürü test kuralı başına tek bir iddiaya hayran olmadım: okunması zor, yanlış boyanması kolay ve refactor varsa düzeltmesi zor olan çok sayıda kazan plakası koduna yol açar (bu da sizi daha az yeniden yönlendirmeye yönlendirir).

Bir işlevin belirli bir giriş için "foo" ve "bar" listesini döndürmesi gerekiyorsa, ancak herhangi bir sırayla, her ikisinin de sonuç kümesinde olduğunu kontrol etmek için iki ek kullanmak mükemmeldir. Başın belaya girdiği nokta, tek bir testin iki girişi veya iki yan etkiyi kontrol etmesi ve ikisinden hangisinin hataya neden olduğunu bilmemenizdir.

Bunu Tek Sorumluluk İlkesinde bir varyasyon olarak görüyorum: Bir testin başarısız olmasına neden olabilecek tek bir şey olmalı ve ideal bir dünyada değişimin sadece bir testi kırması gerekir.

Ama sonunda bir değiş tokuş. Tüm kopya pastey kodunu korumak için daha fazla zaman harcıyor musunuz veya testlerin birden fazla kaynak tarafından kırılabileceği durumlarda kök nedenlerini araştırmak için daha fazla zaman harcayacaksınız. -Bazı-testler yazdığınız sürece, muhtemelen çok fazla önemli değildir. Tek onaylı testler için küçümsememe rağmen, daha fazla testin yanına düşme eğilimindeyim. Kilometreniz değişebilir.


1
Testler için, DAM olmak DRY'den (Betimsel ve Anlamlı İfadeler) daha önemlidir.
Jörg W Mittag

2

Hayýr. Bu sadece senin yaptýđýn gibi görünüyor. Bunun iyi bir uygulama olduğunu iddia ettikleri önemli bir referans bulamadığınız sürece.

Bir test fikstürü kullanın (XUnit terminolojisinde testler seti, kurulum ve yırtma fikstürdür), yani tüm testleriniz için geçerli olan bazı kurulum veya örnekler kullanın.

Kodunuzu yapılandırmak için normalde kullandığınız yöntemleri kullanın. Yeniden düzenleme testleri sırasında, normal TDD Kırmızı-Yeşil-Refactor geçerli değildir, bunun yerine " Kırmızıda Yeniden Düzenleme " uygulanmaz. Yani,

  1. kasten testi kır,
  2. yeniden düzenleme yap
  3. testini düzelt

Bu şekilde testlerin hala olumlu ve olumsuz sonuçlar verdiğini biliyorsunuz.

Testler için birkaç standart format vardır. Örneğin, Düzenleyin, Harekete Geçin, Onaylayın veya Ne Zaman O Zaman Verilir (BDD) . Her adım için ayrı bir işlev kullanmayı düşünün. Isı levhasını azaltmak için bu fonksiyonu çağırabilmelisiniz.

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.