TDD ölü basit tanıtım (Test geliştirme odaklı)

8 Cevap php

(Hatta PHP, şimdi benim birincil programlama dili) TDD için bol tanıtımları olmasına rağmen, ben bu konuda biraz sıkışmış hissediyorum.

Arkadaşım bana bir süre önce TDD tanıttı, ama bunu anlamak aslında mümkün değildi - hatta basit görevleri - - Önce her şeyi testleri yazılı ne anlamı var sonunda, onu test etmek için daha verimli görünüyor yalnızca bir şey Bu hata (bu VCS'den çözülebileceğini, hayır mı?) bulmak çok zor olabilir ancak, çalışmıyor.

Yani herhangi bir giriş "artıları" arkasında ölü basit örnekler ve argümanlarla, var mı?

Gibi bir şey "daha iyi tasarıma sahip, çünkü evet, bu, daha iyi - bu örneğe bakmak ..."

Bu basit örnekler .. (idk.) php (mümkün olmalıdır) veya AS3 olsaydı da, bu güzel olurdu.

Teşekkürler.

EDIT: Ben size "test" ve daha sonra işlevi oluşturmak olduğunu anlamak, bu testi geçmesi gerekir. Ama dil söylemek nasıl, hangi sonuçlar olmalıdır? Benim için (. Hiçbir tahrik testi dev aynı şekilde hata ayıklama gibi) bazı fonksiyon ... hata ayıklama o emin görünüyor ve sınamak aramak ve tekrar yapmak ... Ya da?

EDIT 2: Ah ... Ayrıca, bu MVC yaklaşımı uygulanabilir? Ya da daha doğrusu, CodeIgniter Acemi MVC? : D

EDIT 3: yayınlanmıştır google'dan tavsiyeleri, planlar, yollar ve öğreticiler bir demet okuyun. Ben çoğunlukla oldukça iyi görselleştirme var ve ben (umut?) Ben çok maintable kod yazmak düşünüyorum, bu yüzden hala fazladan bir çalışma olarak görüyorum ... - Ben tamamen TDD içine hala değilim

8 Cevap

Bu sadece yeni kod testleri yazmıyor geliştirmek için etkili bir araç olduğunu, ancak bu testler kalır ve mevcut kodlara karşı çalıştırılır ve böylece regression testini oluşturacak nedenlerinden biri.

Bu proje geliştikçe, insanlar devralmak veya katkıda bulunmak, ve bu değişiklikleri, testler beklendiği gibi kod hala çalışır durumda olup olmadığını belirlemek için devam anlamına gelir.

Test etmek zorunda değil yeterince basit yazdım kodu da genişletmek ve zaman (vs kenar durumlarda bakım, yeni gereksinimleri almak için) daha karmaşık hale gelebilir. Eğer hala testler yapıyoruz (ve be-yoluyla sürekli entegrasyon ya da diğer yollarla olmalı) onlar ne kadar bunu üstlenmeden teyit verirseniz, kod hala günde 1 yaptım gibi çalışır.

Ben SimpleTest (PHP) hakkında öğretici gerçekten yararlı olduğu bulundu. Benim için 'TDD launchpad' oldu.

Bkz: http://www.simpletest.org/en/start-testing.html

Ben isterdim:

  1. Kenara birkaç saat ayarlama
  2. Get çalışan bir ham SimpleTest betik
  3. Zihnini aç - Geçerli dev alışkanlıkları ve kısa bir süre için çalışma yollarını unutmak
  4. ... Ve sadece akış ile gitmek - talimatları ve TÜM öğreticiler takip simpletest.org sitede sonuna kadar tüm yol,

Daha sonra - yakın gelecekte

  1. Uygulamaları benimseyerek başlayın - ama yavaş yavaş. Denemek ve tek seferde yapmayın.
  2. Projelerin biriyle oturup birkaç test durumları eklemeye başlamak için bir test klasör ayarlama

Şimdi yukarıdaki adımları yapmaya başlayın. TDD çok kullanışlı neden bu zamana yarın definitely tam olarak anlayacaksınız.

GÜNCELLEME: "1 kenara birkaç saat ayarlayın." Hakkında bir not - bu muhtemelen yapmak için en zor şeydir. Çünkü:

  • Eğer TDD test faydaları dikkate duyarga dışarı koyarak yapıyorsanız - onun muhtemelen bir belirti olduğunu:

    • Sizin dev iş uzun zaman alıyor.
    • Hangi TDD hakkında bilgi edinmek için kenara hiçbir yedek zaman var demektir.
    • Hangisi dev iş uzun zaman alıyor demektir.
    • Hangi TDD hakkında bilgi edinmek için kenara hiçbir yedek zaman var demektir.
    • Vb ....

Çoğu metodolojileri gibi, onu kendi sınırlamaları ve avantajları hakkında ne anlamak için yaşamak zorunda. Geçenlerde bir istemci sunucu uygulaması yazmak zorunda ve konuyla ilgili Kent Beck seminal kitabını (örneğin tarafından TDD) okuduktan sonra metodolojisini kullanmaya denemeye karar verdi. I here üzerinde birçok insan tarafından oldukça iyi yorumladı ama burada benim özeti dir bununla ilgili bir sorum var.

Cons

  • Bu much daha uzun sürer. En azından benim için.
  • Bu yeniden yapılanmanın bir sürü gerektirir. Bu bir avantaj olabilir ama ben ayrı ayrı parçaları test etmek gerekir çünkü sadece ben kıvrık hissediyorum kod parçaları vardır.
  • Çok fazla yazmaya testleri ile coşma olabilir.
  • Yerine ormanın ağaçları odaklanmak ve aktif odağı kaybetmeden kendinizi korumak zorundayız.

Pros

  • Parçaları yeniden korkmaya gerek yok. Benim gereksinimleri bir programlama doğrulanabilir özellikleri var ve bir kodlama seanstan sonra kontrol etmek kolaydır çünkü bu muhtemelen en iyi parçasıdır.
  • Modülerlik. Benim fonksiyonları, küçük sınıflar da bulunur ve modüller yönetilebilir. Gerçi mantı kod önlemek için bazı beceri gerektirir.
  • Belgeler. Testleri ve isimleri bana düzgün dokümanlar yapısı için iyi bir şans verin.
  • Yapısını Yeniden Düşünmek. Her katman test etmek zorunda düzgün parçalar ne hakkında ve nasıl iletişim katı kararlar beni zorlar. Bu çok kıvrımlara tasarım ve çok daha anlaşılır terminoloji yol açtı.

Ben kitap tavsiye ederim. Bu iyi bir okuma ve hangi metodoloji size gerçek anlaşma verecektir. Bu not, her derde deva (çevik fanatikleri diyebilirsiniz aksine) bulunuyor. Siz otomatik TDD yapıyoruz sırf zor kararlar dert değil. Ayarlıyoruz testleri düşünmek zorunda ama bu sadece sorun diş beri biraz doğal görünebilir. Muhtemelen önemli ayrıntıları kaçırmış çünkü ben uzakta web'de bulmak "Ölü basit" tanıtımlar uzak kalmak istiyorum.


Update based on comment: Apropos, coming up with smart designs up front and changing them as you go along, that's how I worked till I tried this. The main differences were that the structure I came up with was smarter than usual since I had continuous refinable feedback (eg. you can't test this, it's too monolithic-break it down, these two things are conceptually separate - see how the tests are mashed up etc.) and that the 'dev' steps I took were small enough to throw away without the guilt of 'wasting time' creeping on me. Basically, the 'dev' stage was more systematic and I had verifiable ways to saying what I'd done (tests either pass or fail).

Birim test yazma noktası önce bu yaparak yazılımı kendisi yazmadan önce yapmak çok doğal görünüyor yazılımınızın şartname yazılı olmasıdır. Nasıl belirli bir işlevi belirli bir girişe cevap verecektir? Daha sonra uygulamayı değiştirmeye karar verirseniz el tüm uygulamayı yeniden test zorunda kalmazsınız.

Ben şahsen article on wikipedia oldukça iyi bir giriş olması için bulabilirsiniz.

Testlerde aşamalı bir yolu, bir işlev hata ayıklama başlattığınızda sadece bir test yazmak için. Bu testler en çok ihtiyaç fonksiyonları için ilk yapıldığı anlamına gelir. Bu belirgin gelişme sürelerini artırmak için genellikle yeterli.

Bu test odaklı geliştirme değil, ama yazmaya testleri ve otomatik test suit çalışan ile rahat alırsınız.

Otomatik test suit harika! Onlar yazdım tüm testleri (test paketi) geçmesi ve hangilerinin başarısız hangi size çalıştırmak ayrı komut / program konum. Elle Testlerin kendiniz yapmak üzere daha test paketi çalıştırmak için daha hızlı. Programı çalıştırmak için daha bazen test paketi çalıştırmak için daha hızlı. Eğer taahhüt zaman, ilk kodu testlerin bir pil çalışır ve herhangi bir başarısız olursa size söyler, böylece de versiyon kontrol sistemi kurabilirsiniz.

Ben bir test koşucu komut ile geliyor Django ile testler yapmaya başladı. Eğer modeli doğru kurulmuş olup olmadığını kontrol etmek için sadece tüm görüş ve şablonlar vb kurmak zorunda değilsiniz, çünkü modeller için testler yararlıdır. El forma veri girerken tutmak zorunda değilsiniz, çünkü form işleme fonksiyonları için testler de mükemmeldir.

Testler olmadan benim form geliştirme iş akışı:

  1. Form arabirimi için HTML / şablon ve formu işlemek için sınıf olun
  2. Form verileri doğrulamak fonksiyonları yazın
  3. Benim tarayıcıda sayfayı açın geçersiz veri ile formu doldurun, gönderin.
  4. Onlar ne bekliyoruz eğer ekran üzerinde yazılı sonuçlarını görmek için inceleyin
  5. Bazı hatalar bulmak ve işlevlerini değiştirebilirsiniz. 3. adıma geri dönün.
  6. Birkaç kez emin tüm kombinasyonlarının düzgün doğrulandığı yapmak için tekrar yapmak ("Öğrenci" işaretli ise, örneğin kimlik numaranızı girmeniz gerekir)
  7. Çalışmak, ya da çünkü müşteri form değiştirmek gerekmez şeyler keşfetmek.
  8. Gerektiği gibi fonksiyonları değiştirin
  9. Geri dönün ve biraz daha formları doldurmak. Firefox otomatik tamamlama bir defada birden fazla alanda çalıştı diliyorum.

Testleri ile:

  1. Formu işlemek için sınıf olun. (Django bu amaçla bir form temel sınıf vardır.) Tüm alanlarını ayarlayın.
  2. Doğrulama fonksiyonları yazın
  3. Geçerli veya geçersiz giriş kombinasyonu için çeşitli testler, her yaz. örneğin, "Öğrenci" ile bir form gönderdiğinde One kontrol ama hiçbir ID #, "Öğrenci" ile bir kontrol ve ID # verilen ancak "Ad", vb
  4. Testleri çalıştırın. Bütün hataların bir listesini alın.
  5. Hataları düzeltmek.
  6. Test sonuçları "Tamam" demek kadar 4-5 tekrarlayın.
  7. Form için HTML sunumunu yapmak

Ben Kent Beck'in kitabı, Test Örnek tarafından Geliştirme Driven tavsiye ederim. PHP kod örnekleri sözdizimsel benzer olan, Java vardır. Bu bir yana, kitap gerçekten TDD iyi bir intro.

Neden TDD?

TDD Yazılım Geliştirme hemen hemen her şeyin cevabıdır. Bu aşırı programlama temel yönlerinden biridir.

Yazılım geliştirme bir azılı öngörülemeyen görevler. Bugün yazarken kodu geçen ay yazmıştı ne bir şey kırmak değil Yetkilendirilenin olan büyük bir proje, bir küçük. TDD Cevap.

Sonra açık bir soru sonraki TDD yapar nasıl olurdu?

Cevap basit. Eğer yazmak ne olursa olsun / Ne işlevi, bunun için bir TDD geliştirecektir. Zaman dönemde size TDDS bir koleksiyon olacak. Eğer yeni bir şey yazmak, o için TDD yazmak ve TDD-koleksiyonu ile bağlarız. TDD-koleksiyonu / ekip projenin ilk günden itibaren yazmıştı tüm TDDS içerir.

Eğer TDD yapmazsanız, proje olursa olsun ya da takım nasıl olurdu dikkatli yandan dışarı olabilir iyi bir şans var. Bu eğilim, küçük gelen büyük projelerde aşamalı olabilir.

Hayır iki geliştiriciler emin aynıdır! Farklı şekillerde aynı şeyi uygulamak için kendi yol var. Tüm bu kod tabanı gidecek. Kendimizi uyum için bir şey olmalıdır. TDD olduğunu ulaşmak için bir çok standart bir yoludur.