Birim testlerle gelişim arasındaki zaman farkı - test yok


132

İhtiyaçlara, aciliyete veya her ikisine de bağlı olarak, geliştirme zamanının genellikle proje başına 1-4 hafta arasında değiştiği, oldukça kısıtlı çalışma ortamına sahip solo bir geliştiriciyim. Herhangi bir zamanda, bazılarının birbirleriyle örtüşen zaman çizelgelerine sahip, yaklaşık 3-4 projeyi ele alıyorum.

Beklenildiği gibi, kod kalitesi zarar görüyor. Benim de resmi sınavım yok; genellikle biraz kırılıncaya kadar sistemin içinde yürümeye başlar. Sonuç olarak, düzeltmek zorunda olduğum önemli miktarda hata üretime kaçıyor ve sırayla diğer projelerimi geri çekiyor.

Bu, ünite testlerinin yapıldığı yerdir. Doğru yapıldığında, üretime kaçanlar, minimum seviyede olsa da, böcekleri saklamalıdır. Öte yandan, yazma testleri oldukça fazla zaman alabilir, bu da benim gibi zaman kısıtlamalı projelerle iyi gelmiyor.

Mesele şu ki, birim test kodunu test edilmemiş kod üzerine yazmak ne kadar zaman farkına sahip olacak ve proje kapsamı genişledikçe bu zaman farkı ölçeği nasıl ölçülecek?


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
maple_shaft

8
Yanlış sorunu çözüyorsun. Çok meşgulsün ve proje yönetimi desteğiniz yok gibi görünüyor. Proje çabasını tahmin ediyor musunuz? Hata düzeltmeleri, toplantılar ve diğer kodlama dışı görevler için zamanınızın% 20'sini ayırıyor musunuz? Ne kadar mesai yapıyorsun?
Tony Ennis,

20
Esasen “Bunu iki kez yapmak için zamanım var, ama bir kez doğru şekilde yapmak için zamanım yok” demenizin farkında mısın?
RubberDuck

5
@RubberDuck aslında "İki kez sıkmak", "Yaz ve test et" den daha az zaman aldığı Test Zamanına Karşı Yazma Süresi olarak ölçülen proje karmaşıklığı eğrisinde bir nokta var. Ben bir bash oneliner bölgesinde bir yerde olabileceğini düşünüyorum.
Lyndon White

Geliştiriciler bir kez hediye aldı ve bir proje iptal edildiğinde teşekkür etti. Ürünün gönderilmeyeceğini bilmemize rağmen daha üretken olabileceğimize dikkat çektim . Bu nedenle, test etmeden gelişmenin avantajlı olacağı bir durum budur.
JDługosz

Yanıtlar:


149

Test yaptıktan sonra test yazmanın maliyeti daha fazla olur.

Bir böcek ne kadar uzun yaşarsa, düzeltmesi de o kadar pahalı olur.

Azalan verim yasası, hata bulunmadığından emin olmak için kendinizi zorbalık içinde test etmenizi sağlar.

Buda orta yolun bilgeliğini öğretti. Testler iyi. Çok iyi bir şey gibi bir şey var. Anahtar ne zaman dengesiz olduğunu söyleyebilir.

Testler olmadan yazdığınız her kod satırı, kodları yazmadan önce testleri yazmış olmanıza göre daha sonra test eklemek için önemli ölçüde daha yüksek maliyetlere sahip olacaktır.

Testlerin olmadığı her kod satırında hata ayıklamak veya yeniden yazmak çok daha zor olacaktır.

Yazdığınız her test zaman alacaktır.

Her hatanın düzeltilmesi zaman alacaktır.

Sadık, önce başarısız bir test yazmadan tek bir kod satırı yazmamanızı söyleyecektir. Test, beklediğiniz davranışa ulaşmanızı sağlar. Test davranışın aynı olduğunu kanıtladığından, sistemin geri kalanını etkilemek için endişelenmeden kodu hızlıca değiştirmenize olanak tanır.

Tüm bunları, testlerin özellik eklemediği gerçeğine karşı tartmalısınız. Üretim kodu özellikler ekler. Ve özellikleri faturaları öder.

Pragmatik konuşmak gerekirse, kaçabileceğim tüm testleri ekliyorum. İzleme testleri lehine olan yorumları görmezden geliyorum. Yaptığımı düşündüğüm şeyi yapmak için bile koduna güvenmiyorum. Testlere güvenirim. Ama ara sıra selamları atıp, şanslı olduklarını biliyordum.

Ancak, birçok başarılı kodlayıcı TDD yapmaz. Bu test etmedikleri anlamına gelmez. Sadece her kod satırının kendisine karşı otomatik bir test yapması konusunda takıntılı bir şekilde ısrarcı değiller. Bob Amca bile kullanıcı arayüzünü test etmediğini itiraf ediyor. Ayrıca, tüm mantığı kullanıcı arayüzünden çıkarmanız için ısrar ediyor.

Bir futbol metaforu olarak (bu Amerikan futbolu) TDD iyi bir yer oyunudur. Yalnızca bir kod yığını yazdığınız ve çalıştığını umduğunuzu test etmek için el ile geçen bir oyundur. Her ikisinde de iyi olabilirsin. Her ikisini de yapamazsan, kariyerin playoff yapmayacak. Her birini ne zaman seçeceğinizi öğrenene kadar superbowl yapmaz. Ancak belirli bir yönde bir dürtmeye ihtiyacınız varsa: yetkililer geçerken bana karşı daha sık görüşüyorlar.

TDD'yi denemek istiyorsanız, işte yapmayı denemeden önce pratik yapmanızı öneririm. TDD yarı yolda yapıldı, yarı yürekli ve yarı eşi bazılarının saygı duymamasının büyük bir nedeni. Bir bardak suyu diğerine dökmek gibi bir şey. Hızlı ve eksiksiz bir şekilde taahhüt ve işlem yapmazsanız, masanın her yerine su damlatıyorsunuz.


68
Çok iyi bir şey gibi bir şey var Ne ya da Buddha büyükannemin kurabiyelerini test
etmedi

3
@NickAlexeev Oradaki tabloyu çok seviyorum. İşaret etmediği şeylerden biri, birim testlerinin (tipik olarak otomatikleştirilmiş olan) kod değiştirildiğinde hata bulmada gerçekten iyi olduklarıdır. Bunun “serbest bırakılmadan önce bulunan böceklere” ve “serbest bırakılmadan sonra bulunan böceklere” ayrıldığını görmek isterim. Birim testleri, regresyona karşı en iyi savunma hattıdır.
corsiKa

3
Bunun çok dengeli bir cevap olduğunu düşünüyorum: herşeyi test etmek, önemsiz şeyler bile zaman kaybı olabilir. Kolayca kırılabilecek karmaşık parçalar için iyi testler yapmak gerçekten yardımcı olabilir. Java'dan C ++ 'a küçük ama önemsiz olmayan bir projeyi taşımayı yeni bitirdim. Önce testleri yaptım ve bu da tüm C ++ uygulamasının kurulmasına rehberlik etti. Tüm testler yeşil olduğunda, yalnızca birkaç kolay sınıfın taşınması gerekiyordu ve sorunsuz geçti. Öte yandan, tüm kod için testler yapmam: bu, uygulamanın çok az kazançla en az 3, 4 gün uzatılmasını sağlar.
Giorgio,

5
Bununla ilgili hafif bir anlaşmazlık: 'Testlerin özellik katmadığı gerçeğine karşı bütün bunları tartmalısınız. Kod özellikleri ekler. Ve özellikler faturaları öder. ' Faturaları ödeyen özellikler olmadığını şiddetle tavsiye ediyorum - çalışma özellikleri. (veya işe yaramaz teslimatlar için insanlara ödeme yapılır mı?). Cevabın geri kalanı tamamen katılıyorum.
Tony Suffolk 66

6
@ TonySuffolk66 haklısın, faturaları ödeyen çalışma özellikleri (flimflam satıcılığını engelliyor) Ancak, TDD bir şeyden çok önce insanlar çalışma özellikleri yaratıyorlardı. Gittikten sonra uzun sürecekler. Unutmayın, TDD disiplinli bir test yöntemidir. Testin disiplinli tek yolu bu değil.
candied_orange

112

Cevapların geri kalanıyla aynı fikirdeyim, ancak zaman farkı sorusunun ne olduğunu doğrudan cevaplamak.

Roy Osherove kitabında , Birim Test Sanatı, İkinci Baskı, sayfa 200, bir takımın diğer takımın test ettiği diğer iki firmanın test ettiği iki farklı müşteri için benzer takımlarla (beceri bakımından) benzer büyüklükteki projeleri uygulamada bir vaka çalışması yaptı.

Sonuçları şöyle gibiydi:

Testlerle ve test olmadan ölçülen takım ilerleme ve çıktıları

Böylece bir projenin sonunda hem daha az zaman hem de daha az hata elde edersiniz. Bu elbette bir projenin ne kadar büyük olduğuna bağlıdır.


32
Örneklem büyüklüğü, bunun bilimsel olduğunu düşünmek için çok küçük ama bence ne kadar insanın yaşadığını temsil ediyor. TDD'yi yaptığımda, fazladan zamanımın çoğunun, birim testlerimin başarısız olmasına neden olan hataları gidermek için harcandığını, testleri kendilerinin yazmayacağını buluyorum. Bu gerçekten fazladan zaman eklemek değildir, yalnızca bu sorunları bulup düzelttiğinizde kayma. Gerçek bir ekstra zaman, bulamayacağınız sorunların giderilmesidir, en azından ilk aşamada.
JimmyJames

7
@JimmyJames İş dünyasında yaygın olarak kullanılan ve henüz bilim dalında büyük ölçüde tekrarlanabilir bir deney yapmanın mümkün olmadığı durumlarda yapılan bir çalışmadır. Onlarla dolu psikoloji dergileri var. "Bilimsel olmayan" doğru kelime değil.
djechlin

25
Neden bu vaka çalışmasının sonucunun tam tersini gösteriyor olsaydı, kitabın ;-);
Doktor Brown,

11
@DocBrown Kaç tane vaka çalışması yapıldığını ve doğru cevaplarla bir tane bulana kadar atıldığını merak ediyorum :-)
gbjbaanb

6
@JimmyJames neredeyse kesinlikle bilim olarak nitelendirilen isimler. Ayrıca başka bir bilim insanı bu çalışmayı "n = 1" vaka çalışmasını okuyabilir, daha fazla çalışmaya değer olduğuna karar verebilir, daha sonra geniş çaplı bir istatistiksel çalışma yürütebilir, hatta uzunlamasına kontrollü bir deney yapabilir ve onaylayabilir veya reddedebilir. Bilim tam olarak böyle işler. Bu şekilde çalışması gerekiyordu. Eğer bilim burada işleri konusunda daha fazla bilgi edinebilirsiniz en.wikipedia.org/wiki/Scientific_method
djechlin

30

Bunu “gerçek dünya ortamında” çalıştığım bildiğim tek bir çalışma var : Test odaklı geliştirme yoluyla kalitenin iyileştirilmesi: dört sanayi ekibinin sonuçları ve deneyimleri . Bunu mantıklı bir şekilde yapmak pahalıdır, çünkü temel olarak aynı yazılımı iki kez (veya ideal olarak daha sık) benzer ekiplerle geliştirmeniz ve sonra hepsini bir başkasına atmanız gerektiği anlamına gelir.

Çalışmanın sonuçları, gelişim süresinde% 15 ile% 35 arasında (çoğu kez TDD eleştirmenleri tarafından alıntı yapılan 2x rakamına yakın hiçbir yerde) yakın bir artış ve salım öncesi kusur yoğunluğunda% 40 ile% 90 arasında bir düşüş olmuştur (! ). Tüm ekiplerin TDD ile önceden bir deneyime sahip olmadığına dikkat edin, böylece zaman içindeki artışın en azından kısmen öğrenmeye atfedilebileceği ve dolayısıyla zamanla daha da aşağıya ineceği varsayılabilir, ancak bu çalışma tarafından değerlendirilmedi.

Bu çalışmanın TDD ile ilgili olduğunu ve sorunuzun çok farklı şeyler olan birim testleriyle ilgili olduğunu, ancak bulabildiğim en yakın konudur.


1
Ek kısıtlamalar koymak daha ilginç olurdu: değişken durum yok, SOLID’i izleyen, statik yazım, nullgüvenme, zorunluluk yerine işlevsel, kod sözleşmeleri, statik analiz, otomatik yeniden düzenleme, IoC konteynerleri yok (ancak DI) vb. birim testlerinin sayısı azalır (ancak kaybolmaz).
Den

24

İyi yapıldığında, yakalanan ekstraların faydaları göz önüne alınmadan bile birim testleriyle geliştirme daha hızlı olabilir.

Gerçek şu ki, kodumu derhal derhal çalıştıracak kadar basit bir kodlayıcı değilim. Kod yazarken / değiştirirken, düşündüğüm şeyi yaptığından emin olmak için kodu çalıştırmam gerekiyor. Bir projede, bunun neye benzemesi bekleniyor:

  1. Kodu değiştir
  2. Derleme uygulaması
  3. Uygulamayı çalıştır
  4. Uygulamaya giriş yap
  5. Bir pencere aç
  6. Başka bir pencere açmak için o pencereden bir öğe seçin
  7. Bu pencerede bazı kontrolleri ayarlayın ve bir düğmeye tıklayın

Ve elbette, tüm bunlardan sonra, doğru bir şekilde yapmak için genellikle birkaç tur atıldı.

Şimdi, birim testleri kullanıyorsam? Sonra süreç daha çok benziyor:

  1. Bir test yaz
  2. Testleri çalıştırın, beklenen şekilde başarısız olduğundan emin olun
  3. Kod yaz
  4. Testleri tekrar çalıştırın, geçtiğini görün

Bu, uygulamanın manuel olarak test edilmesinden sonra daha kolay ve hızlıdır. Hala uygulamayı el ile çalıştırmam gerekiyor (bu yüzden aslında hiç çalışmayan bir işe girdiğimde aptal görünmüyorum), ama çoğunlukla ben zaten sapkınlıkları çözdüm ve sadece bu noktada doğrulama. Genelde, kaydettiğimde testlerimi otomatik olarak tekrar gösteren bir program kullanarak bu döngüyü daha da sıkı hale getiririm.

Ancak, bu test dostu bir kod tabanında çalışmanıza bağlıdır. Birçok proje, birçok teste sahip olanlar bile, yazma testlerini zorlaştırır. Ancak, üzerinde çalışırsanız, otomatik testlerle test etmenin daha kolay olduğu bir manuel kod testine sahip bir kod tabanınız olabilir. Bonus olarak, otomatik testleri etrafta tutabilir ve gerilemeleri önlemek için koşturmaya devam edebilirsiniz.


1
Ve nCrunch gibi bir şey kullanmak, 2. ve 4. adımları keserek geri besleme döngüsünü daha da sıkılaştırabilir.
Mutlu

“Hala uygulamayı el ile çalıştırmam gerekiyor” önemli bir gözlem, IMHO. Gümüş mermi yok.
Den

20

Halihazırda birçok cevap olmasına rağmen, bunlar biraz tekrarlayıcıdır ve farklı bir alış veriş yapmak istiyorum. Birim testleri, yalnızca ve eğer işletme değerini arttırırlarsa değerlidir . Testlerin hatırı için test (önemsiz veya tautolojik testler) veya bazı rasgele metriklere (kod kapsamı gibi) çarpmak, kargo-kült programlamadır.

Testler sadece onları yazmak için gerekli olan zamanda değil aynı zamanda bakım açısından da maliyetlidir. Test ettikleri kodla senkronize tutulmaları gerekir ya da değersizdirler. Her değişiklik için onları çalıştırmanın zaman maliyetinden bahsetmiyorum bile. Bu bir anlaşma kırıcı değil (ya da gerçekten gerekli olanları yapmamak için bir bahane) değildir, ancak maliyet-fayda analizine dahil edilmesi gerekir.

Bu nedenle, bir işlevi / yöntemi test edip etmeyeceğine (veya ne türden) karar verirken sorulacak soru, kendinize 'bu testle hangi son kullanıcı değerini yaratacağım / koruyacağım?' Diye sorun. Bu soruyu yanıtlayamazsanız, başınızın üstünden , o zaman bu test yazma / sürdürme maliyetine değmez. (veya bir olan sorun alanını, anlamıyorum waaaay testlerin eksikliği daha büyük sorun).

http://rbcs-us.com/documents/Why-Most-Unit-Testing-is-Waste.pdf


1
BDD'ye aşina değilim, ancak bunun yöntem / işlev seviyesinden biraz daha kaba bir ayrıntı düzeyinde çalıştığını ve muhtemelen kullanıcı değeri ile daha az hassas bir bağlantısı olduğunu tahmin edeceğim.
Jared Smith,


9
"Testlerin hatırı için test (önemsiz veya tautolojik testler) veya bazı keyfi metrikleri (kod kapsamı gibi) vurmak kargo kültü programlamasıdır." Çok doğru ve çok iyi söylenmiş. Kendinizi serin bir sersem gibi hissedeceğiniz şekilde test edin - kendinizi casus, seçkin bir sporcu olarak düşünün ... Bir "hükümet departmanı" gibi sınama YAPMAYIN. Bilirsin?
Fattie

2
@SteveJessop, katılmıyor, kod kapsamı (bir metrik olma anlamında) doğası gereği keyfidir: makine komut seviyesindeki önemsiz bir programdan geçen yol sayısı (yani sayılan), atom sayısından daha büyük olacaktır Dünya veya muhtemelen görünür evren. Bu test edilebilir değil. Dolayısıyla, herhangi bir “kod kapsamı” iddiası, buluşsal olarak seçilmiş bazı keyfi eşiklere olacaktır. Programcılar, gerçekten önemli olan şeylerin pahasına bu tür ölçüleri oynama konusunda iyidir.
Jared Smith,

2
Ayrıca, testlerin başarısız olduklarında yaklaşık olarak (tam olarak olmasa da) işletme değeri sağladığını ve çözümün test edilen kodu geliştirmek olduğunu söyleyebilirim. Yani TDD kullanıyorsanız, bu otomatik olarak test başına en az bir otomatik olarak gerçekleşir. Tanım olarak yapılan tatolojik testler başarısız olamaz ve bu yüzden işe yaramaz. "Önemsiz" testler için - kariyerimin başında Java TCK ile çalıştığımda, bir API'yi sıfırdan yeniden uygularken bir testin ne kadar önemsiz olduğuna artık şaşırmıyorum ;-) Ancak işletme değeri hemen hemen her zaman sezgisel olarak tahmin edilir, bu yüzden de "keyfi" olur.
Steve Jessop,

9

Bu, çalışmakta olduğunuz kodun karmaşıklığına ve şekline olduğu kadar kişiye de bağlıdır.

Benim için, çoğu projede, birim testleri yazmak, çalışmaları% 25 daha hızlı tamamladığım anlamına gelir. Evet, testleri yazma zamanı dahil bile.

Çünkü işin aslı , kodu yazarken yazılımın yapılmadığıdır . Müşteriye sevk ettiğinizde yapılır ve mutlu olurlar. Birim testleri, bugüne kadar en fazla böcek yakalamak, hata ayıklamak için hataların çoğunu izole etmek ve kodun iyi olduğuna dair güven kazanmak için bildiğim en etkili yöntemdir. Bunları zaten yapmak zorundasın, o yüzden iyi yap.


7
Bence, kayda değer bir deneyim. Pek çok insan TDD'nin uzun vadede kendini amorti eden bir zaman alıcı olmadığının iddiasını duyuyor, sadece daha hızlı, dönem. sonra bir günlüğüne deniyorlar ve acı veriyorlar çünkü 0 deneyimleri var, 0 kitap okumuşlar, pratik yapmıyorlar, sadece sihirli bir şekilde çalışmasını bekliyorlar. TDD'nin sizi daha iyi bir geliştirici yapan sırrı yoktur, hala pratik yapmalısınız, hala düşünmeniz gerekir, yine de iyi eğitimli kararlar vermeniz gerekir.
sara

1
@kai - +1. Denemeden önce haftalarca TDD'yi okudum. Bulabildiğim her şeyi okudum. Kitap okuyorum. Tüm tanınmış çevik blogları örneklerle okudum. XUnit Test Patterns'ı baştan sona okudum . İlk birkaç hafta boyunca hala iki kat daha uzun sürdü.
Jules

2
Katılıyorum. TDD zor. Zihniyet zor. "Önce testleri yaz" diyen ve ücretsiz olduğunu söyleyenler nasıl yapıldığını bilmiyor. Pratik alır.
duffymo

@kai: Benzer nedenlerle birçok insan dokunamaz. Bir kez denediler ve bir saat sonra hala eskisinden daha hızlı
yazmadılar

@ SteveJessop Bu oldukça düzgün bir karşılaştırma olduğunu düşünüyorum. Ya da gerçekten elverişsiz olmak ve 10 dakikalık bir koşu için dışarı çıkmak, yorulmak ve neden bir saatte 10 mil koşmayacağınızı merak etmek. Bu, faydaları almadan önce nasıl çalışmanız gerektiğini gerçekten göstermektedir.
sara,

4

Mesele şu ki, birim test kodunu test edilmemiş kod üzerine yazmak ne kadar zaman farkına sahip olacak ve proje kapsamı genişledikçe bu zaman farkı ölçeği nasıl ölçülecek?

Projenin yaşı arttıkça sorun daha da kötüye gidiyor: çünkü ne zaman yeni işlevler eklerseniz ve / veya ne zaman mevcut uygulamayı yeniden uygularsanız, hala çalışmasını sağlamak için daha önce test edilenleri tekrar test etmeniz gerekir. Bu nedenle, uzun ömürlü (çok yıllı) bir proje için, yalnızca işlevselliği test etmek değil, aynı zamanda 100 kez ve daha fazla tekrar test etmeniz gerekebilir. Bu nedenle otomatikleştirilmiş testlerden faydalanabilirsiniz . Ancak, IMO, bunlar otomatik birim testleri yerine, otomatik sistem testleri ise, yeterince iyidir (hatta daha iyi).

İkinci bir sorun, erken yakalanmadıkları takdirde böceklerin bulunması ve düzeltilmesi daha zor olabilir. Örneğin, sistemde bir hata varsa ve en son değişikliğinizi yapmadan önce mükemmel şekilde çalıştığını biliyorum, o zaman hatayı nasıl tanıttığını görmek için dikkatimi en son değişikliğinize odaklayacağım. Ancak, en son değişikliğinizi yapmadan önce sistemin çalıştığını bilmiyorsam (çünkü sistem en son değişikliğinizden önce düzgün bir şekilde test edilmedi), o zaman hata herhangi bir yerde olabilir.

Yukarıdakiler özellikle derin koda uygulanır ve sığ koda daha az uygulanır; örneğin, yeni sayfaların varolan sayfaları etkileme olasılığı düşük olan yeni web sayfaları ekleme.

Sonuç olarak, düzeltmek zorunda olduğum önemli miktarda hata üretime kaçıyor ve sırayla diğer projelerimi geri çekiyor.

Tecrübelerime göre bu kabul edilemez olurdu ve bu yüzden yanlış soruyu soruyorsun. Testlerin kalkınmayı daha hızlı yapıp yapmayacağını sormak yerine, kalkınmayı daha hatasız hale getirecek şeyleri sormalısınız.

Daha iyi bir soru olabilir:

  • Ünite testi, üretmekte olduğunuz "önemli miktarda hata" dan kaçınmanız gereken doğru türde bir test midir?
  • Önerilecek veya bunun yerine önerilecek başka kalite kontrol / geliştirme mekanizmaları (ünite testlerinin dışında) var mı?

Öğrenme iki aşamalı bir süreçtir: yeterince iyi yapmayı öğrenin, sonra daha hızlı yapmayı öğrenin.


3

Dikkate alınması gereken bazı hususlar, diğer cevaplarda belirtilmeyen.

  • Ekstra Fayda / Ekstra Maliyet, en küçük olanları yazma deneyimine bağlıdır.
    • ilk birim test projemde ekstra maliyetler arttı çünkü çok fazla şey öğrenmek zorunda kaldım ve çok fazla hata yaptım.
    • tdd ile 10 yıllık deneyimden sonra, testleri önceden yazmak için% 25 daha fazla kodlama süresine ihtiyacım var.
  • Daha fazla tdd modülü ile manuel-gui-test ve entegrasyon testlerine hala ihtiyaç var
  • tdd sadece baştan yapıldığında çalışır.
    • Mevcut, büyütülmüş bir projeye tdd uygulamak pahalı / zordur. Ancak bunun yerine regresyon testlerini uygulayabilirsiniz.
  • otomatik testler (son testler ve diğer tür testler) çalışmalarını sürdürmek için bakım const gerektirir.
    • kopyala ve yapıştır yoluyla test oluşturmuş olmak testcode bakımını pahalı hale getirebilir.
    • Büyüyen deneyime sahip test kodu daha modüler ve bakımı daha kolay hale gelir.
  • Büyüme deneyimiyle, otomatik testler oluşturmanın ne zaman değerli olduğu hissine kapılacaksınız.
    • Örneğin, en basit olmayan alıcı / ayarlayıcı / sarmalayıcıların hiçbir yararı yoktur.
    • gui üzerinden otomatik testler yazmıyorum
    • işyerinin test edilebilmesine dikkat ediyorum

özet

Tdd ile başlarken, “zaman kısıtlı çalışma ortamı” altında olduğunuz sürece “pahalıdan yararsız” durumdayken, “pahalı yöneticilerden” kurtulmanızı söyleyen “akıllı yöneticiler” varsa, “maliyetten daha fazla yarar” durumuna ulaşmak zorlaşır. malzeme denemesi "

Not: "ünite testi" ile "izolasyon modülleri izole edilmiştir" anlamına gelir.

Not: "regresyon testi" ile demek istediğim

  • çıktı metni üreten bir kod yazın.
  • Üretimin sonucunun hala aynı olduğunu doğrulayan bir miktar "regresyon testi" kodu yazınız.
  • Regresyon testi sonuç ne zaman değiştiğinde size haber verir (ki bu iyi olabilir veya yeni bir hatanın göstergesi olabilir)
  • “regresyon testi” fikri onay testlerine benzer
    • ... sonuçların fotoğrafını çekmek ve değişmediklerini teyit etmek.

Prova okuma ihtiyacı (sınavın edebi esası?)
JDługosz 19.06.2016

3

Programcılar, çoğu işi yapan insanlarda olduğu gibi, bunu tamamlamanın ne kadar sürdüğünü hafife alır. Bunu akılda tutarak, bir test yazmak için 10 dakika harcamak, gerçekte zamanlarca kod yazarken harcadığınız zamana bakabilir, o zaman test sırasında yaptığınız işlev adı ve parametreleri ile gelmek için harcayacaksınız. . Bu bir TDD senaryosudur.

Test yazmamak, kredi kartı almak gibi bir şey; daha fazla harcama ya da daha fazla kod yazma eğilimindeyiz. Daha fazla kodda daha fazla hata var.

Toplam kod kapsamı olup olmadığına veya hiçbiri olmadığına karar vermek yerine, başvurunuzun kritik ve karmaşık kısmına odaklanmanızı ve orada testler yaptırmanızı öneririm. Bir bankacılık uygulamasında, bu faiz hesaplama olabilir. Bir motor teşhis aleti karmaşık kalibrasyon protokollerine sahip olabilir. Bir proje üzerinde çalışıyorsanız, muhtemelen ne olduğunu ve böceklerin nerede olduğunu biliyorsunuzdur.

Yavaş yavaş başla. Yargılamadan önce biraz akıcılık oluşturun. Her zaman durabilirsin.


3

TDD'yi ve diğer test metodolojilerini destekleyen uzun bir Programcılar kurulu geçmişi var, tartışmalarını hatırlamayacağım ve onlarla aynı fikirdeyim;

  • Test, bağlama bağlı olarak eşit derecede uygun ve verimli değildir. Web yazılımını geliştiriyorum, tüm kullanıcı arayüzünü test etmek için bir programınız olup olmadığını söyleyin ... şu anda excel makroları programlıyorum, gerçekten VBA'da bir test modülü geliştirmeli miyim?
  • Test yazılımının yazılması ve sürdürülmesi, kısa vadede sayılan gerçek bir iştir (daha uzun vadede karşılığını verir). İlgili testleri yazmak ayrıca almak için bir uzmanlıktır.
  • Takım olarak çalışmak ve yalnız çalışmak aynı test şartlarına sahip değildir çünkü takımda yazmadığınız kodu doğrulamanız, anlamanız ve iletmeniz gerekir.

Testin iyi olduğunu söyleyebilirim, ancak erken test ettiğinizden ve kazancın nerede olduğunu test ettiğinizden emin olun.


1
“VBA için gerçekten bir test modülü geliştirmeli miyim?” Kahretsin, yapmalısın. rubberduckvba.com/Features#unitTesting
RubberDuck

Birkaç nedeni vardır Ben benim ihtiyaçlarına uygun doent çünkü bu kullanmaz (Ben en fazla birkaç gün görevleri, kilitli çevreye değilim, halefi 3 partileri rahatsız olmaz). İyi yorum olsa da, dil kendi başına bir bahane değil :)
Arthur Havlicek

Tüm fuar puanları @ArthurHavlicek.
RubberDuck

2
VBA'da sınav yazma hala önemsiz. En içten bazı çerçevelerin sahip olduğu tüm fantezi özelliklere sahip misiniz? Bu daha zor, ancak mainTest()tüm test modüllerinizi çağıran bir program çalıştırmak o kadar da zor değil.
enderland

1

TDD'nin gözardı edilen bir yararı, testlerin değişiklik yaptığınızda yeni hatalar ortaya koymadığınızdan emin olmak için bir güvence görevi görmesidir.

TDD yaklaşımı şüphesiz başlangıçta daha fazla zaman alır ancak paketlenme noktası daha az kod yazmanız anlamına gelir; Tabi olarak dahil ettiğiniz tüm bu ziller ve ıslık, elbette kod tabanına girmez.

Swordfish filminde, hafızanın işe yaraması durumunda bir korsanın kafasına silahla çalışmak zorunda kaldığı ve başkalarının dikkatini dağıttığı bir sahne var. Mesele şu ki, baş boşluğunuz koddayken çalışmak çok daha kolaydır ve bir müşteri sizi çığlık atarken ve diğer önceliklerin sıkıştığı sırada aylar süresinden ziyade yanınızda vaktiniz olur.

Geliştiriciler daha sonra hataları düzeltmenin daha maliyetli olduğunu anlıyorlar, ancak bunu kafasına çeviriyorlar. Şimdi nasıl kodladığınızı kodlamak için günde 500 dolar veya TDD biçiminde yazdıysanız 1000 dolar ödenirse, sizi 2. teklifi yapan kişinin elini ısırırsınız. Testleri bir angarya olarak görmeyi bırakıp para biriktirici olarak görürseniz daha iyi olursunuz.


İlk cümlenizdeki şeye Regresyon testi
kedi,

0

Deneyiminizle ilgili olabilirim - kod tabanımızın neredeyse hiçbir testi yoktu ve çoğunlukla denenemezdi. Gerçekten bir şey geliştirmek için yaş aldı ve prodüksiyonları tamir etmek, yeni özelliklerden değerli zamanlar aldı.

Kısmi bir yeniden yazma için, tüm temel işlevsellik için testler yazmaya söz verdim. Başlangıçta, çok daha uzun sürdü ve üretkenliğim dikkat çekiyordu, ancak sonrasında verimim hiç olmadığı kadar iyiydi.

Bu iyileştirmenin bir kısmı, daha az kesintiye neden olan daha az üretim hatamın olmasıydı -> Herhangi bir zamanda daha iyi odaklandım.

Dahası, testlerde VE hata ayıklama kodunu izolasyonda gerçekten test etmenin yetersizliği - bir test paketi, manuel kurulum dışında, örneğin uygulamanızı başlatma ve ekrana gidip bir şey yapma ... birkaç düzine kez

Ancak başlangıçta verimlilikte bir düşüş olduğuna dikkat edin, bu nedenle zaman baskısının zaten delice olmadığı bazı projeler için test yapmaya başlayın. Ayrıca, bir greenfield projesinde başlatmaya çalışın, birim test eski kodu çok zordur ve iyi bir test takımının nasıl göründüğünü bildiğinizde size yardımcı olur.


0

Sadece önceki cevapları tamamlamak için: test etmenin bir amaç olmadığını unutmayın. Testler yapmanın amacı, başvurunuzun beklenmedik bağlamlar içinde evrim yoluyla beklendiği gibi davranmasıdır.

Bu nedenle, test yazmak bir işletmenin tüm son noktalarının tüm davranışlarını kanıtlamak anlamına gelmez. Bu yaygın bir hatadır. Birçok geliştirici, tüm işlevleri / nesneleri / yöntemleri / özellikleri / vb. Test etmeleri gerektiğini düşünüyor. Bu, yüksek bir iş yüküne ve bir sürü alakasız kod ve testlere yol açar. Bu yaklaşım, çoğu geliştiricinin bütünsel davranışın farkında olmadığı, ancak yalnızca etkileşim alanlarını görebildiği büyük projelerde yaygındır.

Seyrek kaynaklar ve testlerle uğraşırken doğru yaklaşım oldukça açıktır ve sağduyuludur, ancak genel olarak resmileştirilemez: test geliştirme kaynaklarını ilk önce üst düzey işlevselliklere yatırın ve kademeli olarak spesifikliklere inin . Bu, bir noktada, yalnız bir geliştirici olarak, yalnızca birim testine değil, işlevsellik / entegrasyon / etc'ye odaklanacağınız anlamına gelir. Test ve zaman kaynaklarına bağlı olarak, planladığınız ve düşündüğünüz gibi kademeli olarak temel üniter fonksiyonlara. Yüksek seviye testleri, düşük seviye / üniter testleri ele almak ve sahip olduğunuz kaynaklara göre test geliştirme stratejinizi planlamak için gerekli bilgileri sağlayacaktır.

Örneğin, bir işlem zincirini önce kara kutu olarak test etmek istiyorsunuz. Zincirin bir üyesinin davranışının aşırı bir durum olarak değerlendirilmediği için başarısız olduğunu tespit ederseniz, sadece bu üyeye değil diğerlerine de işlevselliği garanti eden testleri yazarsınız. O zaman sen teslim et. Bir sonraki döngü için, bazen ağın başarısız olduğunu tespit edersiniz. Böylece, bu konuyu ele alan ve savunmasız olabilecek modüller üzerine testler yazıyorsunuz. Ve bunun gibi.

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.