BDD / TDD'yi ilk önce bir testte yapmak zorunda mısınız?


11

Bir TDD veya BDD projesinde bulunmamam veya TDD yaptıklarını söyleyen ama ondan oldukça uzak olduklarını söylesem de, bunlar düşündüğüm ve gerçekten elimden geldiğince okumaya çalıştığım şeyler hakkında.

Soruya geri dön. BDD yaparken önce "test" inizi yazmalı ve başarısız yapmalısınız, değil mi? Ve sonra o özelliği ya da dediğiniz şeyi uygulayın. Ama bunu aşırıya çıkarırsanız, bu bir çeşit yukarıdan aşağıya gelişme olamaz mı? Kullanıcı arayüzünüze bakıyorsunuz ve "Burada bu özelliğe / davranışa sahip olmak istiyorum" diyor. Ardından, bu özelliği ve kullanıcı arayüzünü destekleyen kodu uygulamak için kullanıcı arayüzünüzü düzeltirsiniz. Bu noktada herhangi bir iş mantığı veya veri erişim mantığı uygulamadınız, davranışınızı yeni uyguladınız. Önce testi yazmak yerine hedeflediğim şey önce UI kodunuzu yazıyorsunuz. İşletmenizin neyi desteklemesi gerektiğini tanımlamak için UI kodunuzu kullandığınızdan, bazı durumlarda veri erişimi ve iş katmanı için aynı kodla sonuçlanmalıdır.

Elbette bunu, özelliğin özellikte olması gerektiği gibi çalıştığından emin olmak için kullanılan testlerle tamamlamalısınız.

Düşüncesi olan var mı?


TDD kapsamındaki testler, modülü aynen ayrı bir yerden geçiriyormuş gibi yönlendiren birim testlerdir main. Yukarıdan aşağıya yorumunuzda, tüm programı tek bir programda yürüten fonksiyonel testlerden bahsediyorsunuz main.
Macneil

@Macneil: Tüm programı test eden fonksiyonel testten bahsetmiyorum, programınızı yukarıdan aşağıya uyguladığınızı / tasarladığınızı düşündüğünüzde bile, tüm genel kodunuz için birim testi uygulamanız gerekir. Bunu yukarıdan aşağıya yaptığınız için farklı katmanları soyutlayamayacağınız anlamına gelmez, böylece tüm katmanları tek başına izole edebilirsiniz.
Tomas Jansson

1
@Macneil: Bu yaygın bir yanlış anlamadır. TDD testleri birim test değildir . TDD , ölçeği belli olmayan özellikleri test eder .
Steven A. Lowe

2
Ancak belirli bir ölçek var: test TDD'de hızlı bir şekilde yürütülmelidir. TDD kapsamı dışında da yapılması gereken testler vardır. Genel olarak, TDD bir test planı değil, bir geliştirme planıdır.
Macneil

@Macneil: "çabuk" göreceli bir terimdir. Son projemdeki test takımı yaklaşık 30 dakika içinde çalışıyor. 8 saatlik manuel testin yerini alır . Bu "çabuk" yeter!
Steven A. Lowe

Yanıtlar:


8

Kullanıcı arayüzünüzü test etmek için üst düzey bir perspektiften BDD'den bahsediyorsunuz. Test, bu düzeyde Javascript / sunucu tarafı kodunuzda daha aşağıya göre biraz daha kabarıktır.

TDD'de okuduğum birkaç kitap, temel sistemler varmış gibi kod yazmanız ve sadece testinizi geçecek kadar yazmanız gerektiğini söylüyor. Kullanıcı arabirimi davranış testlerinizi geçmek için sunucuda saplamalar yazabilirsiniz. Daha sonra bu saplama dikişinden başlayın ve sunucu tarafı kodunuz için bazı birim testleri yazın ve tam bir uygulamaya kadar çalışın.

Genellikle alt katmanları geçmek için yüksek seviyeli bir test almak için var gibi kodlarım, bir tavşan deliğinden aşağı inmek ve yüksek seviye testini tatmin etmek için diğer birçok sınıfı çıkarmak ve daha sonra bu daha düşük seviyeler için testler yazmak gibi geliyor. Zaten tanıdığınız gibi, daha yüksek seviye testlerden başlayarak odaklanmanıza yardımcı olur.

Tecrübeli herhangi bir programcının bildiği gibi, yazılım geliştirmenin birçok katmanı vardır. Kullanıcı arayüzünden daha düşük çalışma eğilimindeyim ve kullanıcı arayüzümün sunucudan ihtiyacı olan veri veya davranışı düşünüp orada başlıyorum (belki de bu günlerde çok fazla kullanıcı arayüzü çalışması yapmadığım için).

Gerçekten dürüst olursam, altta yatan katmanlardan bir sınıf çıkarmak, ilk önce test yapmıyorum anlamına gelir, ancak ... dakikalar veya bazen saatler içinde bu kod için bir testim olacak. Bir sınıfa nerede bağımlılık sağlamanıza ve tek sorumluluk prensibine uymanız gerekebileceğine yardımcı olduğum için bu hala bana faydalı geliyor - test etmek zorsa, tek bir yerde çok fazla şey yapıyorsunuz vb.


Bence haklısın. Bu yaz raylar üzerinde yakut denediğimde bana ulaştı, orada altta yatan sınıfların uygulanmasını yönlendiren UI'yi yönlendiren bazı bdd testleri var.
Tomas Jansson

17

Evet! Aksi takdirde, elde ettiğiniz şey geliştirme odaklı testlerdir .

Gerçekçi olmak gerekirse, "saf" TDD kullanarak yaklaşılması zor sorunlar var. Daha önce ortaya çıkarılan bazı üretim kodlarını yazıp daha sonra testlerle kaplayarak (ve gelecekte TDD ile benzer sorunlara nasıl yaklaşacağınızı öğrenerek) daha üretken olabilirsiniz. Yazarı daha iyi bir terim için durulama ve tekrarlama TDD olarak adlandırılan bu tekniğe bakın .


3
İlk satır harika.
EpsilonVector

TDD ile karşılaştırıldığında bu doğrudur, ancak yukarıdan aşağıya bir şeyler yapmak BDD ile oldukça iyi uyum sağlamalıdır, değil mi? GUI'ye bakıyorum ve istediğim davranışı belirtiyorum, "davranış testi" ni hemen yazmıyorum, ama uygulamadan önce kullanıcı arayüzünde düşünülen davranışı belirttim.
Tomas Jansson

15

Önce testlerinizi yazmazsanız, testleriniz yoluyla gelişimi teşvik etmezsiniz. Ergo, test odaklı geliştirme yapmıyorsun!


Adil olmak gerekirse, BDD (TDD değil) yaparken ilk önce testi yazıp yazmamamız gerektiği sorusu daha fazla değil mi?
bytedev

"Test" i "davranış" ile değiştirmekten çekinmeyin. Beni yürekten, TDD ve BDD arasında çok fazla fark olduğuna ikna edecek hiçbir şey görmedim. Odaklan, belki. Ama ana fikir? Çok değil.
Frank Shearar

Test odaklı geliştirme yapmadığınıza katılmıyorum. Anahtarlı terimin tanımına göre yapmıyorsunuz, ancak kodunuz için testler geliştirdiğiniz sürece, kodunuz, yazdığınız zaman ne olursa olsun, kesinlikle testler tarafından yönlendiriliyor.
alternatif

TDD özellikle koddan önce test yazma anlamına gelir. Bunu beğenmediyseniz, terimi icat eden Kent Beck ile alın. Kodunuzdan sonra testler yazmak, kodunuzu bir dereceye kadar yönlendirebilir, ancak yine de, yapmadığınız zamanlarda testler yoluyla kod tasarımınızı kullandığınıza inanmak için kendinizi kandırabilirsiniz. Ve bu testleri yazmak daha zordur, çünkü genellikle test edilmemiş kodu değiştirmeniz gerekir . Bahsetmek için çok sık gördüm.
Frank Shearar

@FrankShearar Kent Beck'in söylediklerine göre onun TDD olmadığını kabul ettim, ama açıkçası bazı rastgele insanların ne dediğini umursamıyorum. Önce testleri yazmadan testlerle kod tasarımını sürmek mükemmel bir şekilde mümkündür.
alternatif

4

Bu şekilde çalışmak istiyorsanız, devam edin. Ancak test odaklı geliştirme değildir.


3

Açıkladığınız şey Önde Gelen Tasarım yaklaşımı gibidir. Ne yazık ki, Önde Gelen Tasarım, Alex Papadimoulis'in çevik yöntemlerde hiciv bıçağıdır.


Hicivli bıçaktan çürüten FAD'de savaşan herhangi bir makale biliyor muydunuz?
CL22

3

Şahsen, tasarım aşamasında test hakkında düşünmenin kritik olduğuna inanıyorum. Çalışan bir uygulamaya sahip olması gerçekten harika, ancak çalışan bir ürününüz olduğundan emin olmanın tek yolu, parça parça test etmenizdir. Bunu kapsamanın yolu, Birim testleri ile ortaklık içinde çalışan yetenekli bir KG ekibinin birleşimidir.

Şimdi bu disiplini ekibinize nasıl yüklediğiniz size kalmış. TDD böyle bir stratejidir - ve onun yerine sahip olan bir stratejidir ve başka birçok varyasyon vardır. Bununla birlikte, TDD, UI düzenini geliştirmek için özellikle uygun değildir.

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.