Apakah ada bukti kuat dari ROI pengujian unit?

127

Pengujian unit terdengar hebat bagi saya, tetapi saya tidak yakin saya harus menghabiskan waktu benar-benar mempelajarinya kecuali saya dapat meyakinkan orang lain yang memiliki nilai signifikan. Saya harus meyakinkan programmer lain dan, yang lebih penting, penghitung kacang dalam manajemen, bahwa semua waktu ekstra yang dihabiskan untuk mempelajari kerangka pengujian, menulis tes, menjaga mereka diperbarui, dll. Akan membayar untuk dirinya sendiri, dan kemudian beberapa.

Apa buktinya? Adakah yang benar-benar mengembangkan perangkat lunak yang sama dengan dua tim yang terpisah, satu menggunakan unit testing dan yang lainnya tidak, dan membandingkan hasilnya? Aku meragukan itu. Apakah saya seharusnya membenarkannya dengan, "Cari di Internet, semua orang membicarakannya, jadi itu pasti hal yang benar untuk dilakukan"?

Di mana bukti kuat yang akan meyakinkan orang awam bahwa pengujian unit layak dilakukan?

gagak
sumber

Jawaban:

98

Iya. Ini adalah tautan ke studi oleh Boby George dan Laurie Williams di NCST dan lainnya oleh Nagappan et al. Saya yakin masih ada lagi. Publikasi Dr. Williams tentang pengujian dapat memberikan titik awal yang baik untuk menemukannya.

[EDIT] Dua makalah di atas secara khusus mereferensikan TDD dan menunjukkan peningkatan 15-35% pada waktu pengembangan awal setelah mengadopsi TDD, tetapi penurunan 40-90% pada cacat pra-rilis. Jika Anda tidak bisa mendapatkan versi teks lengkap, saya sarankan menggunakan Google Cendekia untuk melihat apakah Anda dapat menemukan versi yang tersedia untuk umum.

tvanfosson
sumber
14
Studi pertama membandingkan tangkas + TDD terhadap proyek air terjun, hasilnya akan lebih relevan jika dibandingkan dua tim tangkas. Studi kedua menyebutkan penelitian lain yang menemukan sedikit atau tidak ada bonus kualitas untuk proyek TDD. Dan ketika Anda membandingkan perkiraan manajemen tentang waktu tambahan yang diperlukan untuk TDD, secara signifikan diperkirakan lebih tinggi untuk kedua tim dengan keahlian domain tinggi, namun mereka juga memiliki cakupan tes 20% lebih rendah. Ini menegaskan pengalaman saya sendiri, saya menemukan kepastian yang jauh lebih penting dalam sistem yang belum saya gunakan, sementara pengujian adalah penghalang untuk hal lainnya.
LearnCocos2D
Tak satu pun dari studi membandingkan model proses yang sebanding dengan hanya perubahan testmethofology. Artinya menghabiskan waktu yang digunakan pada UT sebenarnya lebih baik dihabiskan untuk misalnya. pengujian sistem. Seperti berdiri itu mungkin juga "jika kita menguji lebih pintar apakah itu membantu" belajar.
Rune FS
1
Jadi bagaimana jika biaya memperbaiki bug rilis rilis adalah 0,01% dari total pengembangan? TDD akan menjadi investasi yang mengerikan dalam kasus itu. Dan jika bugnya sedikit? % S ini tidak berarti apa-apa tanpa konteks. Agar adil saya belum membaca seluruh pelajaran. Tapi seperti yang Anda tahu posting Anda berguna (tautan baik) tetapi tidak menjawab pertanyaan tentang ROI, IMO.
Instine
1
@Instine Untungnya, (?) Ada bukti bagus bahwa ini bukan masalahnya. Memperbaiki bug pasca rilis secara eksponensial lebih mahal daripada bug yang ditemukan pada awal pengembangan (yang dilakukan TDD). Dalam konteks itu, biaya pengembangan total 0,01% untuk semua bug pasca-rilis tampaknya tidak mungkin. (Untuk perinciannya, lihat Kode Lengkap , khususnya Boehm & al. , “Memahami dan Mengontrol Biaya Perangkat Lunak”, IEEE Trans Softw Eng (1988)).
Konrad Rudolph
Mungkin perlu dicatat bahwa studi pertama memiliki ukuran sampel sebanyak 24 programmer (bekerja berpasangan, jadi 12 tim). Saya tidak yakin apa ukuran sampel yang valid secara statistik, tetapi ini tampaknya rendah. Mungkin orang lain tahu?
Zachary Yates
29

"Saya harus memberi tahu pemrogram lain dan, yang lebih penting, penghitung kacang dalam manajemen, bahwa semua waktu ekstra yang dihabiskan untuk mempelajari kerangka pengujian, menulis tes, menjaga mereka diperbarui, dll. Akan membayar sendiri, dan kemudian beberapa. "

Mengapa?

Mengapa tidak lakukan saja, dengan diam-diam dan dengan hati-hati. Anda tidak harus melakukannya sekaligus. Anda dapat melakukan ini dalam potongan kecil kecil.

Pembelajaran kerangka kerja membutuhkan waktu yang sangat sedikit.

Menulis satu tes, hanya satu, membutuhkan sedikit waktu.

Tanpa pengujian unit, yang Anda miliki adalah kepercayaan pada perangkat lunak Anda. Dengan satu tes unit, Anda masih memiliki kepercayaan diri Anda, ditambah bukti bahwa setidaknya satu tes lolos.

Hanya itu yang dibutuhkan. Tidak ada yang perlu tahu Anda melakukannya. Lakukan saja.

S.Lott
sumber
9
Penghitung kacang tidak bisa mengatakan unit test dari sisa kode jika nyawa mereka bergantung padanya. Saya mendukung saran untuk melakukannya. Namun ada satu peringatan: Jika Anda tidak sendirian, Anda perlu rekan pengembang Anda untuk menerapkan praktik ini. Jika tidak, mereka secara tidak sengaja akan merusak tes Anda.
Thomas Eyde
Lakukan saja dan jangan memberi tahu mereka, dan menjual ide ke perguruan tinggi Anda di coffee break ;-)
Johan
3
Karena Anda akan dipecat ketika Anda secara konsisten tidak mencapai tenggat waktu Anda?
Andrew
3
@Neko: Tes unit tidak menambahkan "sedikit overhead". Mereka mengurangi keseluruhan beban kerja dengan mencegah banjir kesalahan bodoh. Pekerjaan itu tidak tumbuh; itu hanya bergeser di alam dari kode yang buruk ke tes unit yang baik dan kode yang baik.
S.Lott
1
Penghitung kacang ingin insinyur mereka untuk memberikan solusi suara untuk masalah domain. Anda bisa menulis tes sebagai bagian dari solusi Anda. Mereka bahkan tidak akan memperhatikan. Jika mereka bertanya Anda bisa memberi tahu mereka bahwa Anda menghabiskan lebih banyak waktu untuk memastikannya kuat dan tidak akan membutuhkan pengerjaan ulang. Jika Anda SUGGEST menulis unit test kepada mereka, Anda meminta persetujuan mereka pada sesuatu yang tidak mereka ketahui.
Yorkshireman
16

Saya mengambil pendekatan berbeda untuk ini:

Jaminan apa yang Anda miliki bahwa kode Anda benar? Atau itu tidak melanggar asumsi X ketika seseorang di tim Anda mengubah func1 ()? Tanpa tes unit membuat Anda 'jujur', saya tidak yakin Anda memiliki banyak jaminan.

Gagasan menjaga agar tes diperbarui selalu menarik. Tes itu sendiri tidak sering harus berubah. Saya mendapat 3x kode uji dibandingkan dengan kode produksi, dan kode uji telah diubah sangat sedikit. Namun, inilah yang memungkinkan saya tidur nyenyak di malam hari dan hal yang memungkinkan saya untuk memberi tahu pelanggan bahwa saya memiliki keyakinan bahwa saya dapat mengimplementasikan fungsi Y tanpa merusak sistem.

Mungkin di dunia akademis ada buktinya, tetapi saya tidak pernah bekerja di dunia komersial di mana ada orang yang mau membayar untuk tes semacam itu. Saya dapat memberitahu Anda, bagaimanapun, bahwa itu bekerja dengan baik untuk saya, butuh sedikit waktu untuk terbiasa dengan kerangka pengujian dan tes menulis membuat saya benar-benar memikirkan persyaratan dan desain saya, jauh lebih banyak daripada yang pernah saya lakukan ketika bekerja pada tim yang menulis tidak ada tes.

Di sinilah ia membayar untuk dirinya sendiri: 1) Anda memiliki kepercayaan diri pada kode Anda dan 2) Anda menangkap masalah lebih awal dari yang seharusnya. Anda tidak memiliki orang QA mengatakan "hei, Anda tidak repot-repot memeriksa fungsi xyz (), kan? Dia tidak bisa menemukan bug itu karena Anda menemukannya sebulan yang lalu. Itu bagus untuk dia, bagus untukmu, bagus untuk perusahaan dan bagus untuk pelanggan

Jelas ini adalah anekdotal, tetapi itu telah berhasil bagi saya. Tidak yakin saya bisa memberi Anda spreadsheet, tetapi pelanggan saya senang dan itu adalah tujuan akhir.

itsmatt
sumber
Orang QA saya cukup tajam tetapi dia tidak melihat kode, tetapi mudah untuk mengatakan batas tidak diperiksa.
itsmatt
Sepenuhnya setuju tentang pengujian unit yang memaksa Anda untuk lebih memikirkan desain dan kebenaran Anda daripada kode secara sembrono
chakrit
7
Pelanggan tidak membayar kami untuk menulis tes. Dan lagi, mereka juga tidak membayar kita untuk menulis kode. Mereka membayar kita untuk menyelesaikan masalah mereka, dan ketika berhadapan, aku yakin mereka juga ingin masalah itu tetap terselesaikan. Mengingat buktinya, pelanggan yang tidak dapat dipercaya tidak ingin mengamankan investasi mereka.
Thomas Eyde
10

Kami telah menunjukkan dengan bukti kuat bahwa mungkin untuk menulis perangkat lunak jelek tanpa Unit Testing. Saya percaya bahkan ada bukti untuk perangkat lunak jelek dengan Unit Testing. Tapi ini bukan intinya.

Unit Testing atau Test Driven Development (TDD) adalah teknik Desain, bukan teknik pengujian. Kode yang digerakkan oleh tes tertulis terlihat sangat berbeda dari kode yang tidak.

Meskipun ini bukan pertanyaan Anda, saya ingin tahu apakah ini benar-benar cara termudah untuk pergi dan menjawab pertanyaan (dan membawa bukti yang mungkin ditantang oleh laporan lain) yang mungkin ditanyakan salah. Bahkan jika Anda menemukan bukti kuat untuk kasus Anda - orang lain mungkin menemukan bukti keras untuk dilawan.

Apakah ini bisnis penghitung kacang untuk menentukan bagaimana orang teknis harus bekerja? Apakah mereka menyediakan alat termurah dalam semua kasus karena mereka percaya Anda tidak membutuhkan yang lebih mahal?

Argumen ini dimenangkan berdasarkan kepercayaan (salah satu nilai dasar dari tim lincah) atau hilang berdasarkan kekuatan peran dari pihak yang menang. Bahkan jika pendukung TDD menang berdasarkan kekuatan peran, saya akan menghitungnya sebagai hilang.

Olaf Kock
sumber
13
dengar, dengar :) Banyak bukti keras untuk TDD juga berasal dari tim yang sangat berpengalaman yang sudah mendapatkan hasil yang baik tanpa itu. TDD hanya meningkatkan hasil mereka daripada membuatnya keluar dari udara. ROI yang sebenarnya adalah mempekerjakan coders yang layak dan membiarkan mereka memutuskan bagaimana melakukan sesuatu.
workmad3
"Apakah ini urusan penghitung kacang untuk menentukan bagaimana orang-orang teknis harus bekerja?" -> semua keputusan bisnis bergantung pada uang. Tetap saja, jawaban yang bagus, +1
jcollum
@ jcollum tetapi bagaimana Anda melakukan pekerjaan Anda tidak ada hubungannya dengan uang dan jika Anda ingin kubah bertanggung jawab, Anda membiarkan mereka memutuskan BAGAIMANA mereka melakukan APA yang Anda minta dari mereka
Rune FS
TDD bukan teknik desain, itu hanya teknik pengkodean. blog.ploeh.dk/2010/12/22/TheTDDApostate Banyak komentator tidak setuju bahwa TDD melibatkan refactoring (yang merupakan teknik desain) tetapi refactoring tidak menyiratkan TDD. Satu dapat refactor tanpa tes, refactoring kompleks besar mempengaruhi tes unit pula yaitu tes perlu refactored juga sehingga dapat menjadi tidak valid / hijau palsu juga; refactor sederhana banyak yang tidak memengaruhi tes tetapi risiko kesalahan lebih rendah - karena refactoring sederhana.
KolA
@ Kola yah, dengan refleksi 10,5 tahun setelah jawaban ini, saya mungkin mengatakannya sedikit lebih defensif hari ini, tapi tetap saja: Saya tidak berpendapat bahwa TDD adalah satu-satunya teknik desain yang Anda perlukan dan Mark membuka dengan itu menjadi teknik desain yang baik sebelum menyimpulkan bahwa itu bukan teknik sama sekali. Saya akan melemahkan pendapatnya dan mengatakan itu bukan satu - satunya teknik desain. Setiap kode yang pernah saya tulis TDD terlihat berbeda dari kode yang saya tulis tanpa. Saya akan menyebutnya sebagai hasil desain. Saya bekerja paling baik dengan papan tulis, diskusi, dan alat-alat lainnya, selain TDD. Tapi terima kasih untuk tautannya
Olaf Kock
6

Lebih lanjut tentang TDD daripada pengujian unit semata, berikut ini tautan ke Mewujudkan peningkatan kualitas melalui pengembangan yang digerakkan oleh tes: hasil dan pengalaman empat makalah tim industri , oleh Nagappan, E. Michael Maximilien, Thirumalesh Bhat, dan Laurie Williams. makalah yang diterbitkan oleh kelompok Rekayasa Perangkat Lunak dan Pengukuran Microsoft (ESM) dan telah disebutkan di sini.

Tim menemukan bahwa tim TDD menghasilkan kode yang antara 60% dan 90% lebih baik (dalam hal kepadatan cacat) daripada tim non-TDD. Namun tim TDD membutuhkan waktu antara 15% dan 35% lebih lama untuk menyelesaikan proyek mereka.

filant
sumber
5

Ini bacaan yang bagus dan menghibur tentang seorang pria yang mengubah perusahaannya dari dalam. Ini tidak terbatas pada TDD. http://jamesshore.com/Change-Diary/ Perhatikan bahwa dia tidak membujuk "penghitung kacang" untuk beberapa waktu dan melakukan "taktik gerilya" sebagai gantinya.

Epaga
sumber
tautannya terlihat menarik ... layak untuk dicek ulang: proses organisasi yang berubah bekerja ...
pasty jahat
5

Hanya untuk menambahkan lebih banyak informasi ke jawaban ini, ada dua sumber daya meta-analisis yang dapat membantu mencari tahu efek produktivitas & kualitas pada latar belakang akademik dan industri:

Pengantar Editor Tamu: TDD — Seni Pemrograman Tak Takut [ tautan ]

Semua peneliti tampaknya setuju bahwa TDD mendorong fokus tugas dan cakupan tes yang lebih baik. Fakta lebih banyak tes tidak selalu berarti bahwa kualitas perangkat lunak akan lebih baik, tetapi peningkatan perhatian programmer terhadap desain pengujian tetap menggembirakan. Jika kami melihat pengujian sebagai sampel populasi yang sangat besar dari perilaku potensial, lebih banyak tes berarti sampel yang lebih menyeluruh. Sejauh setiap tes dapat menemukan masalah penting yang tidak dapat ditemukan oleh yang lain, tes ini berguna, terutama jika Anda dapat menjalankannya dengan murah.

Tabel 1. Ringkasan studi empiris terpilih dari pengembangan berbasis tes: peserta industri *

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

Tabel 2. Ringkasan studi empiris terpilih dari TDD: peserta akademik *

masukkan deskripsi gambar di sini

Pengaruh Pengembangan yang Didorong oleh Uji pada Kualitas dan Produktivitas Eksternal: A Meta-Analysis [ tautan ]

Abstrak:

Makalah ini memberikan meta-analisis sistematis dari 27 studi yang menyelidiki dampak Test-Driven Development (TDD) pada kualitas dan produktivitas kode eksternal.

Hasil menunjukkan bahwa, secara umum, TDD memiliki efek positif kecil pada kualitas tetapi sedikit atau tidak ada efek nyata pada produktivitas. Namun, analisis subkelompok telah menemukan peningkatan kualitas dan penurunan produktivitas jauh lebih besar dalam studi industri dibandingkan dengan studi akademik. Penurunan produktivitas yang lebih besar ditemukan dalam penelitian di mana perbedaan dalam upaya uji antara TDD dan proses kelompok kontrol adalah signifikan. Peningkatan kualitas yang lebih besar juga ditemukan dalam studi akademik ketika perbedaan dalam upaya tes sangat besar; Namun, tidak ada kesimpulan yang dapat diambil mengenai studi industri karena kurangnya data.

Akhirnya, pengaruh pengalaman pengembang dan ukuran tugas sebagai variabel moderator diselidiki, dan korelasi positif yang signifikan secara statistik ditemukan antara ukuran tugas dan besarnya peningkatan kualitas.

Dariusz Woźniak
sumber
4

Nah, ada beberapa perusahaan besar yang mengharuskan Anda menggunakan unit testing tetapi jika Anda adalah perusahaan kecil mengapa meniru perusahaan besar?

Bagi saya ketika saya mulai dengan pengujian unit, bertahun-tahun yang lalu, (hari ini kami lebih banyak menggunakan model perilaku ) itu karena saya tidak bisa mengendalikan semua jalur dalam satu aplikasi.

Saya sudah terbiasa dengan pemrograman bawah pertama dan REPL jadi ketika saya mendapat Uji Unit (Satu Tes untuk Setiap Fungsi) itu seperti membawa kembali REPL ke bahasa yang sangat kompilasi. Itu membawa kesenangan kembali ke setiap baris kode yang saya tulis. Saya merasa tuhan. Aku menyukainya. Saya tidak perlu laporan untuk memberi tahu saya bahwa saya mulai menulis kode yang lebih baik lebih cepat. Bos saya tidak perlu laporan untuk memperhatikan bahwa karena kami melakukan hal-hal gila kami tiba-tiba tidak pernah melewatkan tenggat waktu. Bos saya tidak memerlukan laporan untuk memperhatikan bahwa jumlah bug "biasa" turun dari (ke banyak) menjadi hampir nol karena hal yang sangat aneh dalam penulisan kode non-produktif ini.

Seperti yang sudah ditulis oleh poster lain, Anda tidak menggunakan TDD untuk Menguji (memverifikasi). Anda menulisnya untuk menangkap spesifikasi, perilaku dari apa yang unit Anda (objek, modul, fungsi, kelas, server, kluster) bekerja.

Ada banyak kegagalan dan kisah sukses beralih ke model pengembangan perangkat lunak yang berbeda di banyak perusahaan.

Saya baru mulai menggunakannya kapan pun saya punya sesuatu yang baru untuk ditulis. Ada pepatah lama yang agak sulit bagi saya untuk menerjemahkan ke bahasa Inggris tetapi:

Mulailah dengan sesuatu yang sangat sederhana sehingga Anda tidak menyadari bahwa Anda melakukannya. Saat berlatih maraton, mulailah dengan berjalan 9 meter dan lari 1 meter, ulangi.

Jonke
sumber
Jadi, saya harus melakukannya? Ini dijamin bekerja, dan tidak masalah jika tidak ada orang lain yang melakukannya dengan saya?
gagak
Sebenarnya, ini adalah Joel Test: joelonsoftware.com/articles/fog0000000043.html . Kedengarannya bagi saya bahwa Anda mungkin memiliki lebih banyak masalah daripada kurangnya Studi Penghargaan Hadiah Nobel Pada Tes Unit
Jonke
4

Ada statistik yang membuktikan bahwa memperbaiki bug yang ditemukan dalam tes unit / integrasi berkali-kali lebih murah daripada memperbaiki begitu ada pada sistem live (mereka didasarkan pada pemantauan ribuan proyek kehidupan nyata).

Sunting : misalnya, seperti yang ditunjukkan, buku " Kode Lengkap " melaporkan studi tersebut (paragraf 20.3, "Efektivitas Relatif Teknik Kualitas"). Tetapi ada juga penelitian swasta di bidang konsultasi yang membuktikan hal itu juga.

Gabriele D'Antona
sumber
1
Ini tercakup dalam Kode Lengkap Steve McConnell , yang merupakan buku yang mungkin ingin Anda miliki di rak buku Anda karena alasan lain.
Robert Rossney
Itu tidak terkait dengan metode pengujian tetapi ketika dalam proses bug dilaporkan dan lebih lanjut waktu akan lebih baik dihabiskan untuk menemukan bug dalam spesifikasi karena biaya perbaikan mereka ketika menemukan mereka ketika mengembangkan dilaporkan hingga 1000 kali lipat semahal ( faktor 10 per fase pengembangan)
Rune FS
OTOH, jika Anda hanya memperbaiki masalah yang sebenarnya ditemui orang-orang dalam situasi kehidupan nyata, Anda mungkin harus memperbaiki bug yang jauh lebih sedikit. Juga tidak jelas bagi saya bahwa memperbaiki bug sebelumnya benar-benar lebih murah, karena mendeteksi bug dalam suatu spesifikasi mungkin memerlukan lebih banyak upaya daripada mendeteksi bug yang sama dalam implementasi, dan mendeteksi bug adalah bagian dari biaya perbaikan bug. Ini adalah salah satu dari hal-hal ini yang semua orang percayai karena kedengarannya jelas, tetapi saya belum pernah melihat studi yang menunjukkan efeknya.
LKM
0

Saya punya satu set poin data untuk ini - dari pengalaman yang menjual saya pada tes unit.

Beberapa bulan yang lalu saya adalah lulusan baru yang bekerja pada proyek VB6 besar dan memiliki kesempatan untuk menulis sejumlah besar kode prosedur yang tersimpan. Dari subsistem saya menulis itu terdiri sekitar 1/4 dari seluruh basis kode - sekitar 13.000 LOC dari 50K atau lebih.

Saya menulis satu set unit test untuk prosedur tersimpan tetapi unit pengujian kode UI VB6 tidak benar-benar layak tanpa alat-alat seperti Rational Robot; setidaknya tidak saat itu.

Statistik dari QA pada artikel tersebut adalah bahwa sekitar 40 atau 50 cacat muncul pada seluruh subsistem, yang dua di antaranya berasal dari prosedur tersimpan. Itu satu cacat per 6.500 baris kode vs 1 per 1.000-1.200 atau sekitar seluruh bagian. Ingat juga, bahwa sekitar 2/3 dari kode VB6 adalah kode boilerplate untuk penanganan kesalahan dan logging, identik di semua prosedur.

Tanpa terlalu banyak handwaving, Anda dapat menganggap setidaknya peningkatan tingkat cacat pada tingkat pengujian unit pengujian.

ConcernedOfTunbridgeWells
sumber