TDD: İlk birim testinden önce ne olur?


17

Çoğunlukla TDD teorisini anlıyorum, ancak nasıl başlayacağımı anlayamıyorum. Kişisel bir proje için birim testi yazmak ve oturmak için oturuyorum. . . Neyi test ettiğim hakkında hiçbir fikrim yok. Hangi nesneler, hangi işlevler, vb.

Örneğin, ailemizin ev ödevlerini yönetmesine yardımcı olacak bir uygulama yazmak istediğimi varsayalım. Aklımdaki bazı sorular: Bu fikirden ilk testime nasıl geçebilirim? Başlamadan önce ne kadar karar vermeliyim ve test yazmaya başladıktan sonra ne kadar çözeceğim? Verileri bir metin dosyasında mı yoksa veritabanında mı depolamak gibi kararları ne zaman alırım? Başlamadan önce kullanıcı kabul testlerim olmalı mı? Kullanıcı arayüzünü tasarlamalı mıyım? Spesifikasyonum olmalı mı? (Bu örnek soruların en azından bir kısmının muhtemelen "gri bir alanda" olduğunu fark ediyorum).

İlk birim testine girmeyle ilgili başlık sorusuna ek olarak, örnek proje gibi bir proje için ilk birim testinin nasıl görünebileceğine de bir örnek verebilir misiniz?


5
Nat Pryce ve Steve Freeman'ın GOOS kitabını okumanızı tavsiye ederim ... 'ince bir dilim' işlevselliğiyle uçtan uca test edinme hakkında bazı harika bilgiler var.
boş

Yanıtlar:


6

Bir özellik listesi ile başlamak istiyorum ve her özellik için kullanıcı hikayeleri yazın, sonra her hikaye için test açıklamaları yazın.

Biraz tasarım düşünün, ardından bir test açıklaması seçin ve kodlamaya başlayın: kırmızı-yeşil-refactor.

Tüm testler geçene kadar tekrarlayın.

Evet, kabul testleri uygun hikayeye bağlı olarak bunun bir parçası olarak düşünülmelidir.


Bunu severim. Takip edebileceğim çok açık bir süreç: Özellikleri listeleyin, her özellik için kullanıcı hikayelerinin bir alt listesini yapın, her kullanıcı hikayesi için testlerin bir alt listesini yapın. Bu işlemi bir deneyeceğim.
Ethel Evans

Bunu kabul ediyorum, çünkü kişisel olarak bilmek istediklerime hitap ediyor, ancak insanların Carl'dan (daha fazla oy verilen) yanıtı da okumasını tavsiye ediyorum.
Ethel Evans

18

En başından beri TDD'nin Tasarım hakkında nasıl olduğunu keşfettiniz . İlk testinizi yazmadan önce, ilk işlevsellik bitinizin ne olacağını ve bu işlevsellik çalışıyorsa programınızın nasıl görüneceğini düşünmelisiniz.

TDD kullanmayan geliştiriciler de bunu düşünmek zorundadır - ama "sadece dalabilirler" ve bir şeyler yazmaya başlayabilirler. Ancak "bir şey, herhangi bir şey" her zaman yazmayı düşündüğünüz programı sunma yolunda değildir. Nedir? Peki, programınız çalışıyor olsaydı nasıl olurdu? Hangi testleri geçecekti?

Ailemizin ev ödevlerini yönetmesine yardımcı olacak bir uygulama yazmak istiyorum.

Güzel. Bu uygulama çalışıyor olsaydı ne yapardı? Bir kişiye muhtemelen bir angarya atanabilirdi, değil mi?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Bir başlangıç ​​var. Başlamak için bir yer değil, mutlaka başlamak için en iyi yer değil - ama bir yer. Kodunuzun desteklemesini istediğiniz bir şey (daha iyi adlar bulabileceğinizden eminim). Oradan başlayın, başarısız olduğunu izleyin. Geçmesini sağlayın. Temizle. Köpürtün, durulayın, tekrarlayın.


Örneği sevmiyorum, ama öncül ile aynı fikirdeyim; test ilk metodolojileri yalnızca en azından bazı ön tasarımları yapabildiğiniz ve yapmaya istekli olduğunuzda anlamlıdır . Aslında gerçekten bir iskelet etki alanı modeline veya en azından bir tane büyük bir parçaya ihtiyacınız var.
Aaronaught

5
Burada ön tasarım yok. Testteki hiçbir sınıfın henüz var olması gerekmiyor. Tasarım testte gerçekleşir, daha sonra test geçişini yapmak için oluşturulurlar.
Torbjørn

"İlk testinizi yazmadan önce, ilk işlevsellik bitinizin ne olacağını ve bu işlevsellik çalışırsa programınızın nasıl görüneceğini düşünmeniz gerekir" konusunu biraz açıklayabilir misiniz? Başlamadan önce ne kadar çalışmalıyım? Hangi noktada, birim testlerimin tasarımımı yönlendirmesine izin verme avantajını fazla tasarlayıp kaybediyorum? Sınıf diyagramları istemediğimi varsayıyorum, bu yeniden düzenleme ile yönlendirilmeli, değil mi? Ancak bu örnek, "Bir fikriniz olsun, 15 saniyelik düşünceye yatırım yapın, sonra bir test yazın" gibi geliyor. Gerçekten yapmak istediğim bu mu?
Ethel Evans

2
@Ethel Evet, bu içine koymayı önerebileceğim kadar çok düşünce (hem burada hem de genel olarak örnekte). Sizi istediğiniz ürüne yönlendiren test edilebilir bir şey bulun ve ardından bunun için bir test yazın.
Carl Manaster

1
Bir ekip üzerinde nasıl çalıştığı daha büyük ve farklı bir sorudur. TDD'nin de ekip çalışmasını koordine etmek için söyleyecek çok şeyi yok. Çift Programlama ve Planlama Oyunu bu konuda yardımcı olabilir; planladığınız içerik kapsamında TDD hala geçerlidir. jamesshore.com/Agile-Book/the_planning_game.html Scrum'ın da bir ekibin çalışmasını nasıl planlayacağı hakkında söyleyecek bir şeyleri var.
Carl Manaster

5

Evet, TDD'de bu problem var. Bu yüzden şimdi Davranış Odaklı Gelişim'i öneriyorum.

Manuel olarak başlayın. Bir kullanıcı hikayesine benzer bir şey yazın:

  • Bir As kullanıcısı
  • Ne zaman To Alışveriş Ekle seçeneğini Ben ürün arka planda şeffaf eklenmek istiyorum Sepetiniz
  • Böylece alışveriş deneyimime kesintisiz devam edebilirim

Şimdi bu hedefi destekleyen özellikler nelerdir ('Yani bu' bölümü)?

  • Bir alışveriş sepetine bir öğe eklendiğinde
    • Kullanıcının Alışveriş sepeti yeni öğeyi içerecektir
    • Sepetteki toplam ürün sayısı bir artacak
    • Kullanıcı yönlendirilmemelidir
    • Şimdi kontrol et seçeneği mevcut olacak
  • Alışveriş sepetinde iki öğe olduğunda ve kullanıcı ödeme yapmayı seçtiğinde
    • Kullanıcı ödeme sayfasına yönlendirilecek
    • Her iki öğe de görünür olacak

Bunların hepsi yapabileceğiniz şeylerdir ve manuel olarak kontrol etmelisiniz.

Bunu bir süre yapın. Ardından, iyi bir geliştirici gibi, yedek parçaları otomatikleştirmenin yollarını aramaya başlayın. Bu, platformunuzun ne olduğuna bağlı olarak değişecektir, ancak çoğunda uygun çerçeveler vardır.

.Net, web sayfasını otomatikleştirmek için WatiN'ye sahiptir veya bir API'yi test etmek istiyorsanız, xUnit veya MSpec'e Subspec ekini öneririm (bunu herhangi bir test çerçevesi ile de yapabilirsiniz, sadece testlerinizi bir şekilde adlandırmayı kolaylaştırır bu düşünce tarzını destekler).

Ruby, otomasyon testi için salatalık ve alt seviye API testi için rspec'e sahiptir

Javascript yasemin ve qUnit içerir.

nokta nokta nokta


.NET için salatalık klonları / alternatifleri de var: bu StackOverflow sorusuna bakın
Carson63000 15:11

@ Carson63000 Evet var, ama şahsen fazla bir şey göremiyorum. Ruby, IronRuby'de bir .Net dilidir. Sadece bir IronRuby projesi oluşturun ve gerçek salatalık kullanın.
George Mauer

BDD'yi seviyorum ve StoryQ kullanıyorum. Hikayenin Given / When / Then ile senarios'a genişletilebileceğini belirtmeyi unutmayın. Verilen bazı şeyler oldu Bunu yaptığımda Ve bu O zaman bu ve bu bekliyoruz. David Starr'ın bununla ilgili konuşmasını TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 adresinden kontrol edin ve ayrıca .net storyq.codeplex.com
Bronumski

3

Bu fikirden ilk testime nasıl geçebilirim? Başlamadan önce ne kadar karar vermeliyim ve test yazmaya başladıktan sonra ne kadar çözeceğim?

Uygulamanızı ısırık büyüklüğünde hikayelere bölün. ("Bir kullanıcı olarak, bir simgeye çift tıklayıp programı başlatmak istiyorum." Veya "Bir kullanıcı olarak, tarayıcımı açmak ve programa gitmek istiyorum." Her neyse.)

Sonra hikayeyi bazı görevlere ayırın. (örn. Eclipse'de bir proje oluşturun, bir kod havuzu oluşturun) Bir kodlama görevine geldiğinizde, ilk testinizi yazın.

Verileri bir metin dosyasında mı yoksa veritabanında mı depolamak gibi kararları ne zaman alırım?

Emin değilseniz, hangisinin daha basit göründüğünü seçin ve bunu yapın. (muhtemelen metin dosyası) Bir hata yaptığınızı fark ederseniz, yeniden düzenleyin. Testleriniz iyi yapılandırılmışsa, arka ucu değiştirebilmeli ve ortaya çıkan istenmeyen yan etkileri yakalayabilmelisiniz.


3

Ben cevapların hiçbiri gerçek bir söz içerdiğini şaşırdım şey bunu yapmak doğru etmektir İlk testinizi, yazmadan önce bir test listesi oluşturmak . Bir test listesi, diğer cevaplarda bahsedilen hikaye yazma ve tasarım aşamaları tarafından bilgilendirilir ve aradığınız bir testin yazılmasının doğrudan öncüsüdür.

TDD hakkında daha fazla bilgi için, Kent Beck tarafından Örnek Teste Dayalı Geliştirme öneriyorum . Ayrıca , sürecin her adımında Kent'in açıklamaları ile saf bir TDD tarzında önemsiz olmayan bir kütüphanenin gelişimini takip eden bir TDD screencast'ı var. Sanırım bu, pratikte TDD'nin (zorunlu olarak) yapmacık bir ortamda yapılsa bile harika bir örneği.


0

İlk birim testinden önce ne olmasını istediğinizi ve sonra bunu nasıl test edeceğinizi düşünürsünüz. Sonra bu testi yazın, başarısız olduğunu görün ve geçmek için bazı kodlar uygulayın.

Durulama, tekrarlama vb.

Benim için, bunu nasıl test edeceğinizi düşünmek önemli ve tasarımınızı yönlendiren şey bu.

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.