Birim testleri hakkında konuşurken “DAMP DRY değil” ne demektir?


345

Birisinin birim testlerin (nUnit, jUnit, xUnit) olması gerektiğini söylediğini duydum

Nemli değil KURU

(Örn, birim testleri "kuru kod" değil "nem kodu" içermelidir)

Onlar ne hakkında konuşuyor?


2
DRY olmayan kodu garanti eden birim testleri hakkında özel bir şey yoktur. DRY olmayan testler yazmak, tembel programcılar tarafından tembellikleri için bölgeyi oymaya çalışmak için bir mazerettir. Basitçe söylemek gerekirse, KURU ve okunabilirlik dikey kaygılardır.
Acumenus

2
DRYness kod navigasyon mesafesini arttırır ve bu da anlaşılması daha yüksek zihinsel yüke neden olur. Bu, "normal" metin tabanlı bir ortamda geçerlidir. Bir projeksiyon editörü, kodun dikliğini azaltabilir, ancak her durumda değil.
Peter

Yanıtlar:


596

Bu bir denge, bir çelişki değil

DAMP ve DRY çelişkili değil, bir kodun sürdürülebilirliğinin iki farklı yönünü dengeler . Sürdürülebilir kod (değiştirilmesi kolay kod) buradaki nihai hedeftir.

DAMP (Açıklayıcı ve Anlamlı İfadeler) kodun okunabilirliğini artırır .

Kodu korumak için önce kodu anlamanız gerekir. Bunu anlamak için okumalısın. Bir an için kodu okumak için ne kadar zaman harcadığınızı düşünün . Bu çok fazla. DAMP, kodu okumak ve anlamak için gereken süreyi azaltarak sürdürülebilirliği artırır.

KURU (Kendinizi tekrarlamayın) kodun dikey olmasını destekler .

Çoğaltmanın kaldırılması, sistemdeki her kavramın kodda tek bir yetkili temsiline sahip olmasını sağlar. Tek bir iş konseptinde yapılan bir değişiklik, kodda tek bir değişiklikle sonuçlanır. DRY, değişikliği (riski) yalnızca sistemin değişmesi gereken kısımlarına izole ederek sürdürülebilirliği artırır.

Peki, testlerde çoğaltma neden daha kabul edilebilir?

Sınamalar genellikle yinelemeyi içerir, çünkü aynı şeyi tekrar tekrar test ederler, yalnızca biraz farklı giriş değerleri veya kurulum koduyla. Ancak, üretim kodunun aksine, bu çoğaltma genellikle yalnızca tek bir test fikstürü / dosyasındaki senaryolarla yalıtılır. Bu nedenle, çoğaltma minimal ve açıktır, yani proje için diğer çoğaltma türlerinden daha az risk oluşturur.

Ayrıca, bu tür kopyalamanın kaldırılması testlerin okunabilirliğini azaltır. Her testte daha önce çoğaltılan ayrıntılar artık bazı yeni yöntemlerde veya sınıflarda gizlenmiştir. Testin tam resmini elde etmek için, şimdi tüm bu parçaları zihinsel olarak bir araya getirmelisiniz.

Bu nedenle, test kodu çoğaltması genellikle daha az risk taşıdığından ve okunabilirliği teşvik ettiğinden, bunun kabul edilebilir olarak kabul edildiğini görmek kolaydır.

Prensip olarak, üretim kodunda DRY'yi, test kodunda DAMP'ı tercih edin. Her ikisi de eşit derecede önemli olsa da, biraz bilgelikle dengeyi lehinize çevirebilirsiniz.


18
Bu harika ve özlü bir özet. Ayrıca, bir DAMP testinin değişen gereksinimler karşısında daha esnek olduğunu ve bir testin açıklığının ölçülmesinin, bir başkası yeni gereksinimlere uyacak şekilde testlerinizi yeniden yazmakla görevlendirildiğinde muazzam bir fayda olduğunu belirtmek isterim. Jesper Lundberg'in de bu konuda iyi bir tezi var.
Jason

3
@ Jason, Btw "Jesper Lundberg'in de bu konuda iyi bir tezi var" bağlantısı var mı?
Pacerier

2
@JohnSaunders, test verisi oluşturucu desenini kullanarak bu yinelemenin bir kısmını önleyebilirsiniz: natpryce.com/articles/000714.html
si618

2
Test kodunu KURUTMAK, gizemli bir misafir
jayeff

1
Ayrıca, iyi yazılmış testlerin aslında başvurunuz için belgeler / yorumlar olduğunu da ekleyeceğim. Bu yüzden daha açıklayıcı olmak, diğer geliştiricilere niyetinizi açıklamaya yardımcı olur. OP'nin dediği gibi, her testte kendi kendine yer alırlar, bu nedenle uygulamanız için tehlike minimumdur. Daha kötü durum senaryosu, yedekli bir test veya test kurulumunuz olması ve test paketinin çalıştırılmasının daha uzun sürmesidir. Test kapsamının iyi olmasını tercih ederim.
Lee McAlilly

60

DAMP - Açıklayıcı ve Anlamlı İfadeler.

"DAMP DRY not" kod yeniden kullanımı üzerinden okunabilirlik değerlerine sahiptir. Test örneklerinde KURU olmayan DAMP fikri, test durumlarının bazen tekrarlanan kodlara sahip olduğu anlamına gelse bile testlerin anlaşılması kolay olmasıdır.

Ayrıca bkz. Yinelenen kod birim testlerinde daha fazla tolere edilebilir mi? bu bakış açısının esası hakkında bazı tartışmalar için.

Etki Alanına Özel Diller ile ilgili olarak Jay Fields tarafından icat edilmiş olabilir .


1
İyi cevap ve ilgili soruya bağlantı. Mükemmel bir DAMP vs DRY seçeneği yoktur. Mümkün olduğunca kuru ve testte, testin anlaşılması zor olacak kadar kuru olmadığı anlamına gelen kod istiyoruz. Bir test başarısız olduğunda neden geliştirici testlerde DAMP koduna doğru eğilmek anlamına gelir SUT düzeltmeye başlayabilirsiniz böylece açık olmasını istiyorum. Çoğu programlama kavramı gibi, bir şeyi çok ileri götürmek her zaman mümkündür. Ünite test kodunuz o kadar kuruysa, testin nasıl ve neden başarısız olduğunu belirlemek uzun zaman alır ve "çok kuru" olabilir.
Gerald Davis

29

"KURU", "Kendinizi tekrar etmeyin"

Bu, insanlara yeniden kullanılabilir kod yazmalarını söylemek için kullanılan bir terimdir, böylece tekrar tekrar benzer kodlar yazmazsınız.

"DAMP" "Tanımlayıcı ve Anlamlı İfadeler" dir.

Bu terim, ona bakan biri tarafından kolayca anlaşılabilecek bir kod yazmanızı amaçlamaktadır. Bu prensibi izliyorsanız, uzun ve açıklayıcı değişken ve işlev adlarına vb. Sahip olacaksınız.


15
AIUI, DRY sadece yeniden kullanılabilirlik sayesinde zamandan tasarruf etmekle kalmaz, aynı zamanda farklı kod yollarının "senkronizasyondan çıkmasını" önler. Aynı mantığı birden çok sınıfta kopyalayıp yapıştırırsanız, bir değişiklik gerektiğinde bu kodun her örneğinin güncellenmesi gerekir. (Ve kaçınılmaz olarak onlardan biri egzersiz yaparken patlayacak ve patlayacak.)
Andrzej Doyle

20

Damp = 'Açıklayıcı ve Anlamlı İfadeler' - birim testleriniz 'okunabilir' olmalıdır:

Okunabilirlik, yedek koddan kaçınmaktan daha önemlidir.

Makaleden:

DAMP, “açıklayıcı ve anlamlı ifadeler” anlamına gelir ve DRY'nin tam tersidir, “okunabilirlik gereksiz kodlardan kaçınmaktan daha önemli olduğu için“ her şey bir çöp yığını gibi görünmeli ve okunması imkansız ”diyor.

Bu ne anlama geliyor ve nerede kullanılır?

DAMP çoğunlukla test kodu yazarken geçerlidir. Test kodunun, bazı fazlalıkların kabul edilebilir olduğu noktaya kadar anlaşılması çok kolay olmalıdır.



11

Burada zaten birkaç cevap var, ama mutlaka açıklayabilecekleri kadar iyi açıkladıklarını düşünmediğim için bir tane daha eklemek istedim.

DRY fikri (kendinizi tekrar etmeyin), uygulama kodunuzda gereksiz veya tekrarlayan kodlardan kaçınmak istediğinizdir. Kodunuzun birden çok kez yapması gereken bir şey varsa, bunun için birkaç yerde benzer kodu tekrarlamak yerine bir işlev veya sınıfınız olmalıdır.

Bu oldukça iyi bilinen bir programlama konseptidir.

DAMP (Betimsel ve Anlamsal Cümleler) birim testleriniz içindir. Buradaki fikir, birim test yöntemi adlarınızın uzun ve açıklayıcı olması gerektiğidir - test ettiğiniz şeyi açıklayan etkili kısa cümleler.

Örneğin: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Bunun gibi bir DAMP yöntemi adı okuduğunuzda, test kodunu okumak zorunda kalmadan bile test yazarının ne elde etmeye çalıştığını tam olarak anlamanız gerekir (test kodu da bu kavramı elbette wordy değişken adları ile de takip edebilir, vb).

Bu mümkündür, çünkü bir birim test yöntemi çok özel bir girdiye ve beklenen çıktıya sahiptir, bu nedenle DAMP prensibi onlar için iyi çalışır. Ana uygulama kodunuzdaki yöntemlerin, özellikle de KURU ilkesi göz önünde bulundurularak yazıldıysa, bu gibi adları garanti edecek kadar spesifik olması olası değildir.

DAMP ve DRY birbirleriyle çelişmezler - kodunuzun nasıl yazıldığının farklı yönlerini kapsarlar - ancak yine de bunlar genellikle birlikte kullanılmazlar, çünkü KURU prensibi ile yazılan yöntemler genel amaçlı ve uygun olması muhtemel değildir son derece spesifik yöntem ismine. Bu nedenle, genel olarak, yukarıda açıklandığı gibi, uygulama kodunuz KURU ve birim test kodunuz DAMP olmalıdır.

Umarım bu biraz daha iyi açıklamaya yardımcı olur.


5

İkisi arasında bir denge kurmanız gerektiğinden Chris Edwards'a katılıyorum. Dikkat edilmesi gereken başka bir şey, çoğaltmayı kaldırmak için birim test kodunuza çok fazla ek yapı eklediğinizde (yani, aşırıya kaçan DRY'yi alırsanız), buraya hata girme riskiyle karşılaşırsınız. Böyle bir durumda, birim testlerinizi birim olarak test etmeniz veya yapı bitlerini test edilmeden bırakmanız gerekir.


0

Buradaki çabayı çoğaltmak istemiyorum, ancak DAMP olan ancak DRY avantajına sahip testler yapabilirsiniz. Flip tarafında, DRY testleri bazı durumlarda DAMP testlerini karşılamaz.

Bazı örnekler içeren DRY vs DAMP hakkında blog yazdım.

Her iki yaklaşım da tek çözümünüz olmamalı, bazen DAMP aşırıya kaçıyor, bazen de çok güzel bir ek.

Genel bir kural olarak, üç kuralı uygulamanız gerekir. Yinelemeyi üçüncü kez tespit ederseniz, DAMP stili testleri yazmaya değer olabilir, ancak o zaman bile tüm yineleme kötü değildir . Bağlam önemlidir.

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.