Berapa persentase waktu yang dihemat dan dihitung biayanya dengan melakukan TDD.
Saya menganggap persentase perubahan biaya dan imbalan ini selama siklus hidup proyek.
Saya membayangkan tahap awal memiliki biaya yang jauh lebih banyak tetapi sedikit imbalan terlampir. Selanjutnya (selama re-factoring ) Anda mendapatkan manfaat dari tes Anda.
Saya sudah mendengar di mana saja dari 30-50% dari waktu Anda menulis unit test. Namun itu tidak memperhitungkan waktu yang dihemat dari penulisan tes tersebut.
Apa pengalaman semua orang dengan ini?
Wes
Sunting, Whats waktu yang dihemat serta biaya waktu? Dalam memperbaiki bug dan refactorablity?
productivity
tdd
Wes
sumber
sumber
Jawaban:
Dalam pengalaman saya, ini lebih dari 50%.
Setelah Anda menulis tes, solusinya cenderung mudah. Jadi saya pikir tidak aneh menghabiskan 70% - 75% dari waktu Anda menulis tes, tetapi Anda menghabiskan lebih sedikit waktu menulis 'kode produksi' (kode sedang diuji) dan menghabiskan hampir tidak ada waktu dalam debugger .
Semakin cepat Anda menemukan bug, semakin murah untuk memperbaiki, dan TDD sangat membantu dengan itu. Saya telah mengerjakan proyek-proyek di mana 2 bulan terakhir (dari proyek 8 bulan) dihabiskan untuk memperbaiki bug, dan fase itu akan hampir seluruhnya dihilangkan dengan TDD.
Bagi saya, nilai sebenarnya dalam pemeliharaan. Mewarisi basis kode dengan tes membuat Anda tidak terlalu takut untuk mengubahnya. Anda merasa seperti tidak merusak apa pun saat tes masih berlalu. Karena Anda tidak takut untuk melakukan perubahan, Anda bersedia melakukan refactor jika ada sesuatu yang tidak beres. Yang berarti kode dapat dibuat lebih bersih, desainnya bisa lebih baik, dan, secara teori, perubahan dapat diterapkan. Bandingkan dengan kode voodoo yang membuat semua orang takut disentuh.
sumber
Setiap kali Anda menjalankan tes unit, Anda menghemat jumlah waktu yang diperlukan untuk menguji kode secara manual.
30% hingga 50% dari waktu yang Anda kutip sebagai keharusan untuk menulis tes Anda juga diimbangi dengan manfaat memiliki desain perangkat lunak yang lebih baik (dapat diuji).
Katakanlah dibutuhkan empat kali lebih lama untuk menulis tes otomatis seperti halnya untuk melakukan tes secara manual. Itu berarti bahwa keempat kalinya Anda menjalankan tes otomatis Anda, itu membayar sendiri. Setiap kali Anda menjalankan tes otomatis setelah itu, gratis.
Ini berlaku apakah tes ini merupakan tes unit otomatis, atau tes fungsional otomatis. Tidak semua tes fungsional dapat diotomatisasi, tetapi banyak di antaranya yang bisa. Plus, tes otomatis lebih dapat diandalkan daripada seseorang; itu akan menjalankan tes dengan cara yang persis sama , setiap saat.
Memiliki unit test berarti Anda dapat menolak implementasi yang mendasari suatu metode (untuk kinerja atau alasan lain), dan unit test akan memverifikasi bahwa fungsionalitas metode tersebut tidak berubah. Ini terutama berlaku untuk TDD, di mana unit test menentukan fungsionalitas metode.
sumber
TDD sering diukur terhadap kualitas kode daripada waktu dan biaya yang dikeluarkan. Namun, dengan kualitas kode yang lebih baik, pengembang dan orang yang bekerja dengan mereka dapat bekerja lebih baik (lebih sedikit waktu yang dihabiskan, lebih sedikit biaya yang terlibat, lebih bahagia, dll.). http://davidlongstreet.wordpress.com/2009/04/29/new-software-metric-wtfs-per-minute/
Tes menulis sangat bagus untuk membantu mengotomatiskan verifikasi persyaratan fungsional dan non-fungsional. Satu video yang meyakinkan saya untuk mengadopsi TDD (sebenarnya BDD, TDD tingkat tinggi): http://video.google.com/videoplay?docid=8135690990081075324#
Menulis tes fungsional dapat membantu menemukan bug / masalah lebih awal selama fase pengembangan . Asumsikan Anda memiliki basis kode yang besar. Dengan tes unit / spesifikasi , Anda hanya perlu melihat "Semua tes lulus" / "2 tes gagal, lihat baris xyz". Anda hanya perlu tim pengembang untuk melakukan pengembangan dan pengujian. Tanpa tes unit / spesifikasi , Anda harus secara manual membandingkan pernyataan yang dicetak dengan pernyataan yang diharapkan, dan secara manual melacak metode / kelas mana yang memiliki bug. Anda mungkin perlu dua tim terpisah (pengembang dan penguji) untuk melakukan ini.
Tes tertulis membantu pengembang menjelaskan kemajuan dan masalah yang dihadapi.
TDD membantu memenuhi kemampuan pemeliharaan, kemampuan beradaptasi, dan fleksibilitas kode. Ini mendorong pengembang untuk menulis bongkahan kecil yang dapat diuji, dan menyatukannya menjadi bongkahan yang lebih besar yang dapat diuji. Sebaliknya (bagian dari praktik refactoring) juga berfungsi, dengan syarat kami telah menulis tes yang solid. Sebagai hasilnya, kita dapat memiliki kode modular yang ditulis dengan baik.
Dengan TDD, kami senang mengetahui kapan:
TDD bisa membosankan karena proses pengembangan mengambil langkah-langkah kecil, dan dengan demikian menjadi sangat mudah diprediksi.
sumber
Dalam kasus kami, saya perkirakan mendekati 40%. Namun, saya tidak berpikir kami melewati fase di mana itu lebih dari ini. Kami memiliki pembuat kode yang mengeluarkan kerangka kode yang disempurnakan oleh pengembang dan suite uji yang juga disempurnakan. Sebagian besar upaya pengujian kami benar-benar digunakan untuk melacak (atau membuat) data pengujian yang sesuai untuk memastikan bahwa kami mendapatkan cakupan yang lengkap.
sumber
langkah-langkah jangka panjang yang penting tidak hanya kualitas kode dan kepercayaan kode, tetapi bahkan lebih dari tidak membakar tim melakukan pengujian tanpa berpikir
langkah-langkah jangka pendek akan menjadi ROI mengotomatisasi tes
misalnya: minggu lalu saya membuat lebih dari 1000 perubahan kode karena perubahan internal-arsitektur, memulai test suite otomatis, dan pergi tidur.
tes membutuhkan waktu 28 menit untuk berjalan; mereka semua berlalu. secara manual melakukan 40+ tes penerimaan yang sama akan memakan waktu sekitar 6 jam.
contoh lain: dalam iterasi sebelumnya saya telah melakukan kesalahan pada salah satu skenario pengujian dengan bug halus yang mungkin tidak akan ditemukan oleh pengujian manual (pengujian otomatis melakukan pemeriksaan integritas db yang hampir tidak pernah dilakukan oleh penguji manual). Saya harus menjalankan skenario pengujian itu sekitar 50 kali sebelum saya berhasil mengetahuinya dan memperbaikinya. secara manual melakukan operasi skenario pengujian akan memakan waktu sekitar 50 menit. Jadi itu 41,6 jam kerja manusia yang dihemat dalam satu hari
tidak ada cara menghitung ROI pengujian otomatis sebelumnya, karena Anda tidak bisa tahu persis berapa kali Anda perlu menjalankan tes.
tetapi bagi saya, ROI tes otomatis hampir tidak terbatas
sumber
Ini dapat membantu banyak untuk membatasi tes unit untuk algoritma yang kompleks, kasus di mana mereka dapat dihasilkan secara otomatis, dan regresi.
Tes komponen sering melakukan pekerjaan besar untuk kode yang agak sepele, ditambah mengubah implementasinya jauh lebih murah karena tes hanya digabungkan ke antarmuka.
Cakupan penuh dengan pengujian unit berbutir halus memiliki biaya overhead yang sangat besar untuk mengubah atau refactoring suatu implementasi, yang persis seperti yang mereka klaim mudah.
sumber