TDD olumsuz deneyim [kapalı]


94

TDD deneyiminizin olumsuz tarafı nedir? Can sıkıcı ve işe yaramaz bebek adımları (testi yeşil yapmak için en basit düzeltme) buluyor musunuz? Değeri olmayan testleri (test başlangıçta mantıklı olduğu halde ancak son uygulamada diğer testlerle aynı mantığı kontrol ettiğinde) buluyor musunuz? vb.

Yukarıdaki sorular TDD deneyimim sırasında rahatsız olduğum şeyler hakkında. Bu yüzden diğer geliştiricilerin de benzer duygulara sahip olup olmadığına ve onlar hakkında ne düşündüklerine ilgi duyuyorum.

TDD’nin olumsuz yönlerini tanımlayan makalelere bağlantılara müteşekkir olur (Google, olumlu ve sıklıkla fanatik makaleler ile doldurulur).


10
Tahminime göre, insanların olumsuz deneyimleri hakkında çok fazla dürüst cevap duymuyorsunuz, çünkü TDD hala bir şekilde “erken evlat edinen” bir durumdaydı ve denemek için yeterince ilgilenen ve kararlı olan çoğu insan yeterince tarafsız değil onu göreceli değerlerine göre değerlendirir. Endüstrinin yeni süreç ve tekniklerin uzun vadeli etkilerini gerçekten ortaya koyması genellikle birkaç yıl alır ve o zaman bile kontrollerin yetersizliği nedeniyle doğru cevaplar almak zordur. Yine de iyi bir soru ve faydalı cevaplar alma konusunda bol şanslar!
Aarona,

20
İnternette olumsuzluk bulmakta zorlanıyor musunuz ?!
Eric Wilson,

4
@Job (ve muhtemelen başka): TDD hakkında birimin test edilmediğini sorduğunu unutmayın. TDD! = Birim testi.
n1ckp

2
Bu soruyu cevaplamaya cazip geliyorum, ancak gerçekten başlamak istemiyorum çünkü günümün yarısını alacak.
Rei Miyasaka

2
Kendimi böcekler için yeterince zaman harcadığımı bulduğumda, yazmadan önce yazdığım her şey için test yazmak için daha az zaman harcayabileceğimi düşünüyorum, her şeyden önce TDD'yi test etmeyeceğim. Bunun yerine kafamı utanç içinde asıp yeni bir kariyer aramaya başlayacağım. Söylediğin hatalardan değil mi? Tasarım? Evet. Bu kadar. İşte bu kadar. Kendine bir güvenlik ağı ve aptalca çalışmaya devam etmek için bir lisans vererek sağlam tasarım hakkında lanet olası bir şey öğrenmedin. IDE'yi bir kenara bırakın ve asıl sorunu keşfetmek istiyorsanız kodunuzu okumayı deneyin.
Erik,

Yanıtlar:


94

"Çevik" başlığının altına giren her şey gibi, TDD teoride iyi gelen bir şeydir, ancak pratikte ne kadar iyi olduğu net değildir (ve aynı zamanda çoğu "Çevik" şey gibi, yapmazsanız size söylenir. beğen, yanlış yapıyorsun.

TDD'nin tanımı taştan yapılmadı: Kent Beck gibi adamlar derleyici olmayan bir testin tek bir kod satırından önce yazılmasını ve her bir kod satırının başarısız bir testi geçmek için yazılmasını istiyor. Ön tasarım az ve her şey yönlendiriliyortestlerle. Sadece işe yaramıyor. Bu metodoloji kullanılarak geliştirilen büyük bir kurumsal uygulama gördüm ve umarım kariyerimde gördüğüm en kötü kod (çok uzak olmayacak; ve bunun üzerinde çalışan yetenekli geliştiricilerin olmasına rağmen). Gördüklerimden, işlev çağrılarının meydana geldiğini doğrulayan çok sayıda kötü düşünülmüş testle sonuçlanmasına, değişkenler boş olduğunda ve alaycı çerçevenin kapsamlı bir egzersiz yapması durumunda istisnaların ortaya çıkmasına neden olur (whoop-de-whoop); Üretim kodunuz bu testlere büyük ölçüde bağlı kalıyor ve sürekli ve kolay yeniden düzenleme işleminin rüyası görünmüyor - aslında insanların bozacakları tüm testler nedeniyle hatalı kodu düzeltmesi daha da az olası.

Tersine, insanların TDD'nin, mimari tasarımın yanı sıra planlama aşamasının bir parçası olarak testleri ileri düzeyde tasarlamak anlamına geldiğini iddia ettiğini duydum. Bu testler geliştirme sırasında daha fazla bilgi mevcut olduğunda değişebilir, ancak dikkatlice değerlendirilmiş ve kodun gerçekte ne yapması gerektiği konusunda iyi bir rehber sunmuşlardır. Bana göre bu çok mantıklı.


7
+1 "Önceden Testleri Planlama Aşamasının Bir Parçası Olarak Öncelikle Tasarlamak - Mimari Tasarımla Birlikte " Bana da çok daha mantıklı geliyor.
Steven Jeuris

11
@Aaronaught Agile planlama yapmak demek değildir , sadece zaman planlaması demektir .
Adam Jaskiewicz

25
@Adam Jaskiewicz: "Önceden plan yok" olayını seviyorum. Hadi, planlama tanımı gereği açık . Önceden plan yapmıyorsanız ancak etkinlik sırasında hiç plan yapmıyorsanız; doğaçlama yapıyorsun. ;-)
CesarGon

34
@Adam - "İnsanlar gerçekten bir yinelemenin ilk gününde doğrudan kodlamaya mı atlarlar?" erm evet. Bu "Çevik" adam. En son çalıştığım yer (ve "Çevik" olmadığı için kovulduğum yer), tek bir kod satırı planlamadan ya da tek bir sayfa belgeleme işlemi yapmadan 3 ay süren bir yayın süresinin tamamını yaptılar. Ve evet, kod çok kötüydü ve evet, yazılım yavaş, tıknaz ve adamcağız. Katıldığım gün, yönetici tarafından "Londra'daki en çevik dükkan" olduklarını gururla söyledim. Kesinlikle öyleydi.

7
Başka bir sorun ekleyebilir: testi geçtiği sürece, iyi olacaktır. Testin kendisinin kusurlu olabileceğini ve bu nedenle yanlış negatiflere ve / veya yanlış pozitiflere neden olabileceğini unutmayın. Ve tabii ki "% 100 test kapsamı" gerektiren ve bunun gibi bir şey tanımlaması mükemmel olan, aslında hiçbir şeyi test etmeyen, sadece% 100 kapsama alanını elde etmek için yazılan, kapsama sayacınız yorum saydığı için belgelenmemiş kod olan yararsız testlere neden olan açığa çıkarılan kod, vb. gibi
18'de

66

Bu ( Clojure yazar) Rich Hickey röportajı aşağıdakileri içerir. % 100 sempatik hissediyorum:

Hayat kısa ve bir günde sadece sınırlı sayıda saat var. Bu yüzden zamanımızı nasıl harcadığımızla ilgili seçim yapmak zorundayız. Test yazarak geçirirsek, o zaman başka bir şey yapmak için harcama yapmayız. Her birimiz, sonuçlarımızı hem nicelik hem de nitelik olarak en üst düzeye çıkarmak için zamanımızı en iyi şekilde nasıl harcayacağımızı değerlendirmek gerekiyor. Eğer insanlar zamanlarının yüzde ellisini test yazma harcadıklarının sonuçlarını en üst düzeye çıkardığını düşünüyorlarsa - onlar için tamam. Bunun benim için doğru olmadığından eminim - o zaman sorunumu düşünerek geçirmeyi tercih ederim. Benim için bunun zamanımın diğer kullanımlarından daha az hatayla daha iyi çözümler ürettiğinden eminim. Komple bir test paketi ile kötü bir tasarım hala kötü bir tasarımdır.

Donald Knuth bir başka benzer ifade Çalışma de Kodlayıcılarda kitap röportajımızdan-yapıştırılan kopya burada :

Seibel: Pratik çalışmalardan bahsetmişken, Bilgisayar Programcılığı Sanatı Çalışması'nın ortasında, dizgi sisteminizi TeX yazmak için on yıllık bir ara verdiniz. Anladığım kadarıyla TeX'in ilk versiyonunu bilgisayardan tamamen uzak tuttunuz.

Knuth: 1977 ve '78 yıllarında TeX'i orjinal olarak yazdığımda, elbette okuryazar programlamam yoktu, fakat yapılandırılmış programlama yaptım. El yazısıyla büyük bir deftere kurşun kalemle yazdım. Altı ay sonra, tüm projeyi tamamladıktan sonra, bilgisayara yazmaya başladım. Ve ben '78 ekim ayında hata ayıklama yaptım. Bunun kodu Stanford arşivlerinde - hepsi kalemle yazılmış - ve elbette geri gelip ne olması gerektiğini öğrendiğim gibi bir alt rutini değiştirirdim. Bu, ilk nesil bir sistemdi, bu yüzden, bir süre yaşayana ve orada ne olduğunu öğrenene kadar, birçok farklı mimarinin mümkün olması ve atılması gerekiyordu. Ve bir tavuk-yumurta sorunuydu; yazı yazana kadar yazı yazamazdınız, sonra yazı yazana kadar yazı yazamadı. Fakat yapısal programlama bana değişmezler ve nasıl anlayabileceğim kara kutular yapmayı bilme fikrini verdi. Bu yüzden nihayetinde hata ayıklayacağımda kodun işe yarayacağına dair güvenim vardı. Herhangi bir şeyi test etmeden altı ay beklediysem çok zaman kazanacağımı hissettim. Kodun yaklaşık olarak doğru olduğuna yeterince güvenmiştim.

Seibel: Ve zaman tasarrufu, tamamlanmamış kodu test etmek için iskele ve taslak oluşturmak için zaman harcamak zorunda kalmayacağınız için mi?

Knuth: Doğru.


24
Bence yaptığınız iş türüne bakmak zorundasınız. Knuth ve Hickey, yeni (yenilikçi) uygulamaların tasarımından bahsediyor. TDD'nin popüler olduğu yerlere bakarsanız (geniş kapsamlı), o zaman TDD biçiminde yazılmış uygulamaların çoğunun zaten iyi bilinen bir mimariye sahip olduğunun farkına varırsınız.
sebastiangeiger

4
Rich Hickey'in ne anlama geldiğini anlayabiliyorum, ama şunu eklemek istiyorum: Deneyimim, testleri yazarken, gerçekten tasarımınızı düşünmeniz ve kodunuzu nasıl test edilebilir hale getireceğinizi düşünmeniz gerektiği, deneyim, daha iyi tasarımla sonuçlanır.
Niklas H

3
OP'nin TDD ile olumsuz deneyimler talep ettiğini görünce hiçbiri TDD'nin bir örneğini göstermediğinden bu örnekle ilgili hiçbir örnek bu soruya uygun görünmüyor.
Winston Ewert,

5
@Michael Borgwardt: Uygulamadaki hataları gidermek için mevcut ve iyi bir tasarıma testler eklemek nispeten kolaydır. Ancak kötü tasarımdan kurtulmak çoğu zaman tam bir yeniden yazma anlamına gelir. Bu yüzden temel amaç tasarımın doğru yapılması; yürütmeyi daha sonra düzeltmek daha kolaydır.
Joonas Pulakka

4
İş uygulamalarının çoğu, Donald Knuth tarafından yazılmış olma ve / veya korunma avantajına sahip değildir. Bir uygulamanın ömrü genellikle birincil geliştirmeden çok daha uzundur. Keşke insanlar benim mevcut projem hakkında daha fazla test yazmışlardı. Şimdi bakım sonsuz gerileme mayın tarlası gibidir.
Matt H

58

TDD ile olan olumsuz tecrübem ilk oldu. TDD bana harika geliyordu, yıllarca QA yaptım ve hala dehşet aklımdaydı. Bir böcek yapmadan önce her böceği ezmek istedim. Maalesef, TDD'yi kullanmak iyi testler yazacağınızı garanti etmiyor. Aslında benim ilk yatkınlığım basit kod üreten basit testler yazmaktı. Birkaç soyutlama içeren gerçekten basit bir kod. Sınıf içindekiler ile iç içe geçmiş gerçekten basit testler. Ve birkaç bin itty bitty testi yaptırdıktan sonra, çok önemli etki alanı kavramı X'i kullanmak için kodunuzu yeniden düzenlemek için yüzlerce kişiyi değiştirmek zorunda kaldığınızda daha hızlı hareket ediyormuş gibi hissettiğinizden emin değilsiniz.

Işık bana geldi - TDD test etme becerisi değildir. Bu bir tasarım yeteneği. Yalnızca pratikte iyi, basit, uygulanabilir bir koda ve sizi yönlendirdiği tasarım yönlerine dair sürekli farkındalığa yönlendirebilir. Kod kapsamı uğruna testler yazarsanız, kırılgan testler oluşturacaksınız. Soyutlamaları tasarlamanıza yardımcı olacak testler yazıyorsanız, yukarıdan aşağıya kod yazmanın daha zorlu bir yolu. İlk önce kodu arayanın bakış açısıyla görüyorsunuz, bu da bir sınıfın iç dünyasını dış kenarına yansıtmak yerine hayatını kolaylaştırmaya teşvik ediyor.

TDD'nin faydalı olduğunu düşünüyorum ama bu konuda dogmatik değilim. Bu "değersiz testler" bakımları zorlaştırıyorsa - Sil! Testleri kodun geri kalanıyla aynı şekilde ele alıyorum. Yeniden kırılabilir ve işleri daha basit hale getirebilirse, o zaman yapın!

Kişisel olarak görmedim, ancak bazı yerlerin kod kapsamını ve test sayımlarını takip ettiğini duydum. Öyleyse metrik toplama TDD'nin yan etkisi ise, bunu olumsuz olarak da görebiliyorum. 1000 kod satırını coşkuyla silerim, ve bu 20 testi geçersiz kılarsa ve kod kapsamımın% 'sini düşürürse, peki.


7
Paragraf 2'yi çiviledin.
Sheldon Warkentin

4
“Kişisel olarak görmedim, ancak bazı yerlerin kod kapsamını ve test sayımlarını takip ettiğini duydum” Böyle bir ortamda yaşadım ve gerçekten hiçbir kod atılmadı çünkü bunu yapmak bir testin başarısız olmasına neden olacaktı. Gerçek testlerin hatalarını ayıklamaya başlayana kadar ve bu kadar ciddi kusurları olan çoğu kişiyi testlerin geçmesi için yanlış sonuçlar üretmeye zorladı. O zaman şu soruyu sorardım: “Testleri kim test ediyor?” TDD topluluğundan hiç tatmin edici bir cevap alamadım. Birim testleri için birim testleri, kimse?
jwenting

@jwenting - Bu fıkra, Rei'nin argümanını oldukça hoş bir şekilde destekliyor. TDD'nin regresyon koruma yönünün, teoride sağlam bir fikir olsa bile pratikte devrildiğini gördüm. Testlerin çalışması için üretim koduyla aynı seviyede tutulması gerekir ve üretim dışı kodu bu şekilde ele almak biraz doğal değildir - aynı "kod çürümesini" donanım simülatörleri, kod üreteçleri ile görüyorum, vb her zaman.
Steve Jackson,

"Sınıf içindekilerle iç içe geçmiş gerçekten basit testler" <- sorununuz işte burada. Sadece ortak arayüzlerde test edin. TDD! = UT
Steven A. Lowe

2
@ StevenA.Lowe - Şimdi biliyorum, ama 9 yıl önce çok net değildi :) "TDD bir test etme becerisi değil"
Steve Jackson

41

Burada bir uzuv üzerinde çıkacağım ve acımasız bir dürüstlükle kelimenin tam anlamıyla bir ritüelist zaman kaybı olduğunu ilan edeceğim . (Çoğu durumda.)

TDD'yi de tartışan Birim Testi hakkında bir kitap aldım ve UTD'nin yararlarına katılırken, TDD'yi denemeden yaklaşık yüz saat sonra, onca nedenden dolayı vazgeçtim. Buraya çapraz gönderme yapıyorum ama TDD:

  1. Gerçek dokümantasyondan daha iyi dokümantasyon değil.
  2. Hata ya da gerileme yakalamaz .
  3. Bazı fonksiyonel programlama ve beste kavramlarını uygularsam, tasarımlarımı, sonuçta olduklarından daha iyi yapmaz .
  4. Kod incelemeleri yapmak veya dokümanları ve spesifikasyonları parlatmak için daha iyi zaman harcanması gerekebilir.
  5. Yüzlerce yeşil simgenin bir listesini gördüklerinde yöneticilere sahte bir güvenlik hissi verir.
  6. Sınırlı giriş-çıkış eşlemeli algoritmaların uygulanmasında üretkenliği arttırır.
  7. Ki sen olabilir sakar mı biliyorum sen TDD sonucu ne yaptığını, ancak herhangi bir kazanç değildir anlayış sizin tasarımları yaptıkları şekilde çıkıp neden o kadar iyi çalışır neden.

Diğer bir endişe, başarılı bir şekilde yapmak için TDD'yi yapması gereken tartışmalı mükemmellik derecesidir. Bazıları TDD ekipteki herkes tarafından projenin başlangıcından itibaren ısrarla yapılmazsa, yalnızca acı çekeceğiniz konusunda ısrar ediyor. Diğerleri hiç kimsenin kitapta TDD yapmadığı konusunda ısrar ediyor. Bunların ikisi de doğruysa, TDD uygulayıcılarının farkına veseler de etmeyecekleri acı çekiyorlar.

Tabii ki, TDD benzeri bir şekilde işler yaparak TDD ile kolayca çalışabilecek tasarımlara geleceğiniz tartışılıyorsa, bunu başarmanın çok daha hızlı yolları vardır - yani, aslında kavramları inceleyerek Birleştirmeyi. Dışarıda pek çok kaynak var, hatta birçoğu titiz matematiksel teori bile (büyük ölçüde işlevsel programlamada ama aynı zamanda diğer alanlarda). Neden tüm TDD zamanlarını öğrenerek harcamıyorsun ?

Kültürel olarak, TDD ritüel bir pratik olmanın belirtilerini gösterir. Suçluluk duygusuna biniyor; anlayışı anlama prosedürünü teşvik eder; tonlarca doktrin ve slogan var (“yapana kadar sahte” objektif olarak bakarsanız çok endişe vericidir). Wikipedia'nın "ritüel" kelimesini tanımı aslında oldukça açık:

Psikolojide, ritüel terimi bazen teknik olarak, bir kişi tarafından kaygıyı etkisizleştirmek veya önlemek için sistematik olarak kullanılan tekrarlayıcı bir davranış için kullanılır; obsesif-kompulsif bozukluk belirtisidir.


Çok ilginç bakış açısı yeniden: ritüel. Ayrıca, bazı çevrelerde, bir programcının zanaatına olan bağlılığının yalnızca TDD'ye bağlı kalmasıyla orantılı olduğuna karar verildiği hissine kapılıyorsunuz.
yalestar

Bazı durumlarda bir tasarımı geliştirebileceğini söyleyebilirim, ama çoğunlukla tasarımın çok iyi tanımlanmış ve kullanımı kolay bir ortak arayüzle yüksek modüler olması gerekiyor. Bu durumlarda kütüphanenin kendisini uygulamadan önce testler yazmak, halk arayüzündeki hataları gidermeye ve bu modülerliği zorlamaya yardımcı olabilir.
07

8
jwenting İnsanlar TDD yapar çünkü bir tasarımı modüler kılan şeyleri bilmiyorlar, bu yüzden 35 "eğitim tekerleklerini asla 40" motorlarından çıkaramazlar. Kavramları anlarsanız , modüler bir tasarım yapmak her zaman yönetilebilir bir görevdir, çünkü tasarımınızdaki her ikilem, kavram olarak, modüler olma sürecinde olduğu için yönetilebilir bir boyutta olacaktır. TDD'nin modülerliği zorlamakta etkili olduğu konusunda hemfikir değilim, ancak bunun modüler tasarımlar oluşturmaya zorlanması gerektiğine katılmıyorum . Modüler tasarım, mükemmel bir şekilde öğretilebilir ve öğrenilebilir bir beceridir.
Rei Miyasaka,

Ortak ara yüzlerin kullanılabilirliği ile ilgili olarak, TDD uygulayıcıları arasında bu konuda her ikisi de istenmeyen iki düşünce okulu vardır: her ikisi de istenmeyen: test edilmeleri için her şeyi halka açık hale getirin ya da eğer test edilmemeleri gerekiyorsa, özel şeyler bırakın . Eski, gereksiz uygulama ayrıntılarının son kullanıcılara (potansiyel olarak yanlış veya istismar edilebilir) maruz bırakılmasını ve ikincisi birim testlerini sistem testlerine daha yakın olmaya zorlar. Tabii ki, özellere erişmek için birim test araçlarını kullanabilirsiniz, ancak TDD'de yapılması pek bir şey ifade etmiyor.
Rei Miyasaka,

1
@Kall Bu röportajda, "sadece% 15 ila% 35 daha fazla zaman" diyor. Çalışma aynı zamanda sadece Java / C ++ / C # (muhtemelen tarih verilen C # 2) - aynı zorunlu OOP paradigmasının tüm dillerini içermektedir. Kesinlikle işlevsel bir dilde (ve hatta C # 3'te)% 15'in üzerinde ve muhtemelen% 35'in üzerinde daha üretkenim ve durumsuz, düzeltilebilir kod yazarken çok daha az hata üretiyorum; çünkü her iki şey de aynı sorunları çözüyor. Başka bir deyişle, elbette, böceklerde% 60-90 azalma, fakat neye kıyasla ?
Rei Miyasaka

18

Eklemek istediğim TDD ile ilgili başka bir endişem:

TDD , geliştirme ekibinin odak noktasında Kalite Kodundan Test Testleri ve Kod Kapsamına kadar yanlışlıkla kaymaya neden oluyor ! Şahsen TDD'yi sevmedim, çünkü beni daha az yaratıcı yapıyor ve yazılım geliştirmeyi sıkıcı bir mekanik işlem yapıyor ! Birim test senaryoları, makul bir şekilde kullanıldığında kullanışlıdır, ancak yazılım geliştirme hedefine bakıldığında yük olur.

Bir teknik direktör olan ve teknik olarak sıkıcı olan bir adamı TDD'ye takıntı haline getirdiğimi biliyorum. Zayıf mimarisi olan yazılımında en az korunabilir kod ile tüm sorunlara sihirli çözümler getireceğine inanması onun için böyle büyülü bir şeydi. Bu projeye ne olduğunu söylememek, elindeki sefilce başarısız oldu, tüm testisleri yeşildi. TDD'nin "davalarımın 99 / 100'ü yeşil" vb. Gibi bir çeşit istatistiki bilgi edinmesine yardım ettiğini ve tasarımdaki kaliteyi asla değerlendiremeyeceği veya iyileştirmeler öneremeyeceği için takıntısının sebebi buydu.


2
PHB cehenneme benziyor! Bana bonus programları sunan şirketleri hatırlatıyor - tabii ki ne olur, kalite koduna odaklanmak yerine, geliştiricilerin bonus gereksinimlerini ne olursa olsun yerine getirmeye odaklanmaları. Kaçınılmaz olarak, crappier kodu alırsınız (Burada ayrıca mevcut bankacılık krizine bir benzetme var :-))
TrojanName

TDD, Proje Yönetimi tekniği değildir, bu nedenle wannabe yöneticinizin başarısız olması şaşırtıcı değildir. Öte yandan daha az yaratıcı hissetmiyorum, daha da yaratıcı hissediyorum çünkü testler geliştirmek otomatik olarak bana kodumla ilgili başka bir fikir veriyor. Ancak, odağın üretim kodu olması gerektiğine katılıyorum ve testler iyi bir yazılım mimarisi oluşturmamalı.
Alex

Kod kapsamı TDD değil , Birim Testi ile ilgilidir . TDD sadece ortak arabirimler aracılığıyla özelliklere ve testlere önem veriyor.
Steven A. Lowe

14

Birincil olumsuz tecrübem, TDD'yi, hiç test yapmayan veya çok temel entegrasyon testlerine sahip olmayan bir programcının kodunu düzenlemek için kullanmaya çalışmak. Bir özellik eklemeye gittiğimde veya belirtilen kodla ilgili bir sorunu çözdüğümde; Önce bir test yazmayı tercih ederim (TDD yolu). Maalesef, kod sıkı sıkıya bağlı, ve çok fazla yeniden düzenleme yapmadan hiçbir şeyi test edemiyorum.

Yeniden yapılanma yine de harika bir alıştırmadır, ancak kodu test edilebilir duruma getirmek için gereklidir . Ve bu adımdan sonra, değişikliklerimin bir şeyleri kırıp kırmadığını görmek için hiçbir kontrolüm ve dengem yok; Uygulamayı çalıştırmak ve her kullanım durumunu incelemek.

Öte yandan, bir TDD projesine özellikler / hataların eklenmesi çok kolaylaşıyor. Doğası gereği, TDD ile yazılmış kod genellikle çalışmak için küçük parçalarla ayrıştırılır.

Her durumda, TDD bir kılavuzdur. Maksimum verimlilik elde ettiğiniz noktayı takip edin. İyi test kapsamı ve ayrıştırılmış kod, iyi yazılmış kod.


1
Birim testleri yazmak zorsa, endişelerin genel olarak kötü bir şekilde ayrılması söz konusu değildir. Bunu TDD'nin suçu olarak görmüyorum, eğer bir şey bu sorunları çabucak ortaya çıkarırsa.
Tom Kerr

7
Bu TDD ile olumsuz bir deneyim değil, bu crappy kod ile olumsuz bir deneyim.
Rei Miyasaka

13

Sistemin tasarımına gelince, bazen testlerime çok güvendiğim deneyimini yaşadım. Nitty-gritty uygulama detaylarında, büyük resme bakmak için geri adım atabilmek için temelde çok düşük. Bu genellikle gereksiz yere karmaşık bir tasarımla sonuçlanır. Biliyorum, kodu tekrar gözden geçirmem gerekiyor, ancak bazen adımı daha sık geri alarak çok fazla zaman kazanabileceğim izlenimini edindim.

Bununla birlikte, mimari kararlarınızın çok sınırlı olduğu raylar gibi bir çerçeveniz varsa, bu sorunlar temelde mevcut değildir.

Diğer bir sorun da testlerinize kör olarak güvenmenizdir. Gerçek şu ki - diğer tüm kodlar gibi - testlerinizde de hatalar olabilir. Bu nedenle, uygulamanıza doğru yaptığınız testler konusunda kritik olun.


2
Belki de testleriniz için bazı testler yazmalısınız! : p ...... Ben Çocuk, Ben Çocuk
Aren,

+1 +1 +1 +1 (3 sahte hesabım olsaydı). # 2 cümle çok anlayışlı ve çok yaygın olan TDD onay önyargısından muaftır.
tgm1024

11

TDD'nin büyük bir hayranı olarak bazen bu dezavantajları görüyorum

  • Neredeyse% 100 kod kapsamı uğruna çok fazla test yazma isteği. Bence test yazmak gerekli değil
    • basit mülk alıcılar / alıcılar için
    • Bir istisna atıldığında her durum için
    • Bu aynı işlevi farklı katmanlar arasında kontrol eder. (Örnek: Her parametre için giriş onayını kontrol etmek için en içindeyseniz, tüm bu testleri bir entegrasyon testi ile de tekrarlamanıza gerek yoktur)
  • Benzer kodlar için test kodunun bakım maliyetleri, yalnızca biraz farklı olabilir (kod çoğaltma yoluyla oluşturulabilir (diğer bir deyişle kopyala-yapıştır ile kalıtım yoluyla)). Zaten bir tane varsa, benzer bir tane oluşturmak kolaydır. Ancak, test kodunu yeniden gözden geçirmezseniz, yardımcı yöntemlere kod çoğaltmayı ortadan kaldırarak iş kodunuzun uygulama ayrıntıları değişirse testleri düzeltmek için biraz zamana ihtiyacınız olabilir.

  • Zaman baskısı altındaysanız , yapılan testleri düzeltmek yerine, bozuk testleri sınamak (veya yorumlamak) için istekli olabilirsiniz . Bu şekilde testlere olan yatırımınızı kaybedersiniz


2
+1: "Neredeyse% 100 kod kapsamı uğruna çok fazla test yazma eğiliminde.": Bir kez bu tuzağa düştüm ve tüm bu birim testlerini yazarken çok uzun saatler geçirdikten sonra kodumda bulduğum üç hata vardı. ünite testleri kapsamına girmez ve adım adım kodun hatalarını ayıklayarak kolayca bulunabilir.
Giorgio

9

TDD'nin değerli olduğu bir oyun geliştiricisi olarak birden fazla senaryoya rastlamadım. Ve olduğu durum, doğada tamamen matematiksel olan ve aynı anda çok sayıda uç vakayı test etmek için katı bir yaklaşıma ihtiyaç duyan bir kod parçasıydı - nadir bir ihtiyaç.

Belki bir gün, bir gün fikrimi değiştirebilirim, ancak XP uygulamaları arasında, acımasızca yeniden düzenleme fikri ve kendi biçimini geliştiren kod fikri çok daha önemlidir ve benim için en büyük üretkenliğe yol açar. James Newkirk'in bir makalesinden bir alıntı :

Basitlik - "İşe yarayabilecek en basit şey nedir?"
Mesaj çok açık. Bugünün gereksinimleri göz önüne alındığında, yazılımınızı tasarlayın ve yazın. Geleceği tahmin etmeye çalışmayın, geleceğin açılmasına izin verin. Bunu genellikle çok öngörülemeyen şekillerde yapar ve beklentiyi genellikle karşılaması çok pahalı bir maliyet yapar. ”

Cesaret ve bahsettiği geri besleme döngülerinin sıkılaştırılması kavramları da aklımda üretkenliğin anahtarıdır.


9
Sorun şu ki, birim testleri olmadan acımasızca yeniden yapılanmanın aynı şeyi yapan kodla sonuçlandığını nasıl biliyorsunuz ? Tecrübelerime göre, soruna bağlı olarak , kodları kendi yazmak için yaptığım testlerden + kod yazmaktan daha az zaman alabileceğimi öğrendim ! Bunun nedeni, temelde bazı problemler için, tekrar faktörünü deneyebilir ve otomatik olarak tekrar test edebileceğimden çok daha hızlı bir şekilde tekrar test edebilirim, bu da yinelemelerin hızını oldukça arttırır.
Mark Booth,

6
Oyunlar için, sonuçlar çok sık görülebilir. Görülebilir ve yeterince iyi görünürlerse, bir oyun zaten öznel bir deneyim olması amaçlandığından kabul edilirler. Öte yandan, örneğin alarak. Örnek olarak Diablo 2, savaş formüllerindeki hataların sayısı TDD'nin nerede büyük bir değer getireceğini ve onları yamalar üzerinde büyük miktarda çalışma kurtarabileceğini gösterdi. Denklemleri çözmek gibi çok iyi tanımlanmış problemler için ve bunların çalışma zamanında görsel çıktılar ile değerlendirilemediği durumlarda TDD, doğruluğu sağlamak için bir zorunluluktur. Ancak bu, çoğu oyunda kodun küçük bir kısmıdır.
Mühendis

Ayrıca, simülasyonların uygulanma oranına bağlı olarak, gerçekleri izlemek için gerçek zamanlı olarak ekranda, sim çalışırken izlemek, milyon satırlık günlük dosyalarına bakmaktan daha iyi olacağından bahsetmeye değer.
Mühendis

3
Birim testleri , deneyimlerime göre yeniden düzenlemeyi çok daha kolaylaştırıyor.
Tom Kerr

1
@Nick Oyun endüstrisindeki en büyük sorun, her zaman - "yarım yıl önce teslim etmemiz" olan son tarihlerdir. Zaman kısıtlı ortamlarda zamanın birim testlerine karşı oynadığını düşünüyorum. Bazı durumlarda doğru bir karar değildir, ancak çoğu durumda test yazmadan gönderim daha hızlı olur. Bağlıdır, gerçekten değişir ...
Kodlayıcı

7

Olumsuz sınırlı TDD deneyimim, nereden başlayacağınızı bilmek! Örneğin, ben bir şey TDD yapmaya çalışacağım ve ya nerede bir yukarı yeni can (test önemsiz şeyler engelleme başlamak için hiçbir fikrim yok Foonesneyi, bir de iletebilirsiniz Quuxiçin Baz, ve benzeri. Şeyi test etmiyoruz Testleri ) veya eğer mevcut bir projede uygulamaya çalışıyorsam, TDD'de kullanabilmek için çeşitli sınıfları yeniden yazmak zorunda kalacağımı buluyorum. Nihai sonuç, kavramı tamamen terk etmem.

Muhtemelen, tüm şirkette hangi birim testinin (TDD veya başka bir şekilde) olduğunu ve neden iyi bir şey olduğunu bilen tek kişi olduğumda yardımcı olmuyor.


1
Alay çerçeveler içeri yerdir. Somutlaştırın Fooile Mock nesneler yerine Quuxve Bazdoğrudan, o zaman test etmek ve daha sonra mocks beklediğiniz fonksiyonları ile çağrıldı kontrol etmek istediğiniz işlev çağırabilir. Sahte nesneler, birimleri ayırmaya ve üniteyi test edilebilir hale getirmeye yardımcı olan etkinleştirme teknolojisidir. Singletons kötülük neden sık sık adil değil, çünkü bu olduğunu alay et onları. * 8 ')
Mark Booth,

7

TDD zealotları.

Benim için, kapılarımı çalan uzun bir dinsel saçaklardan sadece bir tanesi, bir şeyleri yapma biçimimin onarılamayacak bir şekilde kırıldığını ve kurtuluşa giden tek yolun İsa, Kent Geri veya Birim Testi olduğunu kanıtlamaya çalışıyorlar.

IMO, en büyük yalanları TDD'nin sizi kurtuluşa daha iyi bir algoritma tasarımı getirecek olmasıdır . TDD'de yazılmış ünlü Soduku çözücüsüne bakın: burada , burada , burada , burada ve burada

Peter Norvig sudoku çözücüsünü TDD kullanarak değil, eski moda mühendislik kullanarak karşılaştırın: http://norvig.com/sudoku.html


Bak bu konuda tartışabiliriz. Ama Fullsail üniversitesinden oyun tasarımı mezunuyumdan beri yapacak çok işim var. Kurslarım ve zorlu işimden yola çıkarak, TDD'nin tembel programcıların çılgınca çizgi (tasarım eksikliği) gelişimini gerçekten bozduğunu söyleyebilirim. Bakın demezdim ama bu doğru: Normal bir üniversitenin CS programına giden çoğu geliştirici çoğunlukla mezun olmadı, ezici bir şekilde kullananların çoğu yazılım geliştirmeye geçmedi ve bunun üzerine pek azının getirdiği , satır satır. Fullsail üniversitesi var
Zombies

Sadece test odaklı geliştirme dersini tamamlayın ve geliştiricileri gerçekten doğru yolda takip edin (bağlantılı bir listeyi c ++ 'da uygulamak yerine).
Zombiler

Bağlantılar bozuk ahbap!
lmiguelvargasf

Bu yıllar sonra, ama @ Zombies, "Onay Yanlılığı" konusuna bakın. Hepimizin üniversitede CS’de öğrettiği şeylerin çoğu tam olarak bu kategoriye giriyor. "Sihirli sayılar" ın elden çıkarılmasına ve C'deki
goto'nun

Lol adam ben trolling oldu ... Ben uzun zaman önce o küçük gem unutmuş olduğunu yazdım.
Zombiler

5

TDD'yi bu "fanatik" makalelerden kullanırsanız, yazılımınızın hatasız olduğu hissine kapılmayacaksınız.


1
Belirli bir girdi kümesi için yazılımınızın belirli bir çıktı kümesi döndürdüğünü bilmek dışında başka bir his var mı?

tdd'nin gelişim süreci olduğunu ve herhangi bir sorunu çözmek için altın kural olmadığını anladığınız sürece, sorun değil. Ancak bu süreci kullanmayı önerenlerin çoğu, gelişim sürecinin ve başka herhangi bir işlem olarak parlak ve karanlık tarafların olduğunu unutmuşlar. Herkese, tdd'yi kullanacak olursanız, özgür yazılım kullanmayacağınızı, çünkü her özelliği kapsayan testleri kullanacağınızı söylüyorlar. Ve genellikle doğru değil. En iyi şekilde, her bir durum için test yapılacaktır (veya en azından özellik), ancak testler programdır (hataları olan) ve sadece kara kutu testleridir.
Dainius

4

TDD'nin bazı faydaları var:

  • Sen odaklanmak nasıl yerine problem çözme odaklı ve sonra uygulamadan bir çağrı tutkal arasında (önce test yazmak gibi) kodu ve ne ilk beklemek aramak için. Modülerlik, alay etmeyi ve sarmayı kolaylaştırır.
  • Testler, programınızın yeniden yapılanmadan önce ve sonra aynı şekilde çalışmasını sağlar. Bu, programınızın hatasız olduğu anlamına gelmez, ancak aynı şekilde çalışmaya devam ettiği anlamına gelir.

TDD uzun vadeli bir yatırımla ilgilidir. Uygulamanızın bakım moduna ulaştığınızda ve bu noktaya ulaşmak için planlanmamışsa, harcamayı asla geri kazanamayabilirsiniz.

TDD'nin kırmızı-yeşil döngüsünü, bebek adımlarının bir uçağın kontrol listesine benzer olduğunu düşünüyorum. Kalkıştan önce uçaktaki her şeyi kontrol etmek can sıkıcıdır ve can sıkıcıdır (özellikle TDD bebeği adım atıyorsa) ancak güvenliği arttırdığı tespit edilmiştir. Her şeyin işe yaradığını doğrulamanın yanı sıra, esasen uçağı sıfırlar . Başka bir deyişle, her kalkıştan önce bir uçak yeniden başlatılıyor.


3
Avantaj noktası 2, TDD yaklaşımı olmadan basit birim testleriyle de elde edilebilir. Fayda 1 ne olursa olsun yapmalısın. (API’ye odaklanma) TDD’yi kullanarak berbat bir API oluşturmak hala tamamen mümkündür, ancak evet, çalışacağına dair garanti verilmektedir (yazılı testler için).
Steven Jeuris

2
Soru TDD'nin faydalarını sormuyordu. Bu konuda zaten pek çok başka soru var.
Aaron,

1
@aaronaught, onun acı noktalarını ele alıyorum.

Cevaplar soruyu ele almalıdır .
Aaron,

1
@aaronaught, sonra bunlardan bazılarını yaz.

3

TDD hakkındaki olumsuz deneyimim, birçok yeni ve sinirli şeyle hissettiğim bir şey. Aslında TDD'den zevk alıyorum çünkü kodumun geçerliliğini sağlıyor ve daha da önemlisi: Yeni kod ekledikten veya herhangi bir yeniden düzenleme işleminden sonra başarısızlık testlerini tanıyabilirim.

TDD hakkında beni rahatsız eden şey, bu konuda çok fazla kural ya da kılavuz olması. Hala oldukça yeni olduğu için, çoğumuz TDD'de yeni başlayanlar olmak için deneyimliyoruz. Öyleyse bazılarımız için iyi sonuç veren, başkaları için işe yaramayabilir. Söylemek istediğim, TDD'yi gerçekleştirmenin gerçek "yanlış veya doğru" bir yolu olmadığı: Benim için çalışan bir yol var - ve eğer varsa benim takımım.

Testler yazdığınız sürece - üretim kodundan önce veya sonra IMHO gerçekten önemli değil - Teste dayalı testin gerçekten doğru olup olmadığından emin değilim, şu anda belirtilen tüm yönergeleri izlemeniz gerekip gerekmediğinden emin değilim. günlük işler için ideal çözüm. Test yazarken daha iyi bir yol bulursanız, bir blogda yayınlamanız, burada tartışmanız veya bunun hakkında bir makale yazmanız gerekir. Bu nedenle, on yıl içinde, hangi TDD kuralının belirli bir durumda iyi veya olamayacağını varsayabileceğini söyleyebilmek için yeterli deneyimi paylaşmış olabiliriz.


+1 Mükemmel yorum. Gerçekten ya tek yol ya da hiç yol olması gerekmiyor.
unpythonic

3

Birden fazla durumda, ertesi gün elimden attığımdan beri sakladığım yazılı bir kod yazdım. TDD ile yeniden başladım ve çözüm daha iyi oldu. Bu yüzden olumsuz TDD deneyimi doğrultusunda fazla bir şey yaşamadım. Ancak, söylendiği gibi, bir problemi düşünmek ve TDD alanı dışında daha iyi bir çözüm bulmak için zaman harcadım .


1
Genelde, ikinci bir girişim, sorunla ilgili size ilk denemeden (TDD ya da değil) daha fazla fikir verecektir.
wobbily_col 12:14

3

TDD'nin yeni çıkan sistemler söz konusu olduğunda düşük performans gösterdiğini gördüm. Ben bir video oyunları geliştiricisiyim ve son zamanlarda TDD'yi bir varlık için gerçekçi görünümlü hareketler oluşturmak için çok basit davranışlar kullanan bir sistem oluşturmak için kullandım.

Örneğin, sizi farklı türlerdeki tehlikeli alanlardan uzak tutmaktan ve farklı türlerdeki ilginç alanlardan uzaklaştırmaktan sorumlu davranışlar vardır. Her davranışın çıktısını değiştirmek, son bir hareket yaratır.

Sistemin bağırsakları kolayca uygulandı ve TDD burada her bir alt sistemin ne için sorumlu olacağını belirlemek için kullanışlıdır.

Bununla birlikte, davranışların nasıl etkileşime girdiğini ve daha da önemlisi zaman içinde nasıl etkileşimde olduklarını belirleme konusunda sorunlarla karşılaştım. Çoğu zaman doğru cevap yoktu ve ilk testlerim geçmesine rağmen KG, sistemin çalışmadığı durumlarda yeni vakalar bulabilirdi. Doğru çözümü bulmak için birkaç farklı davranıştan ötürü yinelemem gerekti ve oyunda çalıştıklarını kontrol etmeden önce yeni davranışları yansıtmak için testleri her seferinde güncellediysem, tekrar tekrar testlerimi atmış olabilirdim. Bu yüzden o testleri sildim.

Muhtemelen QA'nın keşfettiği son vakaları yakalayan daha güçlü testler yapmalıydım, ancak böyle bir sisteminiz olduğunda birçok fizik ve oyun sisteminin üstüne oturuyorsanız ve zamanla davranışlarla ilgileniyorsanız, biraz tam olarak ne olduğunu belirtmek için kabus.

Neredeyse kesinlikle yaklaşımımda hatalar yaptım ve TDD sisteminin bağırsakları için dediğim gibi mükemmel bir şekilde çalıştı ve hatta birkaç optimize edici refaktörü destekledim.

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.