Dapatkan bola bergulir di TDD

10

Saya adalah bagian dari tim pengembang yang bekerja dengan banyak tim lain untuk memelihara dan meningkatkan aplikasi yang telah digunakan selama minimal 15 tahun. Ketika pertama kali dibangun dan dirancang, TDD tidak pernah terdengar.

Aplikasi ini cukup stabil, dan kami jarang menemukan bug penghentian acara, tetapi kami melakukan rata-rata satu atau dua bug dalam seminggu yang secara serius mengurangi kualitas layanan. Bug ini membutuhkan waktu lama untuk menemukan dan memperbaiki, sebagian besar karena penunjuk jari, dan satu-satunya pengujian yang kami miliki adalah pengujian antarmuka. Karena ada banyak waktu yang terbuang untuk mencari tahu di mana bug itu dapat diperbaiki, saya dan pengembang lain berencana untuk mengusulkan Pengembangan yang Didorong Uji. Ada perombakan baru yang akan segera hadir, dan kami ingin melihat hampir seluruh pengujian unit dilakukan pada modul baru, kami juga berencana untuk menyarankan membangun unit uji untuk setiap kode yang harus kami ubah yang sudah lama (yaitu, perbaikan bug atau implementasi fitur) ), tetapi tidak menghabiskan waktu mengembangkan kasus uji untuk kode yang tidak menyebabkan masalah.

Bagi saya, ini masuk akal. Bulan ini kami memiliki bug yang membutuhkan waktu dua minggu untuk memperbaikinya, tetapi bisa diidentifikasi sebelum dikerahkan jika pengujian unit telah dilakukan. Tetapi bagi para manajer kami, sepertinya mereka akan menghabiskan lebih banyak uang.

Bagaimana cara meyakinkan klien kami bahwa mereka ingin menghabiskan uang untuk pengujian unit dan pengembangan yang didorong oleh tes? Apakah ada studi yang menunjukkan ROI unit testing?

Malfist
sumber
1
sudah terlambat untuk TDD; lihat "Bekerja dengan Legacy Code" oleh Michael Feathers
Steven A. Lowe
Langkah 1. Cari Stack Overflow. Ini sudah ditanyakan. Dan dijawab. Contoh: stackoverflow.com/search?q=starting+tdd
S.Lott

Jawaban:

6

Penggabungan langsung TDD full-blown ke dalam kode lawas, proyek pemeliharaan adalah penjualan yang sangat sulit. Suatu pendekatan yang saya lihat bekerja dengan sangat baik adalah ini. Untuk setiap bug yang masuk, buat tes non-unit otomatis yang menunjukkan bug. Dengan "non-unit", maksud saya sesuatu yang dapat menyentuh banyak bagian dari sistem, tekan database dan sistem file, dll - tetapi dengan "otomatis" yang saya maksud berjalan tanpa interaksi manusia. Ini adalah jenis tes yang Anda inginkan dalam paket regresi Anda dalam acara apa pun. Menulisnya menyelesaikan banyak hal: itu membuat Anda membuat kode dapat diuji, bahkan jika pada tingkat yang sangat kasar, dan itu memaparkan Anda pada konstelasi kode yang mungkin ada hubungannya dengan bug, sehingga mendidik dan memberi tahu Anda tentang materi yang sangat spesifik relevan.

Tapi itu bukan akhirnya. Setelah tes ini berjalan, dan berjalan merah (menunjukkan kesalahan dalam kode), luangkan waktu untuk mencari tahu apa yang salah (Anda harus melakukan ini, dalam hal apa pun). Tapi jangan perbaiki dulu. Setelah Anda mengisolasi apa yang menurut Anda masalahnya - tulis unitTes yang menunjukkan masalah itu. Sekarang Anda memiliki sesuatu yang dapat Anda kerjakan (dan, tidak secara kebetulan, Anda mungkin harus memperbaiki sedikit lebih banyak ke arah testabilitas yang masih lebih besar). Perbaiki bug. Perhatikan tes lulus unit. Mungkin menyempurnakannya dengan beberapa case tepi; dapatkan satu unit - unit yang hanya menghabiskan waktu dua minggu - solid dan bersih dan teruji dengan baik. Sekarang jalankan tes regresi dan perhatikan itu lulus (tentu saja, jika tidak, Anda harus melakukan beberapa penelitian dan unit-level kerja - iterate sampai lulus, juga berlalu). Periksa semuanya. Apa yang Anda punya? Tes regresi untuk kode yang sebelumnya gagal. Tes unit untuk kode yang sebelumnya gagal. Kode kerja yang gagal. Kode yang dirancang lebih baik, karena sekarang lebih dapat diuji daripada sebelumnya. Kepercayaan yang lebih baik pada basis kode Anda,

Itu bukan TDD "murni". Tapi itu menunjukkan hasil, dengan cepat, dan meningkatkan kualitas kode Anda dari waktu ke waktu. Hasilnya akan membantu Anda mendapatkan dukungan manajemen.

Carl Manaster
sumber
Saran bagus, tapi saya pikir OP sedang mencari argumen yang lebih meyakinkan yang membenarkan waktu tambahan yang diperlukan untuk mengimplementasikan pendekatan semacam ini.
Bernard
Mungkin aku perlu menulis ulang, kalau begitu. Apa yang saya coba utarakan adalah bahwa sebagian besar upaya yang dijelaskan itu diperlukan - waktu tambahan sangat sederhana, untuk manfaat yang signifikan. Maaf kalau itu tidak jelas.
Carl Manaster
Jelas bagi saya sebagai pengembang, tetapi saya tahu bahwa manajemen biasanya membutuhkan argumen yang sangat meyakinkan (yaitu membenarkan biaya).
Bernard
Itulah yang saya sarankan di paragraf kedua saya dalam pertanyaan. Kami akan menulis TDD untuk "kode baru" dan menulis kasus uji untuk kode lawas apa pun yang kami ubah baik dengan perbaikan bug atau permintaan fitur.
Malfist
3

Di perusahaan saya, saya hanya menggunakan metode "only grunt" dari JoelOnSoftware dan mulai menulis unit test setiap kali saya biasanya hanya meretas bersama-sama semacam aplikasi konsol yang dibuang. Saya mulai menyelesaikan banyak hal lebih cepat dengan rilis yang lebih stabil, dan mendapat perhatian karenanya. Ketika ditanya apa yang saya lakukan, saya menjelaskan bahwa saya mulai menggunakan TDD dan menulis unit test setiap kali saya mengubah kode lama atau menulis kode baru. Rekan pengembang saya mulai merasa penasaran dan mulai menggunakan tes unit terintegrasi sendiri. Saya tidak berpikir ada argumen yang baik di luar sana untuk menulis tes untuk bekerja kode warisan, tetapi jika Anda dapat membuat kasus bahwa menulis tes otomatis lebih cepat dan lebih mudah daripada menulis spagetti hack hack, maka pengembang pintar akan mengikuti.Manfaat lain yang menghasilkan perangkat lunak berkualitas lebih tinggi juga akan ada di sana, tetapi kunci untuk mengaktifkan pengembang menunjukkan bahwa itu membuat hidup mereka lebih mudah. Sejauh bisnis masuk, fakta bahwa itu akan menghasilkan perangkat lunak yang lebih baik dan mungkin membutuhkan waktu lebih sedikit untuk dikirim daripada sebelumnya harus lebih dari cukup untuk meyakinkan mereka.

Morgan Herlocker
sumber
0

Pertama, sikap dan rasa ketulusan Anda untuk nilai kualitas menambah uang pelanggan harus dihargai. Dan inilah pemikiran saya tentang bagaimana Anda dapat meyakinkan manajer dan klien Anda:

  • Kumpulkan metrik bug yang Anda perbaiki katakan selama 6 bulan terakhir dan waktu minimum, rata-rata, dan maksimum yang Anda perlukan untuk memperbaiki bug.
  • Untuk semua bug yang telah Anda perbaiki atau memiliki konteks, coba tulis unit test yang mencakup area tersebut.
  • Untuk bug yang sedang Anda kerjakan dan bug yang akan Anda kerjakan, coba tulis unit test di sekitar area tersebut bahkan sebelum Anda membuat perubahan. Kemudian tulis kode untuk mencari tahu penyebabnya dan memperbaikinya. Lihat apakah itu memecahkan salah satu test case yang ada. Jika ya, jelaskan dan bantu rekan-rekan Anda memahami pentingnya Tes Unit.
  • Setelah semua pengembang memahami pentingnya Tes Unit, minta mereka untuk terus melakukan apa yang telah Anda lakukan selama beberapa hari / minggu.
  • Seiring berjalannya waktu, produktivitas tim harus meningkat sejauh manajer dan pelanggan Anda akan terkejut dengan laju peningkatan produktivitas dan kualitas kode. Ini sedikit memakan waktu, tetapi patut dicoba.

Ada cara lain, dan mencoba bergabung dengan manajer Anda dalam menghadiri Agile Conference yang terjadi. Tentunya itu patut dikunjungi.

Jika Anda merasa tidak ada yang berhasil, maka lanjutkan ... bergabunglah dengan tempat yang cocok untuk Anda. Dengan tenang, inilah yang saya lakukan. Ketika semuanya gagal, saya pindah;)

Dan tahu apa tes Unit setelah menulis kode tidak benar-benar TDD, tapi kemudian itu selalu bisa menjadi langkah pertama. Cocok sekali di sini setidaknya.

Semoga beruntung dan sukses!

karthiks
sumber