Saya telah memperkenalkan unit test ke basis kode yang tidak memilikinya sebelumnya. Proyek besar terakhir yang saya lakukan di mana saya melakukan ini adalah produknya sudah di produksi dengan nol unit test ketika saya tiba di tim. Ketika saya pergi - 2 tahun kemudian - kami memiliki 4.500+ tes yang menghasilkan sekitar 33% cakupan kode dalam basis kode dengan 230.000+ LOC produksi (aplikasi Win-Forms finansial waktu nyata). Itu mungkin terdengar rendah, tetapi hasilnya adalah peningkatan yang signifikan dalam kualitas kode dan tingkat cacat - ditambah peningkatan moral dan profitabilitas.
Ini bisa dilakukan ketika Anda memiliki pemahaman dan komitmen yang akurat dari pihak-pihak yang terlibat.
Pertama-tama, penting untuk memahami bahwa pengujian unit adalah keterampilan itu sendiri. Anda bisa menjadi programmer yang sangat produktif dengan standar "konvensional" dan masih kesulitan untuk menulis tes unit dengan cara yang skala dalam proyek yang lebih besar.
Juga, dan khusus untuk situasi Anda, menambahkan unit test ke basis kode yang ada yang tidak memiliki tes juga merupakan keahlian khusus. Kecuali jika Anda atau seseorang dalam tim Anda memiliki pengalaman sukses dengan memperkenalkan tes unit ke basis kode yang ada, saya akan mengatakan membaca buku Feather adalah persyaratan (tidak opsional atau sangat disarankan).
Membuat transisi ke unit menguji kode Anda adalah investasi pada orang dan keterampilan sama halnya dengan kualitas basis kode. Memahami ini sangat penting dalam hal pola pikir dan mengelola harapan.
Sekarang, untuk komentar dan pertanyaan Anda:
Namun, saya khawatir bahwa pada akhirnya saya akan kehilangan gambaran besarnya dan berakhir dengan melewatkan tes fundamental yang akan disertakan jika saya menggunakan TDD sejak awal.
Jawaban singkat: Ya, Anda akan melewatkan tes dan ya mereka mungkin awalnya tidak terlihat seperti apa yang akan mereka miliki dalam situasi lapangan hijau.
Jawaban level yang lebih dalam adalah ini: Tidak masalah. Anda mulai tanpa tes. Mulai menambahkan tes, dan refactor saat Anda pergi. Ketika tingkat keterampilan menjadi lebih baik, mulailah menaikkan bilah untuk semua kode baru yang ditambahkan ke proyek Anda. Terus tingkatkan dll ...
Sekarang, dengan membaca yang tersirat di sini saya mendapat kesan bahwa ini datang dari pola pikir "kesempurnaan sebagai alasan untuk tidak mengambil tindakan". Pola pikir yang lebih baik adalah fokus pada kepercayaan diri. Jadi karena Anda mungkin belum tahu cara melakukannya, Anda akan mencari cara melakukannya dan mengisi bagian yang kosong. Karena itu, tidak ada alasan untuk khawatir.
Sekali lagi, ini keterampilan. Anda tidak dapat beralih dari nol tes ke kesempurnaan TDD dalam satu "proses" atau "langkah demi langkah" pendekatan buku masak secara linear. Ini akan menjadi proses. Harapan Anda harus membuat kemajuan dan peningkatan bertahap dan bertahap. Tidak ada pil ajaib.
Berita baiknya adalah ketika bulan-bulan (dan bahkan bertahun-tahun) berlalu, kode Anda akan secara bertahap mulai menjadi kode yang "layak" diperhitungkan dengan baik dan teruji dengan baik.
Sebagai catatan. Anda akan menemukan bahwa hambatan utama untuk memperkenalkan unit test dalam basis kode lama adalah kurangnya kohesi dan ketergantungan yang berlebihan. Karena itu, Anda mungkin akan menemukan bahwa keterampilan yang paling penting adalah bagaimana memecahkan dependensi yang ada dan kode decoupling, daripada menulis unit test yang sebenarnya sendiri.
Apakah ada proses / langkah yang harus dipatuhi untuk memastikan bahwa solusi yang ada diuji dengan benar dan tidak hanya diikutsertakan?
Kecuali Anda sudah memilikinya, buat server build dan atur pembangunan integrasi berkelanjutan yang berjalan di setiap checkin termasuk semua tes unit dengan cakupan kode.
Latih orang Anda.
Mulai di suatu tempat dan mulai menambahkan tes saat Anda membuat kemajuan dari perspektif pelanggan (lihat di bawah).
Gunakan cakupan kode sebagai referensi panduan tentang seberapa banyak basis kode produksi Anda sedang diuji.
Waktu pembangunan harus selalu CEPAT. Jika waktu pembuatan Anda lambat, keterampilan pengujian unit Anda tertinggal. Temukan tes lambat dan tingkatkan (pisahkan kode produksi dan uji secara terpisah). Ditulis dengan baik, Anda seharusnya dapat memiliki beberapa ribu unit test dan masih menyelesaikan build di bawah 10 menit (~ 1-beberapa ms / test adalah pedoman yang bagus tapi sangat kasar, beberapa pengecualian mungkin berlaku seperti kode menggunakan refleksi dll) ).
Periksa dan beradaptasi.
Bagaimana saya bisa memastikan bahwa tes-tes itu berkualitas baik dan bukan hanya kasus tes apa pun yang lebih baik daripada tidak ada tes.
Penilaian Anda sendiri harus menjadi sumber utama realitas Anda. Tidak ada metrik yang dapat menggantikan keterampilan.
Jika Anda tidak memiliki pengalaman atau penilaian itu, pertimbangkan untuk mengontrak seseorang yang memilikinya.
Dua indikator sekunder kasar adalah cakupan kode total dan kecepatan bangun.
Apakah sepadan dengan upaya untuk solusi yang ada yang ada di produksi?
Iya. Sebagian besar uang yang dihabiskan untuk sistem atau solusi yang dibuat khusus dihabiskan setelah dimasukkan ke dalam produksi. Dan berinvestasi dalam kualitas, orang, dan keterampilan tidak boleh ketinggalan zaman.
Apakah lebih baik untuk mengabaikan pengujian untuk proyek ini dan menambahkannya dalam kemungkinan menulis ulang di masa depan?
Anda harus mempertimbangkan, tidak hanya investasi pada orang dan keterampilan, tetapi yang paling penting total biaya kepemilikan dan waktu hidup yang diharapkan dari sistem.
Jawaban pribadi saya akan "ya tentu saja" dalam sebagian besar kasus karena saya tahu itu jauh lebih baik, tetapi saya menyadari bahwa mungkin ada pengecualian.
Apa yang akan lebih bermanfaat; menghabiskan beberapa minggu menambahkan tes atau beberapa minggu menambahkan fungsionalitas?
Tidak juga. Pendekatan Anda harus menambahkan tes ke basis kode Anda SAAT Anda membuat kemajuan dalam hal fungsionalitas.
Sekali lagi, ini merupakan investasi pada orang, keterampilan DAN kualitas basis kode dan karena itu akan membutuhkan waktu. Anggota tim perlu belajar cara memecahkan ketergantungan, menulis tes unit, mempelajari kebiasaan baru, meningkatkan disiplin dan kesadaran kualitas, cara merancang perangkat lunak yang lebih baik, dll. Penting untuk dipahami bahwa ketika Anda mulai menambahkan tes, anggota tim Anda kemungkinan tidak memiliki keterampilan ini namun pada tingkat yang mereka butuhkan agar pendekatan itu berhasil, sehingga menghentikan kemajuan untuk menghabiskan waktu untuk menambahkan banyak tes tidak akan berhasil.
Juga, menambahkan tes unit ke basis kode yang ada dari setiap ukuran proyek yang cukup besar adalah upaya BESAR yang membutuhkan komitmen dan ketekunan. Anda tidak dapat mengubah sesuatu yang mendasar, berharap banyak belajar di jalan, dan meminta sponsor Anda untuk tidak mengharapkan ROI dengan menghentikan aliran nilai bisnis. Itu tidak akan terbang, dan sejujurnya tidak seharusnya.
Ketiga, Anda ingin menanamkan nilai fokus bisnis yang sehat di tim Anda. Kualitas tidak pernah datang dengan mengorbankan pelanggan dan Anda tidak dapat pergi cepat tanpa kualitas. Selain itu, pelanggan hidup dalam dunia yang terus berubah, dan tugas Anda adalah membuatnya lebih mudah beradaptasi. Penyelarasan pelanggan membutuhkan kualitas dan aliran nilai bisnis.
Apa yang Anda lakukan adalah melunasi hutang teknis. Dan Anda melakukannya sambil tetap melayani pelanggan Anda yang selalu berubah kebutuhan. Berangsur-angsur setelah hutang terbayar, situasinya membaik, dan lebih mudah untuk melayani pelanggan dengan lebih baik dan memberikan nilai lebih. Dll. Momentum positif ini adalah apa yang harus Anda tuju karena ini menggarisbawahi prinsip-prinsip langkah berkelanjutan dan akan mempertahankan dan meningkatkan moral - baik untuk tim pengembangan Anda, pelanggan Anda dan pemangku kepentingan Anda.
Semoga itu bisa membantu