Joel's Test'in teste dayalı gelişimi neden eksik?


23

Bu blogu Joel Spolsky tarafından daha iyi kodlamak için 12 adımda okuyordum . Teste Dayalı Geliştirme'nin yokluğu beni gerçekten şaşırttı. Bu yüzden soruyu Gurus'a atmak istiyorum. TDD gerçekten çabaya değmez mi?


13
Bu makale 09 Ağustos 2000 Çarşamba (yaklaşık 12 yıl önce) yazılmıştır. TDD'nin o zamanlar buralarda olmadığı, ancak bugünlerde yaptığı neredeyse vızıltıyı sevdiğine inanmıyorum.
Mike

12
Joel testi sadece bir dizi genel rehberdir. “İşe değer” olan her şey oraya sığamaz.
yannis

2
Bir yazılım ekibinin kalitesini değerlendirmek için kendi sorumsuz, özensiz sınavımla geldim. Bunun en iyi yanı, yaklaşık 3 dakika sürmesi ... Joel Test'in en güzel yanı, her soruya hızlı bir şekilde evet veya hayır getirmenin kolay olmasıdır. Gün başına kod satırı veya çarpma başına ortalama hata noktası bulmak zorunda değilsiniz … ' - projenizin TDD'den faydalanıp faydalanmayacağına karar vermek, ve , çarpma noktası başına ortalama hata bulmayı gerektirebilir - bu yüzden listede yok
gnat

Joel Stack plz. Bu ilginç bir q.
Erik,

Bundan daha yetkili olmadığı için doğrudan Joel'den bağlantı kuran ve alıntı yapan cevabı kabul etmelisiniz. Bkz programmers.stackexchange.com/a/189493/6586
Bryan Oakley

Yanıtlar:


30

Kent Beck'in önce test odaklı geliştirme hemen hemen hiç bilinmiyordu kitap iki yıl, 2002 yılında çıktı sonra Joel o yazı yazdım. O zaman soru, Joel'in testini neden güncellemediği ya da TDD'nin 2000 yılında daha iyi bilinmesi durumunda, bunu kriterleri arasına dahil etmesi halinde olur mu?

Yapamayacağına inanıyorum, basit bir nedenden ötürü, önemli olan şey, o sürecin belirli ayrıntılarına değil, iyi tanımlanmış bir sürece sahip olmanızdır. Belirli bir sürüm kontrol sistemi belirtmeden sürüm kontrolünü önermesi veya belirli bir marka önermeden hata veritabanına sahip olmasını tavsiye etmesinin nedeni budur. İyi takımlar sürekli olarak kendilerini geliştirir ve uyarlarlar ve o sırada kendi durumlarına uygun olan araçları ve süreçleri kullanırlar. Bazı takımlar için bu kesinlikle TDD demektir. Diğer takımlar için çok değil. TDD'yi kabul ediyorsanız, kargo kültü zihniyetinin dışına çıkmadığından emin olun .


1
Ayrıca ... oh TDD'yi biraz vurduysan Kool Aid noktası değil mi?
Erik,


27

Joel bunu özellikle birkaç yerde ele aldı.

Test testlerinin pek çok önemli sorunu, özellikle de “bu yazılımın kullanıcı arayüzü berbat ediyor mu?” Gibi öznel konuları yakalayamadığını açıkladı. Ona göre , Microsoft'taki otomatikleştirilmiş testlere aşırı güvenmek, Windows Vista ile nasıl sonuçlandığımızla ilgili.

Deneyiminde, kullanıcıların gerçekte buldukları hata türlerinin iki kategoriye ayrılma eğiliminde olduğunu yazdı: 1) programcıların kullanmadan önce kendi kodlarını koyduğunu tespit ettiği ortak kullanımda ortaya çıkanlar , veya 2) kenar davaları, hiç kimsenin, ilk etapta onları kapsayacak sınamalar yazmayı düşünmeyeceği konusunda belirsizdir. FogBugz'de ve ekibinin düzelttiği hataların çok küçük bir yüzdesinin, birim testlerinin yakalayabileceği türden bir şey olduğunu belirtti. (Bu makaleyi şimdi bulamıyorum, ancak hangisini kastettiğimi bilen biri varsa, buradaki bağlantıyı düzenlemek için çekinmeyin.)

Ve özellikle projeniz birçok ünite testiyle çok büyük bir projeye büyüdüğünde, daha sonra bir şeyi (kasıtlı olarak) değiştirdiğinizde ve çok sayıda kırık ünite testiyle sonuçlandığında , bunun değerinden daha fazla sorun olabileceğini yazdı . Ünite testinin neden olabileceği problemleri, Joel'in test etmesi için 13. bir nokta olarak eklememesinin nedeni olarak, insanların yapması gerektiğini önermesine rağmen bile kullanır.


2
Aslında haklısın. Joel'in normal MO'si saman adamdır. TDD'nin benim için hiç böcek yakalayamayacağı gibi, bu yüzden iyi olamaz. TDD'nin test ile ilgili olmadığı noktasını gözden kaçıran şey tasarımla ilgili. Geride kalan testler bir bonus. Ya da küçük bir değişimin birçok birim testini kıracağını iddia etmek, bu sadece yanlış yaptığı anlamına gelir. Ya da saldırmadan önce bir SOLID ilkesini tamamen yeniden yazmak için. Bu tarz bir şey. Aslında döngüsel mantığı kullanan savunucuları, o değil.
pdr

7
Joel'in bu yorumlarına tamamen katılıyorum. Daha büyük bir sorunun dil olduğunu düşünüyorum - birçok dinamik dilde, birim testi olmadan bir şey yapmayı hayal bile edemiyorum - basit bir yazım yolunun kritik bir zamana kadar görmeyeceğiniz bir soruna neden olup olmayacağını nasıl söyleyebilirsiniz? an? Statik olarak yazılmış, hataları azaltmak için tasarlanmış derlenmiş dillerde, tüm en basit hatalardan uzak duruyorsunuz ve çoğunlukla mantık hataları kalıyor. Bu TDD tarafından sağlanan tam kapsama tipine olan ihtiyacı azaltır.
Bill K

2
@MasonWheeler: Derleyici / tip emniyetinin ünite testlerine duyulan ihtiyacı ortadan kaldırdığını ciddi bir şekilde tartışıyor musunuz? Ayrıca TDD'nin tasarım faydalarını isteyerek de görmezden geliyorsunuz ama daha da önemlisi, her şeyi yeniden düzenleyen çok güzel bir zaman geçirmelisiniz. Aksine, bunun tam tersi olduğu görülmüştür: örneğin, TDD metodolojisini izleyen .NET geliştiricileri, kendilerini artan bir şekilde yararsız olan bir derleyiciyi memnun etmek için yazmak için ihtiyaç duydukları kod miktarından dolayı kendilerini aniden rahatsız ediyorlar.
pdr

2
pdr: Öncelikle “birim testlere duyulan ihtiyacın” tip emniyet eksikliği olduğunu ciddiye aldım. Ve bir .NET geliştiricisi olmadığım için, deneyimleri hakkında gerçekten çok fazla şey söyleyemem, ancak kendi deneyimlerime göre yeniden yapılanmadaki zorluğun tamamen iki etkene dayandığını gördüm: kodu ilk yazıp yazmamam yer ve yazarın kodu iyi yazıp yazmamış olduğu. (Not: puan 1 ve 2 mutlaka birbirleriyle güçlü bir şekilde ilişkilendirilmez!)
Mason Wheeler

3
@Pdr Unit testleri kodunuzu ispatlamaz, çoğunlukla sözdizimi denetleyicileridir, ancak geliştirme sırasında çok faydalı olabilirler. Entegrasyon ve Sistem testleri olsa çok daha anlamlı. Ayrıca, statik olarak yazılmış dillerdeki çoğu yeniden ateşlemenin güvenli olduğu kanıtlanabilir, aslında yeniden yapılanmanın ne olduğu - kodunuzu değişiklik yapmadan dönüştüren bilinen bir "Güvenli" işlem kümesi. Statik bir dilde, IDE bu değişiklikleri sizin için sık sık yapabilir ve güvenli olduklarından emin olabilir, dinamik dillerde genellikle imkansız bir şeydir, bu nedenle aynı güvenliği sağlamak (kanıtlamamak) için birim testleri gerektirir
Bill K

25

Joel Spolsky, bu soruyu 2009'da tekrar cevapladı :

Joel: Test Driven Development hakkında bir tartışma var ... her şey için birim testleri yaptırmalıysanız, bu tür şeyler ... bir çok insan bana yazmış, Joel Testini okuduktan sonra, "13. yaşın olmalı Burada bir şey var: Birim Testi, tüm kodunuzun% 100 birim testi. "

Ve bu, ihtiyaç duymayabileceğiniz bir şey için biraz fazla doktrinli olduğum için beni vurguluyor. Gibi, çevik programlama fikri, ihtiyaç duymadan önce işleri yapmak değil, gerektiği gibi sayfa hata yapmaktır. Her şeyin otomatik olarak test edilmesi gibi hissediyorum, çoğu zaman, sadece size yardımcı olmayacak. Başka bir deyişle, bu kodun gerçekten işe yarayacağına dair çok sayıda ünite testi yazacaksınız ve işe yarayıp yaramadığını kesinlikle kesinlikle öğreneceksiniz. testleri yaz] gerçekten işe yarıyor ... ... Bilmiyorum, bunun için alevli posta alacağım çünkü o kadar iyi ifade etmiyorum. Ancak, bir ekibin birim testlerini% 100 kod kapsaması dahil etmiş olsaydı, birkaç sorun çıkacağını hissediyorum. Bir, ünite testleri yazmak için çok fazla zaman harcayacaklardı ve o zaman bunun için iyi kalitede ödeme yapamayacaklardı. Demek istediğim, bazı iyileştirilmiş kaliteye sahiplerdi ve kodlarındaki bir şeyi hiçbir şeyi bozmadıkları güvencesinde değiştirme yeteneğine sahiplerdi, ama hepsi bu.

Ancak, keşfettiğim gibi birim testleriyle ilgili asıl sorun, kod geliştikçe yapma eğiliminde olduğunuz değişiklik türlerinin birim testlerinizin sabit bir yüzdesini kırma eğiliminde olmasıdır. Bazen kodunuzda, bir şekilde birim testlerinizin% 10'unu kıran bir değişiklik yapabilirsiniz. Kasıtlı. Çünkü bir şeyin tasarımını değiştirdiniz ... bir menüyü taşıdınız ve şimdi o menüye dayanan her şey orada ... menü artık başka bir yerde. Ve böylece tüm bu testler şimdi bozuldu. Ve kodun yeni gerçekliğini yansıtmak için bu testleri girip yeniden oluşturabilmek zorundasınız.

Sonuçta, projeniz büyüdükçe büyüdükçe, gerçekten çok fazla birim testiniz varsa, bu birim testlerini sürdürmek, güncel tutmak ve sürdürmek için yapmanız gereken yatırım miktarı geçtiklerinde, onlardan aldığınız fayda miktarına orantısız olmaya başlar.


2
Gerçekten mi? Joel'in OP'nin sorusuna kendi cevabını göndermeyi reddetti mi?
Ross Patterson,

1
Bunu anlamak zor. Bazı insanlar oylamayı "bu yararlıdır" yerine "onaylıyorum" anlamına gelir. Kesin olduğu için bu açıkça kabul edilmiş bir cevap olmalıdır.
Bryan Oakley

% 100 test kapsamı olan bir proje üzerinde hiç çalışmadım. Ama eğer% 0 test kapsamınız varsa ... ... bu çok güzel.
Kzqai

Teşekkür ederim! Bunun kabul edilmiş cevap olarak işaretlenmesi gerektiğini düşünüyorum.
Jalal

5

Joel'den başka kimse kesin olarak cevaplayamadı. Ancak bazı nedenleri / gözlemleri deneyebiliriz.

Her şeyden önce Joel'in Testinde sınav yoktur.

  • Testler doğrudan 12 adımda iki kez söylenir (10 ve 12)
  • Yapının varlığı ilk noktalardan biridir. İnşa etme fikri, kırılıp kırılmadıklarını görme kapasitesine sahip olmaktır, bu yüzden burada da test yapmaktan bahsediyoruz.

İkincisi, Joel Test'in bütün fikri (anladığım kadarıyla) hızlı, evet-hayır soruları. "TDD yapıyor musunuz?" tam olarak uymayacak (cevap: "bazılarımız", "kodun o kısmı için" veya "birim testi yapacağız" olabilir).

Üçüncüsü, hiç kimsenin (Joel'in bile) “sadece zamana değer olanların” (bu arada, “programlıyor musunuz” üzerinde olmadığını) işaret etmediğini, sadece bu soruların geldiğinde sorulacak hızlı ve hızlı sorular olduğunu gösterdiğini düşünüyorum. Gelecekte bir ekip üyesi olarak veya bir müşteri olarak bile bir yazılım ekibiyle temas halinde olmak; bu, çevremdeki bazı teknik olmayan insanlara, kendi BT departmanlarının ne kadar iyi / kötü olduğu hakkında ipucu arayan bir liste. Her şey değil, ama üç dakika içinde yenmek gerçekten kötü.


3
"TDD yapıyor musunuz?" kesinlikle evet-hayır sorusu olarak uyuyor. Ve bunun anlamı, herkesin “evet” diyerek yanıtladığı, yani "hayır" anlamına gelen bir soru.
yannis

2
@YannisRizos: "Paranın satın alabileceği en iyi araçları kullanıyor musunuz?" (Evet ... wellllll ... gerekçeyle.) Ve "Programcıların sessiz çalışma koşulları var mı?" (Ohhhh evet ... wellllll ... sessizlik için referans noktanıza bağlı, sanırım.)
pdr

@pdr Açık pencerelerden gelen sirenlerin sesini sessizce düşünmenize bağlı olup olmadığına bağlıdır.
Robert Harvey,

Ayrıca, "Evet, yukarıdan aşağıya tasarım yapıyorum ." ;)
Izkata
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.