Birim testinin ROI'sine dair sağlam kanıt var mı?


127

Birim testi bana harika geliyor, ancak önemli bir değeri olan diğerlerini ikna edemediğim sürece gerçekten öğrenmek için zaman harcamam gerektiğinden emin değilim. Diğer programcıları ve daha da önemlisi, yönetimdeki fasulye sayıcılarını, test çerçevesini öğrenmek, testleri yazmak, onları güncel tutmak, vb. İçin harcanan tüm ekstra zamanın kendi masrafını karşılayacağına ve daha sonra bazılarının karşılığını alacağına ikna etmeliyim.

Orada ne kanıt var? Biri birim testini kullanan ve diğeri olmayan iki ayrı ekiple aynı yazılımı gerçekten geliştiren ve sonuçları karşılaştıran oldu mu? Şüpheliyim. Bunu sadece "İnternetten bak, herkes bunun hakkında konuşuyor, bu yüzden yapılacak doğru şey olmalı" diye mi haklı çıkarmam gerekiyor?

Uzman olmayan kişileri, birim testinin çabaya değer olduğuna ikna edecek somut kanıt nerede?

Yanıtlar:


98

Evet. Bu, NCST'de Boby George ve Laurie Williams tarafından yapılan ve Nagappan ve diğerleri tarafından yapılan bir başka çalışmaya bağlantıdır . Eminim daha fazlası vardır. Dr. Williams'ın testlerle ilgili yayınları onları bulmak için iyi bir başlangıç ​​noktası sağlayabilir.

[DÜZENLEME] Yukarıdaki iki makale özellikle TDD'ye atıfta bulunmaktadır ve TDD'yi benimsedikten sonra ilk geliştirme süresinde% 15-35 artış, ancak yayın öncesi kusurlarda% 40-90 azalma göstermektedir. Tam metin sürümlerine ulaşamıyorsanız , herkese açık bir sürüm bulup bulamayacağınızı görmek için Google Akademik'i kullanmanızı öneririm .


14
İlk çalışma, Agile + TDD'yi şelale projeleriyle karşılaştırıyor, sonuçları iki Agile takımını karşılaştırmış olsaydı daha alakalı olurdu. İkinci çalışma, TDD projeleri için çok az veya hiç kalite bonusu bulmayan diğer çalışmalardan bahsediyor. Ve TDD için gereken fazladan süre ile ilgili yönetimin tahminlerini karşılaştırdığınızda, yüksek alan uzmanlığına sahip iki ekip için önemli ölçüde daha yüksek olduğu tahmin ediliyor, ancak yine de% 20 daha düşük test kapsamına sahipler. Bu, kendi deneyimimi doğruluyor, henüz çalışmadığım sistemlerde güvenceyi çok daha önemli buluyorum, oysa test diğer her şey için bir engel.
LearnCocos2D

Çalışmaların hiçbiri, karşılaştırılabilir süreç modelini sadece test metodu değişikliği ile karşılaştırmamaktadır. Bu, UT için kullanılan zamanı aslında daha iyi harcanmasıdır, örneğin. sistem testi. Şu anki haliyle, "daha akıllıca test edersek bu işe yarar" dersi de olabilir.
Rune FS

1
Peki ya yayın sonrası hataları düzeltmenin maliyeti toplam geliştirmenin% 0,01'i ise? TDD bu durumda korkunç bir yatırım olacaktır. Ve böcekler azsa? Bu% s, bağlam olmadan hiçbir şey ifade etmez. Adil olmak gerekirse, araştırmanın tamamını henüz okumadım. Ancak, gönderiniz olduğu gibi yararlıdır (iyi bağlantılar) ancak ROI, IMO ile ilgili soruya cevap vermez.
Instine

1
@Instine Neyse ki (?) Durumun böyle olmadığına dair iyi kanıtlar var. Yayın sonrası hataların düzeltilmesi, geliştirmenin başlarında bulunan hatalardan katlanarak daha pahalıdır (TDD'nin yaptığı da budur). Bu bağlamda, tüm yayın sonrası hatalar için toplam geliştirmenin% 0,01'i kadar bir maliyet olası görünmüyor. (Ayrıntılar için bkz. Kod Tamamlandı , özellikle Boehm ve diğerleri , "Yazılım Maliyetlerini Anlama ve Kontrol Etme", IEEE Trans Yazılım Müh (1988)).
Konrad Rudolph

Muhtemelen ilk çalışmanın örneklem büyüklüğünün 24 programcıya sahip olduğunu belirtmek gerekir (çiftler halinde, yani 12 takım). İstatistiksel olarak geçerli bir örneklem büyüklüğünün ne olacağından emin değilim, ancak bunlar düşük görünüyor. Belki başkası biliyordur?
Zachary Yates

29

"Diğer programcıları ve daha da önemlisi, yönetimdeki fasulye sayıcılarını, test çerçevesini öğrenmek, testleri yazmak, onları güncel tutmak vb. İçin harcanan tüm ekstra zamanın kendi masrafını karşılayacağına ve daha sonra bazılarının karşılığını alacağına ikna etmeliyim. "

Neden?

Neden sessizce ve gizlice yapmıyorsunuz? Hepsini bir kerede yapmak zorunda değilsin. Bunu küçük parçalar halinde yapabilirsiniz.

Çerçeve öğrenimi çok az zaman alır.

Tek bir test yazmak çok az zaman alır.

Birim testi olmadan, sahip olduğunuz tek şey yazılımınıza biraz güvenmektir. Bir birim testle, yine de kendinize güveniyorsunuz ve en az bir testin geçtiğine dair kanıtınız var.

Tüm gereken bu. Kimsenin yaptığını bilmesine gerek yok. Sadece yap.


9
Fasulye sayaçları, eğer hayatları buna bağlıysa, kodun geri kalanından bir birim testi söyleyemezdi. Sadece yapmak için öneriyi destekliyorum. Yine de bir uyarı var: Yalnız değilseniz, geliştirici arkadaşlarınızın bu uygulamayı benimsemesine ihtiyacınız var. Aksi takdirde, istemeden testlerinizi bozarlar.
Thomas Eyde

Sadece yapın ve onlara söyleme ve fikri kahve molasında üniversitelerinize sat ;-)
Johan

3
Sürekli olarak teslim tarihlerine uymadığın için kovulacağın için mi?
Andrew

3
@Neko: Birim testleri biraz "ek yük" eklemiyor. Onlar azaltmak dilsiz hatalar bütün bir sel engelleyerek genel iş yükünü. İş büyümez; doğası gereği kötü koddan iyi birim testlerine ve iyi koda geçer.
S.Lott

1
Fasulye sayaçları, mühendislerinin alan sorunlarına sağlam çözümler sağlamasını ister. Çözümünüzün bir parçası olarak testler yazabilirsiniz. Fark etmeyecekler bile. Eğer sorarlarsa, sağlam olduğundan ve yeniden çalışılması gerekmediğinden emin olmak için onlara daha fazla zaman harcadığınızı söyleyebilirsiniz. Onlara birim testleri ÖNERİYORSANIZ, hakkında hiçbir şey bilmedikleri bir şey için onaylarını istiyorsunuz.
Yorkshireman

16

Buna farklı bir yaklaşım benimsiyorum:

Kodunuzun doğru olduğuna dair nasıl bir güvenceniz var? Veya ekibinizdeki biri func1 () 'i değiştirdiğinde X varsayımını bozmaz mı? Sizi 'dürüst' tutan birim testleri olmadan, çok fazla güvenceye sahip olduğunuzdan emin değilim.

Testleri güncel tutma fikri ilginçtir. Testlerin kendilerinin sıklıkla değişmesi gerekmez. Üretim koduna göre 3 kat daha fazla test kodum var ve test kodu çok değiştirildi az . Bununla birlikte, geceleri iyi uyumamı sağlayan ve müşteriye sistemi bozmadan Y işlevselliğini uygulayabileceğime dair güvenim olduğunu söylememi sağlayan şey budur.

Belki akademi dünyasında kanıt vardır, ancak ticari dünyada kimsenin böyle bir test için para ödeyeceği hiçbir yerde çalışmadım. Bununla birlikte, benim için iyi çalıştığını, test çerçevesine alışmanın çok az zaman aldığını ve test yazma beni gerçekten , gereksinimlerimi ve tasarımı düşünmemi sağladığını söyleyebilirim; test yazmadı.

Kendini ödediği yer burasıdır: 1) Kodunuza güveniyorsunuz ve 2) Sorunları normalde olduğundan daha erken yakalıyorsunuz. Sen QA adam hey, xyz () fonksiyonu sınırları daha kontrol? Vermedi rahatsız etmedi" demek yok O çünkü O böceği bulmak için almaz Eğer bir ay önce bulundu. Bu iyi gelir O, sizin için, şirket için ve müşteri için iyi.

Açıkçası bu bir anekdot ama benim için harikalar yarattı. Size elektronik tablolar sağlayabileceğimden emin değilim, ancak müşterim mutlu ve nihai hedef bu.


QA adamım oldukça zekiydi ama koda bakmıyordu, ancak sınırların kontrol edilmediğini söylemek kolaydı.
itsmatt

Sizi pervasızca
kodlamak

7
Müşteriler bize test yazmak için para ödemezler. Sonra yine, bize kod yazmamız için de ödeme yapmıyorlar. Sorunlarını çözmemiz için bize para veriyorlar ve karşılaştıklarında, bahse girerim sorunların çözülmesini de istiyorlar. Kanıtlar göz önüne alındığında, inanılmaz müşterilerin yatırımlarını güvence altına almak istememeleri.
Thomas Eyde

10

Birim Testi olmadan berbat bir yazılım yazmanın mümkün olduğunu somut kanıtlarla gösterdik. Unit Testing ile berbat yazılımlara dair kanıt olduğuna inanıyorum. Ama konu bu değil.

Unit Testing veya Test Driven Development (TDD), bir test tekniği değil, bir Tasarım tekniğidir. Test odaklı yazılmış kod, olmayan koddan tamamen farklı görünür.

Sorunuz bu olmasa da, yanlış sorulabilecek soruları cevaplamanın (ve diğer raporlar tarafından sorgulanabilecek kanıtları getirmenin) gerçekten en kolay yolu olup olmadığını merak ediyorum. Davanız için sağlam kanıtlar bulsanız bile - başka biri aleyhinde sert kanıt bulabilir.

Teknik personelin nasıl çalışması gerektiğini belirlemek fasulye tezgahlarının işi mi? Daha pahalı olanlara ihtiyacınız olmadığına inandıkları için her durumda en ucuz araçları sağlıyorlar mı?

Bu argüman ya güvene dayalı olarak kazanılır (Agile takımlarının temel değerlerinden biri) ya da kazanan tarafın rol gücüne bağlı olarak kaybedilir. TDD taraftarları rol gücüne göre kazansalar bile, onu kayıp olarak kabul ediyorum.


13
duyun, duyun :) TDD ile ilgili somut kanıtların çoğu, onsuz iyi sonuçlar alan çok deneyimli ekiplerden de geliyor. TDD, sonuçlarını basit bir şekilde oluşturmaktan ziyade iyileştirdi. Gerçek YG, iyi kodlayıcıları işe almak ve işleri nasıl yapacaklarına karar vermelerine izin vermektir.
workmad3

"Teknik personelin nasıl çalışması gerektiğini belirlemek fasulye tezgahlarının işi mi?" -> tüm ticari kararlar paraya bağlıdır. Yine de, iyi cevap, +1
jcollum

@jcollum ama işinizi nasıl yaptığınızın parayla hiçbir ilgisi yok ve eğer kubbe birinin sorumlu olmasını istiyorsanız, onlardan istediğinizi NASIL yapacaklarına karar vermelerine izin verin
Rune FS

TDD bir tasarım tekniği değil, sadece bir kodlama tekniğidir. blog.ploeh.dk/2010/12/22/TheTDDApostate Birçok yorumcu, TDD'nin yeniden düzenlemeyi (bu bir tasarım tekniğidir) içerdiğini, ancak yeniden düzenlemenin TDD anlamına gelmediğini kabul etmez. Testler olmadan yeniden düzenleme yapılabilir, büyük karmaşık yeniden düzenleme her halükarda birim testlerini etkiler, yani testlerin de yeniden düzenlenmesi gerekir, böylece geçersiz / yanlış yeşil de olabilir; Daha basit yeniden düzenlemeler çoğu testleri etkilemez ancak hata riski daha düşüktür - çünkü yeniden düzenleme basittir.
KolA

@KolA pekala, bu cevabın 10.5 yıl sonrasındaki yansımasıyla, bugün biraz daha savunmacı diyebilirim ama yine de: TDD'nin ihtiyacınız olan tek tasarım tekniği olduğunu ve Mark bununla açıldığını iddia etmiyorum Bunun bir olmadığı sonucuna varmadan önce iyi bir tasarım tekniği. Fikrini zayıflattım ve bunun tek tasarım tekniği olmaması gerektiğini söyledim . Şimdiye kadar TDD yazdığım her kod, onsuz yazdığım koddan farklı görünüyor. Ben buna tasarımın bir sonucu derim. TDD'ye ek olarak en iyi beyaz tahta, tartışmalar ve diğer araçlarla çalışırım. Ama bağlantı için teşekkürler
Olaf Kock


6

TDD hakkında kesin olarak birim testinden daha fazlası, burada test odaklı geliştirme yoluyla kalite iyileştirmeyi gerçekleştirmek için bir bağlantı var : Nagappan, E. Michael Maximilien, Thirumalesh Bhat ve Laurie Williams'ın yazdığı dört endüstriyel ekip makalesinin sonuçları ve deneyimleri . Microsoft Ampirical Software Engineering and Measurement (ESM) grubu tarafından yayınlanan ve burada zaten bahsedilmiş olan makale .

Ekip, TDD ekiplerinin TDD olmayan ekiplere göre% 60 ila% 90 daha iyi (kusur yoğunluğu açısından) kod ürettiğini buldu. Ancak TDD ekipleri projelerini tamamlamak için% 15 ila% 35 daha uzun sürdü.


5

İşte şirketini içeriden değiştiren bir adamın harika ve eğlenceli bir okuması. TDD ile sınırlı değildir. http://jamesshore.com/Change-Diary/ "Fasulye sayaçlarını" uzun bir süre ikna etmediğini ve bunun yerine "gerilla taktikleri" yaptığını unutmayın.


Bağlantı ilginç görünüyor ... değerinde yeniden kontrol: Değişen organizasyonlar ... iş süreçlerine
pis hamurumsu

5

Sadece bu cevaplara daha fazla bilgi eklemek için, akademik ve endüstri arka planı üzerindeki üretkenlik ve kalite etkilerini bulmaya yardımcı olabilecek iki meta-analiz kaynağı var:

Konuk Editörlerin Tanıtımı: TDD — Korkusuz Programlama Sanatı [ bağlantı ]

Tüm araştırmacılar, TDD'nin daha iyi görev odağı ve test kapsamını teşvik ettiği konusunda hemfikir görünüyor. Daha fazla test olması, yazılım kalitesinin daha iyi olacağı anlamına gelmez, ancak programcının test tasarımına artan ilgisi yine de cesaret vericidir. Testi, çok büyük bir potansiyel davranış popülasyonunu örneklemek olarak görürsek, daha fazla test daha kapsamlı bir örnek anlamına gelir. Her test, diğerlerinden hiçbirinin bulamayacağı önemli bir problem bulabildiği ölçüde, testler yararlıdır, özellikle de onları ucuza çalıştırabiliyorsanız.

Tablo 1. Test odaklı geliştirmeye yönelik seçilmiş deneysel çalışmaların özeti: endüstri katılımcıları *

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

Tablo 2. TDD'nin seçilen ampirik çalışmalarının bir özeti: akademik katılımcılar *

görüntü açıklamasını buraya girin

Test Odaklı Geliştirmenin Dış Kalite ve Verimlilik Üzerindeki Etkileri: Bir Meta-Analiz [ link ]

Öz:

Bu makale, Test Odaklı Geliştirmenin (TDD) harici kod kalitesi ve üretkenliği üzerindeki etkisini araştıran 27 çalışmanın sistematik bir meta-analizini sağlar.

Sonuçlar, genel olarak, TDD'nin kalite üzerinde küçük bir pozitif etkiye sahip olduğunu, ancak üretkenlik üzerinde çok az veya hiç farkedilebilir etkisi olmadığını göstermektedir. Bununla birlikte, alt grup analizi, endüstriyel çalışmalarda akademik çalışmalarla karşılaştırıldığında hem kalite gelişiminin hem de verimlilik düşüşünün çok daha büyük olduğunu bulmuştur. TDD ile kontrol grubunun süreci arasındaki test çabası farkının önemli olduğu çalışmalarda daha büyük bir verimlilik düşüşü bulundu. Akademik çalışmalarda, test çabasındaki fark önemli olduğunda, kalitede daha büyük bir gelişme de bulunmuştur; ancak veri eksikliği nedeniyle endüstriyel çalışmalarla ilgili herhangi bir sonuç çıkarılamamıştır.

Son olarak, geliştirici deneyimi ve görev büyüklüğünün moderatör değişkenler olarak etkisi araştırılmış ve görev boyutu ile kalite gelişiminin büyüklüğü arasında istatistiksel olarak anlamlı pozitif bir ilişki bulunmuştur.


4

Pekala, birim testi kullanmanızı gerektiren bazı büyük şirketler var, ancak küçük bir şirketseniz neden büyükleri taklit edesiniz?

Benim için yıllar önce birim testine başladığımda (bugün çoğunlukla davranış modelini kullanıyoruz) tek bir uygulamadaki tüm yolu kontrol edemememden kaynaklanıyordu.

İlk programlamaya ve bir REPL'e alışmıştım, bu yüzden Birim Testini (Her Fonksiyon için Bir Test) aldığımda, çok fazla derlenen dillere bir REPL geri getirmek gibiydi. Yazdığım her kod satırına eğlenceyi geri getirdi. Tanrıyı hissettim. Bunu sevdim. Daha iyi kod yazmaya daha hızlı başladığımı söylemek için bir rapora ihtiyacım yoktu. Patronumun, çılgınca şeyler yaptığımız için aniden bir son teslim tarihini asla kaçırmadığımızı fark etmek için bir rapora ihtiyacı yoktu. Patronumun, üretken olmayan kod yazmanın bu çok tuhaf özelliği nedeniyle "düz" hataların sayısının (birçok kişiye) neredeyse sıfıra düştüğünü fark etmek için bir rapora ihtiyacı yoktu.

Başka bir posterin zaten yazdığı gibi, Test etmek (doğrulamak) için TDD kullanmıyorsunuz. Ünitenizin (nesne, modül, işlev, sınıf, sunucu, küme) çalıştığı şeyin özelliklerini, davranışını yakalamak için yazarsınız.

Pek çok şirkette farklı bir yazılım geliştirme modeline geçmenin birçok başarısızlık ve başarı öyküsü vardır.

Ne zaman yazacak yeni bir şeyim olsa kullanmaya başladım. İngilizceye çevirmek benim için biraz zor olan eski bir söz var ama:

Yaptığınızı fark etmeyeceğiniz kadar basit bir şeyle başlayın. Bir maraton için antrenman yaparken 9 metre yürüyerek başlayın ve 1 metre koşun, tekrarlayın.


Yani, sadece yapmalı mıyım? Çalışması garantili ve benimle kimsenin yapmaması önemli değil mi?
kuzgun

Aslında bu bir Joel Testi: joelonsoftware.com/articles/fog0000000043.html . Bana öyle geliyor ki, Nobel Ödülü Ödülünün Ünite Testi Üzerine Çalışmasının eksikliğinden daha fazla sorununuz olabilir
Jonke

4

Ünite / entegrasyon testinde bulunan bir hatayı düzeltmenin, canlı sistemde bir kez tamir edilmesinden çok daha az maliyetli olduğunu kanıtlayan istatistikler vardır (bunlar, binlerce gerçek hayat projesini izlemeye dayanmaktadır).

Düzenleme : örneğin, belirtildiği gibi, " Kod Tamamlandı " kitabı bu tür çalışmalar hakkında rapor verir (paragraf 20.3, "Kalite Tekniklerinin Göreceli Etkililiği"). Ancak danışmanlık alanında bunu kanıtlayan özel araştırmalar da var.


1
Bu, muhtemelen başka nedenlerle kitaplığınızda bulundurmak isteyeceğiniz bir kitap olan Steve McConnell's Code Complete'de ele alınmıştır .
Robert Rossney

Bu, test yöntemiyle ilgili değildir, ancak süreçte bir hatanın ne zaman rapor edildiği ve daha sonra, teknik özelliklerdeki hataları bulmak için daha çok zaman harcanır, çünkü geliştirme sırasında bunları bulurken düzeltme maliyeti 1000 kata kadar pahalı olarak rapor edilir (a geliştirme aşaması başına 10 faktör)
Rune FS

OTOH, yalnızca insanların gerçek hayatta karşılaştıkları sorunları düzeltirseniz, muhtemelen çok daha az hatayı düzeltmek zorunda kalırsınız. Ayrıca, hataları daha önce düzeltmenin gerçekten daha ucuz olduğu da benim için net değil, çünkü bir spesifikasyondaki bir hatayı tespit etmek, uygulamada aynı hatayı tespit etmekten çok daha fazla çaba gerektirebilir ve hatayı tespit etmek, hata düzeltme maliyetinin bir parçasıdır. Bu herkesin inandığı şeylerden biri, çünkü kulağa aşikar geliyor, ancak etkisini gösteren bir sağlam çalışma görmedim.
LKM

0

Bunun için bir dizi veri noktam var - birim testlerinde beni satan bir deneyimden.

Aylar önce, büyük bir VB6 projesi üzerinde çalışan yeni bir mezundum ve büyük miktarda saklı yordam kodu yazma fırsatım oldu. Yazdığım alt sistemin tüm kod tabanının yaklaşık 1 / 4'ünü oluşturuyordu - 50K'nın yaklaşık 13.000 LOC'si kadar.

Depolanan prosedürler için bir dizi birim testi yazdım, ancak VB6 UI kodu birim testi Rational Robot gibi araçlar olmadan gerçekten mümkün değil; en azından o zamanlar değildi.

Parça üzerindeki QA istatistikleri, tüm alt sistemde yaklaşık 40 veya 50 kusurun ortaya çıktığı şeklindeydi ve bunlardan ikisi depolanmış prosedürlerden kaynaklanıyordu. Bu, 6.500 kod satırı başına bir kusurdur , tüm parça genelinde 1.000-1.200 başına 1'e karşılık . Ayrıca, VB6 kodunun yaklaşık 2 / 3'ünün hata işleme ve günlüğe kaydetme için ortak kod olduğunu ve tüm prosedürlerde aynı olduğunu unutmayın.

Çok fazla el sallamadan, birim testine kusur oranlarında en azından büyüklük derecesinde bir iyileşme atfedebilirsiniz.

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.