Apa overhead sebenarnya dari TDD setelah seluruh tim terbiasa?

24

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?

Wes
sumber
Menulis tes sebelum Anda membuat kode atau menulis tes setelahnya, saya akan merasa biaya overhead dapat diabaikan sebagai cara Anda menulis tes.
Chris
1
@ Chris, ketika Anda menulis tes pertama Anda merancang API di depan, bukan sebagai renungan.
3
@ Thorbjørn: Setuju dengan pengamatan Anda, meskipun sangat mungkin untuk merancang API tanpa menggunakan TDD, hampir tidak pernah ketinggalan jaman.
Robert Harvey
2
@ Seven: Ya, saya tahu apa itu TDD. Sangat menarik Anda mengatakan desain API di muka. Itu menurut saya pendekatan yang masuk akal. Saya tidak pernah benar-benar dijual dengan gagasan bahwa Anda bisa "menumbuhkan" API dengan menulis banyak tes.
Robert Harvey

Jawaban:

8

Saya sudah mendengar di mana saja dari 30-50% dari waktu Anda menulis unit test. Namun itu tidak memperhitungkan waktu yang dihemat

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.

Brad Cupit
sumber
Jika tesnya adalah tes yang baik. Namun, beberapa lebih baik daripada tidak sama sekali, dan secara umum Anda dapat mengetahui dengan cepat dengan melihat apakah tesnya bagus atau tidak.
Michael K
1
jadi Anda pikir ada penghematan nyata yang nyata dalam waktu. (2 bulan) per contoh Anda tetapi berapa banyak waktu yang dibutuhkan untuk pengujian? Jawaban bagus btw.
Wes
@ Kami sangat sulit untuk tahu. Saya menulis kode yang diuji lebih cepat, tetapi menghabiskan banyak waktu pada tes, yang membantu saya menemukan bug lebih awal, yang menghemat waktu, tetapi saya tidak tahu berapa banyak waktu yang dihemat karena saya tidak menemukan bug terlambat! Saya pribadi berpikir TDD lebih mahal dalam jangka pendek, tetapi menghemat lebih banyak dalam jangka panjang. Semakin lama proyek, semakin banyak manfaatnya.
Brad Cupit
Pindah ini ke jawaban saya yang diterima sekarang.
Wes
15

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.

Robert Harvey
sumber
Saya tidak yakin bahwa Anda menghemat tes manual sama sekali. TBH. Untuk memastikan sesuatu berfungsi secara fungsional, Anda masih harus menggunakan regresi setidaknya sejauh yang saya tahu.
Wes
6
Tes unit adalah pengujian regresi. Saya tidak yakin apa yang Anda katakan.
Robert Harvey
2
Tes unit dan tes fungsional adalah bentuk pengujian regresi. Saya pikir Wes mengacu pada yang terakhir.
Phil Mander
@ Phil Mander tepat sekali. @ Robert Harvey Maksud saya pengujian fungsional, otak saya tidak menemukan kata yang tepat. Meskipun saya cukup yakin subconsious saya melakukan seperti yang saya gunakan kata fungsional di sana: S Oh dan edit yang baik btw.
Wes
Saya tidak berpikir menjalankan tes dengan cara yang persis sama setiap kali sebenarnya positif, karena mungkin untuk secara konsisten melewatkan menemukan masalah seperti itu.
Peter Ajtai
5

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:

  • seorang pelanggan meminta perubahan pada persyaratan (persyaratan yang memuaskan)
  • cara penulisan kode yang lebih baik ditemukan
  • rekan tim punya saran untuk perbaikan kode
  • kita harus menjelaskan / meneruskan kode kita kepada orang lain

TDD bisa membosankan karena proses pengembangan mengambil langkah-langkah kecil, dan dengan demikian menjadi sangat mudah diprediksi.

n193853
sumber
4

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.

TMN
sumber
Apakah ini generator kode yang dibuat di rumah, atau generator kode sumber terbuka yang tersedia di alam?
Robert Harvey
Ini adalah solusi linting tangan, berdasarkan kelas .NET CodeDOM.
TMN
3

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

Steven A. Lowe
sumber
1
Oh itu yang menarik. Saya pikir pemeriksaan integritas DB harus di luar unit test. Apa tes lain selain dari unit test yang Anda jalankan secara otomatis?
Wes
1
@ Ya: tes dalam TDD disebut sebagai tes "unit", tetapi jangan biarkan nama yang malang itu membatasi cakupannya. Tujuan mereka adalah untuk menguji fitur . Fitur mungkin 'fungsi foo selalu mengembalikan nol' atau mungkin 'latensi sistem keseluruhan di bawah beban maksimum harus kurang dari 12 picoseconds'.
Steven A. Lowe
0

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.

petani kecil
sumber