TDD'nin Londra ve Chicago okulları nelerdir?


88

Londra tarzı ile Test tarzı (TDD) Chicago tarzı (bazen Detroit tarzı) olarak adlandırılanlar hakkında duydum.

Utah Extreme Programlama Kullanıcı Grubu Atölyesi:

Etkileşim tarzı TDD, popüler olduğu Londra'nın Extreme Tuesday kulübünden sonra mockist tarzı veya Londra tarzı olarak da adlandırılır . Genelde daha fazla devlet tabanlı olan Detroit tarzı veya klasik TDD ile karşılaştırılır.

Jason Gorman'ın atölyesi :

Atölye kapsar Şikago okulu TDD (devlet temelli davranış test ve nirengi), ve Londra okul ağırlık vererek, alay ve uçtan uca TDD, etkileşim testi odaklanır, Sorumluluk Dayalı Tasarım ve Söyle, Sakın Sorma yaklaşımı OO'ya yakın zamanda Steve Freeman ve Nat Pryce'in Büyüyen Nesneye Yönelik Büyüme Testleri Kitapçığı kitabı tarafından yeniden popüler hale getirildi .

Post Klasik TDD veya "Londra Okulu"? Jason Gorman yardımcı oldu, ama örnekleri kafamı karıştırdı, çünkü her iki yaklaşımla da bir örnek yerine iki farklı örnek kullanıyor. Farklılıklar nedir? Her bir stili ne zaman kullanıyorsunuz?

Yanıtlar:


76

"Hesapla" olarak adlandırılan ve "hesapla" ifadesini, örneğin "multiply (x, y)" veya "subtract (" hesapla ") seçeneğine iletilen bağımsız değişkenlere bağlı olarak" Hesap Makinesi "kullanan bir" hesap makinesi "olarak adlandırılan bir yönteme sahip olduğunuzu varsayalım. x, y) ".

Şimdi, ledger.calculate ("5 * 7") işlevini çağırdığınızda ne olacağını test etmek istediğinizi varsayalım.

Londra / Etkileşim okulu, Calculator.multiply (5,7) çağrılıp çağrılmadığını size söyler. Çeşitli alaycı çerçeveler bunun için kullanışlıdır ve örneğin, "Hesap Makinesi" nesnesine sahip değilseniz (doğrudan test edemediğiniz bir harici bileşen veya hizmet olduğunu varsayalım, ancak belirli bir şekilde aramanız gerektiğini biliyorum).

Chicago / Eyalet okulu, sonucun 35 olup olmadığını size söyleyecektir. JUnit / nUnit çerçeveleri, genellikle bunu yapmaya yöneliktir.

Her ikisi de geçerli ve önemli testler.


Çok güzel bir örnek.
sevenseacat

1
Her birini kullanmak için birkaç neden daha ekleyeceğim: Önemli olan bir şeyin atılması gereken eyleme bağlı olarak bir şeyin değişip değişmediğinin belirlenmesiyse (örneğin, defter-hesaplama (35) 7 ") denir), devlet iddialarını (Chicago okulu) kullanmak istersiniz. Bu, yöntem çağrılmadan önce sistemin durumu üzerinde tam kontrole sahip olduğunuzda ve gerçekte yöntemin ne yaptığını kontrol ettiğinizde bu çok faydalıdır.
Matthew Flynn

1
Önemli olan ikinci bir yöntemin çağrıldığını bilmekse (örneğin, Calculator.multiply (5, 7)), sahte bir nesnede olduğu gibi etkinlik iddialarını kullanmak istersiniz. Bu en çok, çağrılan yöntemin, yöntemin ne yaptığını gerçekten kontrol etmemeniz durumunda (örneğin, veri kaydetme, sayaç artırma, mesaj gönderme vb.) İstenen bir yan etkiye sahip olması durumunda faydalıdır, bu nedenle, dönüş değeri tutarsız olabilir. . Ayrıca, sistemin durumunu kolayca kontrol edemiyorsanız, yapabileceğiniz en iyi şey hangi faaliyetlerin gerçekleşeceğini belirlemek olabilir.
Matthew Flynn

Londra yaklaşımı, Hesaplama sınıfı bazı nedenlerden dolayı potansiyel olarak uzun sürdüğü veya bir ağ içerdiği ve bu yüzden dev / qa kurulumlarında lapa lapa olabileceği için faydalıdır. Yani alay etmek, testlerin mümkün olmadığı durumlarda hızlı ve güvenilir olmasını sağlar.
Kevin

1
Londra yaklaşımı ayrıca daha net geri bildirim sinyalleri vermeyi savunuyor, çünkü Calculatorgeriliyorsa multiply, iki testin başarısız olduğunu göreceksiniz: muhasebe testi ve hesap makinesi testi, ancak hesap makinesini alay ettiğinizde yalnızca bir test başarısız olur. Bu, özellikle sistem karmaşıksa, hatanın kökenini belirlemeyi kolaylaştırabilir.
Matthias

30

Makale Mocks Stubs değil misin Martin Fowler tarafından, konuya iyi bir giriştir.

Seçtiğiniz tasarım stiline (ve programlarınızı oluşturduğunuz tasarım ilkelerine) bağlı olarak, bir nesneyi görmenin en az iki yolu vardır:

  1. Girdilere dayalı hesaplamalar yapan bir birim olarak. Bu hesaplamanın sonucu olarak, nesne bir değer döndürebilir veya durumunu değiştirebilir.
  2. Mesaj ileterek sistemdeki diğer elemanlarla iletişim kuran aktif bir eleman olarak.

İlk durumda, işlemden çıkanlarla veya nesnenin o işlemden sonra hangi durumda kaldığıyla ilgileniyorsunuz. Bu, assertEquals()resmin girildiği gibi yöntemlerin bulunduğu yerdir . Bu durumda, işleme diğer nesnelerin dahil olduğu, hangi yöntemlerin adlandırıldığı, vb. Önemli değil.

İkinci durumda, çoğu nesne herhangi bir sonuç bile getirmediğinden (örneğin voidJava'daki yöntemler), nesnelerin birbirleriyle nasıl iletişim kurduğuna ve testin getirdiği koşullar altında doğru mesajları iletip iletmediğine daha fazla ilgi duyarsınız. Bu etkileşimler genellikle sahte çerçeveler yardımı ile doğrulanır. Bu tür bir doğrulamaya davranışa dayalı veya etkileşime dayalı doğrulama olarak adlandırılır. Etkilerinden biri, işbirlikçilerinin zaten var olduğunu varsayarak (henüz var olmasalar bile) bir sınıf geliştiren Behavior Driven Development adı verilen tekniktir, böylece arayüzlerine karşı kod yazabilirsiniz.

Bunun bir / veya seçenek olmadığını unutmayın. Her ikisinden de en iyisini elde etmek için her iki yaklaşımı da karıştıran bir tasarım stiline sahip olabilirsiniz.

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.