TDD'de ilk önce Test mi yoksa ilk önce Arabirim mi yazmalıyım?


23

TDD'yi c # kullanarak öğreniyorum, testin gelişmeyi sürmesi gerektiğini bildiğim kadarıyla , bu testi önce geçmek için minimum kodu yazdıktan sonra başarısız bir test yazıp ardından yeniden düzenleme yapmak.

Ancak “ Arayüz Programlama, Uygulama Değil ” dediği için ilk önce bir arayüz yazın . Bu benim kafamın başladığı yer, ilk önce Interface yazıyorsam iki şeyi ihlal ediyordur.

  1. Arayüz için yazılan kod test tarafından kullanılmaz .

  2. Çıplak asgari değil belli ki basit bir sınıfla yazabilirim.

Arayüz için testler yazarak başlamalı mıyım? herhangi bir uygulama olmadan ne test edeceğim?

Bu soru bunun için aptalca üzgün görünüyorsa, ama tamamen kafam karıştı. Kelimenin tam anlamıyla çok şey alıyorum olabilir.


8
"Bir arabirime programla", ihtiyacınız olanı bir kod parçasından nasıl yapıldığını ayırmak anlamına gelir. Kelimenin tam anlamıyla bir interfaceher şey için kullanmak anlamına gelmez . Bir classsen uygulama detaylarını gizlemek çünkü aynı zamanda, bir arayüz sağlar privatedeğişkenler.
Doval

@Doval, Evet, her şey için bir arayüze ihtiyacınız yok, sadece a denir contract. Bu, soyut bir sınıf şeklinde olabilir, örneğin, sanal bir sınıf / yöntem olmamasına rağmen, onu başlatamamanız gerekir.
trysis

2
TDD "başarısız bir test yaz" diyor. Bazı sıkı TDDers değil eğer bir "başarısız" olarak sayar söylemek derlemek faaliyet gösterdiği veri türü henüz ilan edilmemiştir, çünkü testi.
Süleyman Yavaş

Yanıtlar:


29

İlk ihlali ("Arabirim için yazılmış kod sınama tarafından yönlendirilmez.") Geçerli değil. Önemsiz bir örnek kullanalım. Bir hesap makinesi sınıfı yazdığınızı ve bir ek işlem yazdığınızı varsayalım. Hangi testi yazabilirsin?

public class CalculatorTest {
    @Test
    public void testAddTwoIntegers() {
        Calculator calc = new Calculator();
        int result = calc.add(2, 2)
        Assert.assertEquals(4, result);
    }
}

Testiniz sadece arayüzü tanımladı. Bu addyöntem, görüyor musun? addiki argüman alır ve toplamlarını döndürür. Daha sonra birden fazla Hesaplayıcıya ihtiyacınız olduğunu belirleyebilir ve o zaman (bu durumda) bir Java arayüzü çıkarabilirsiniz. O zaman sınıfın genel arayüzünü test ettiğiniz için testleriniz değişmemelidir .

Daha teorik bir düzeyde, testler bir sistemin çalıştırılabilir özelliğidir. Bir sisteme arayüzler, o sistemin kullanıcıları tarafından yönlendirilmelidir ve testler etkileşimleri tanımlamanız gereken ilk yöntemdir.

Arayüz tasarımını test tasarımından ayırabileceğinizi sanmıyorum. Onlar için etkileşimlerini tanımlama ve tasarım testler aynı zihinsel işlem vardır - zaman ben bir arayüz içine bu bilgileri göndermek, ben bekliyoruz belli bir sonuç. Girişimle ilgili bir sorun olduğunda bu hatayı bekliyorum . Bu tasarım çalışmasını kağıt üzerinde yapabilir ve ardından testlerinizi bundan yazabilirsiniz veya aynı anda bunları yapabilirsiniz - bu gerçekten önemli değil.


2
+1 " Arayüz tasarımını test tasarımından ayırabileceğinizi sanmıyorum " kalın harflerle yazılmalı, IMHO :)
Binary Worrier

Bir fonksiyonelliğin birden fazla uygulamasını denemek istiyorsanız, bir XML İçe Aktarma ve bir CSV İçe Aktarması olduğunu söylemek, uygulamanın değişmesine rağmen aynı arabirimde aynı yöntemle test edebileceğinizi göstermek daha kolay. Ayrıca, testler sıklıkla bazı alaycıları içerir ve bu arayüz için zorunludur.
Walfrat

Testin değişmesi gerekmediğini söylüyorsunuz, ancak new Calculator()uygulama doğru mu? Gerekli yeni bir uygulama varsa, o zaman bir MultiplicationCalculator yaparsınız, ve new AdditionCalculator()hala geçmesi için kullanmak için testi değiştirmeniz gerekir mi? Yoksa bir şey mi kaçırıyorum?
Steve Chamaillard 19:16

3
@SteveChamaillard Tabii ki, eğer tasarımınız sınıf adını Hesaplayıcıdan AdditionCalculator'a değiştirdiyseniz, testin eşleşmek üzere değişmesi gerekir. Tabii ki, TDD yaparak gerçekte olacak olan şey, önce testi değiştirecekti ve testi geçmek için sınıf değişikliğini takip edeceksiniz.
Eric King

5

Bir yazarken ne yapıyoruz interface? Kod yazıyor muyuz yoksa tasarlıyor muyuz?

Test Odaklı Tasarım kavramının hayranı değilim, ama Test Odaklı Gelişme'yi seviyorum . Şahsen, bir test yazmadan önce arayüzü tasarlayarak sınıfın önünü tasarlarken en iyi sonuçlarımı aldım. Arabirimi kod olarak saymıyorum. Arayüz TDD kullanarak uygulayacağım bir tasarım. Çalışırken evrim geçirme olasılığı değişiyor, ancak yol haritam (test listemle birlikte).

Zıplamaya başlamadan önce duracağım, ama umarım bu sizin düşünmeniz için yararlı bir yoldur.


4

TDD'de ilk önce Test mi yoksa ilk önce Arabirim mi yazmalıyım?

Tamamen ne kadar ortodoks / dini TDD yapmak istediğinize bağlı .

TDD öğreniyorum

Öğrendiğinizden beri, sizin için işe yarayan kişisel bir iş akışı elde etmeyi denemelisiniz.

  1. Eğer bunu istiyorsanız kitaplara göre , size hiç hiçbir kodla başlayan çünkü belli ki, başarısız olacak ilk testte en yazın. Sonra testin geçmesi için bir kod yaz. Bu yapılırsa, mevcut kodları yeniden düzenlemekte serbestsiniz, çünkü yeniden ateşleyiciler için bir tür güvenlik ağı sağlayan bir testiniz var. Arabirim kullanmaya karar vermek bir tür yeniden düzenleme işlemidir.

  2. TDD'nin yanı sıra: Bir arayüz kullanılıp kullanılmayacağı sorusu her şeyden önce ilginç değil. Elbette, çeşitli nesnelere yaymak istediğiniz farklı davranışlara sahip olduğunuzdan eminseniz, bir Arayüz kullanma hakkında düşünmeniz mantıklı olacaktır: Örneğin, farklı hedeflere yönelik bir tür çıktınız varsa, bunu gerçekleştirmek için bir anlam ifade eder. Bir arayüz Yazar ve çıkış için farklı sınıflar var ( FileWriter , Yazıcı vb.). Her ne kadar bir arayüze yazmak yaygın bir deyim olsa da, bu demek değildir: her şey için bir arayüz kullanın . Bazen bir dereceye kadar dolaylı indirgeme seviyesidir. Btw. Aynı hizmetler için de geçerli. Ama bu farklı bir konu.

  3. Öte yandan, test sürüşünü başka bir yolla da geliştirebilirsiniz : kodunuzu test edilebilirlik için tasarlayın. Bu, testleri sonradan yazmanıza rağmen, kod yazmanızın kolay olduğu anlamına gelir . Testleri önceden veya daha sonra, zaten test ettiğiniz sürece yazmanızın bir önemi yoktur.


5
Son nokta ile aynı fikirde değilsiniz "Testleri önceden ya da sonra yazmanızın bir önemi yok, çünkü yine de test ettiğiniz sürece". Eğer testi sonradan yazarsanız, testin doğru olanı test edip etmediğinden emin olamazsınız.
k4vin

4
Dediğim gibi ... Bu ne kadar ortodoks olduğunuza bağlı ...
Thomas Junk

2

TDD veya BDD, önce etki alanı arayüzlerinizi yapmak ve daha sonra yorumuma göre onlara karşı testler yazmak anlamına gelir. Bir arayüzün uygulanmasının beklenen bir davranışı vardır.

hala koddan önce test edilir, çünkü bir arayüz test edilebilir bir mantık içermez, buna karşı bir test yazdığınız yapıdır.

Şöyle yapardım

  1. Yarı Resmi Davranışı Yaz (Verilen: Ne Zaman: Sonra :)

  2. Arabirimi Yaz (davranış kapsülleme yöntemini barındırmak)

  3. Tanımladığı Testi yazın (verilen girişi yapın, ne zaman arayın, sonra test edin)

  4. Testi Yazmak için Betonu Yazınız / Değiştiriniz (arayüzü uygulayan sınıf)


0

Arabirimleri tasarlamadan önce asla test yazmayın. Ne tür testler yazacağınızı (test tasarımı) düşündüğünüzde, aynı zamanda uygulamanızı da aynı anda tasarlamıyor (tasarlamıyor). Aynı anda iki şeyi düşünmeyin. Endişelerin ayrıldığını duydunuz mu? Yalnızca kodunuzun fiziksel yapısı için değil, düşünme süreciniz için de geçerlidir.

İlk önce uygulamanızın nasıl tasarlanması gerektiğine karar verin. Bu, arabirimlerinizi ve bu arabirimler arasındaki ilişkileri tasarladığınız anlamına gelir. Bunu yapana kadar testleri düşünmeye başlamamalısın. Arayüzlerinizin ne olduğunu öğrendikten sonra önce onları yaratabilir, sonra da onlara karşı testler yazabilir veya önce testler yazıp sonra oluşturabilirsiniz. İkinci durumda açıkçası testleri derleyemezsiniz. Testlerden önce arayüz oluştururken hiçbir zarar veya TDD felsefesinin ihlal edilmediğini görüyorum.


içinde muhakeme üst cevabı daha çekici görünüyor: "Ben test tasarımdan arayüz tasarımı ayırabilen sanmıyorum etkileşimleri tanımlanması ve bunlar için testler tasarlarken aynı zihinsel çalışma vardır -. zaman ben bir arayüz içine bu bilgileri göndermek, ben bekliyoruz belli bir sonuç . ne zaman bir şey benim girişinizde yanlış, ben bekliyoruz bu hatayı ..."
tatarcık

@gnat Burada Nissam'ın interfacegenel "arayüz" teriminden değil C # anahtar sözcüğünden bahsettiğine inanıyorum .
RubberDuck

@RubberDuck Ben de öyle düşünüyorum ve bunun kötü bir yaklaşım olduğuna inanıyorum. “Bunu yapana kadar testler hakkında düşünmeye başlamamalısın ...” Yazdığım gibi, en üst sıradaki mantık, hem genel anlamda arayüz hem de somut anahtar kelime anlamında daha çekici görünüyor
gnat

Yeterince @gnat yeterince yorumunuzu net değildi. Şahsen, ben burada Nissam ile katılıyorum. İnsanların TDD'yi tasarım yapmamaları için mazeret olarak kullanmalarını önlüyorum. YMMV.
RubberDuck

-2

Arayüz / kod / testi, projeye dahil edilmeleri şartıyla, aynı anda yazmak, tamamdır.

Patronunuz TDD hakkında dindar değilse, bu durumda muhtemelen boş bir arayüz yazmanız gerekir -> test -> minimal kod (anlamsız adım) -> daha fazla test -> daha fazla anlamsız kod -> daha fazla test -> sonunda gerçek kodu yazın - > bitti.

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.