Jadi, Anda sudah sering mendengarnya dari mereka yang tidak benar-benar memahami nilai-nilai pengujian. Hanya untuk memulai, saya seorang pengikut Agile dan Pengujian ...
Baru-baru ini saya berdiskusi tentang melakukan TDD pada penulisan ulang produk di mana tim saat ini tidak mempraktikkan pengujian unit pada tingkat apa pun, dan mungkin belum pernah mendengar tentang teknik injeksi ketergantungan atau pola uji / desain dll (kami bahkan tidak akan mendapatkan aktif untuk membersihkan kode).
Sekarang, saya sepenuhnya bertanggung jawab atas penulisan ulang produk ini dan saya diberitahu bahwa mencobanya dengan gaya TDD, hanya akan membuatnya menjadi mimpi buruk pemeliharaan dan tidak mungkin dipertahankan oleh tim. Selain itu, karena ini adalah aplikasi front-end (bukan berbasis web), menambahkan tes tidak ada gunanya, karena drive bisnis berubah (dengan perubahan itu berarti peningkatan tentu saja), tes akan menjadi usang, pengembang lain yang datang ke proyek di masa depan tidak akan merawat mereka dan menjadi beban bagi mereka untuk diperbaiki dll.
Saya dapat memahami bahwa TDD dalam tim yang saat ini tidak memiliki pengalaman pengujian tidak terdengar bagus, tetapi argumen saya dalam hal ini adalah bahwa saya dapat mengajarkan praktik saya kepada orang-orang di sekitar saya, tetapi lebih jauh lagi, saya tahu bahwa TDD membuat LEBIH BAIK perangkat lunak. Bahkan jika saya membuat perangkat lunak menggunakan TDD, dan membuang semua tes untuk menyerahkannya ke tim pemeliharaan, itu pasti akan menjadi pendekatan yang lebih baik daripada tidak menggunakan TDD sama sekali sejak awal?
Saya telah ditembak jatuh seperti yang saya sebutkan melakukan TDD pada sebagian besar proyek untuk tim yang belum pernah mendengarnya. Memikirkan "antarmuka" dan konstruktor DI yang tampak aneh membuat mereka takut ...
Adakah yang bisa membantu saya dalam apa yang biasanya merupakan percakapan singkat mencoba menjual TDD dan pendekatan saya kepada orang-orang? Saya biasanya memiliki jendela argumen yang sangat pendek sebelum jatuh ke lutut perusahaan / tim.
Jawaban:
Anda tidak dapat memenangkan argumen itu. Mereka mengada-ada. Sayangnya, Anda juga tidak punya fakta. Contoh apa pun yang Anda berikan dapat diperdebatkan.
Satu-satunya cara untuk membuat titik ini adalah memiliki kode yang biaya pemeliharaannya lebih rendah.
Semua orang mengatakan ini. Mungkin sebagian benar juga. Jika aplikasi dirancang dengan cukup baik, front-end tidak begitu banyak.
Namun, jika aplikasi dirancang dengan buruk, front-end melakukan terlalu banyak dan sulit untuk diuji. Ini adalah masalah desain, bukan masalah pengujian.
Ini argumen yang sama seperti di atas.
Anda tidak dapat memenangkan argumen. Jadi jangan berdebat.
"Saya bertanggung jawab penuh atas penulisan ulang produk ini"
Dalam hal itu,
Tambahkan tes pula. Tetapi tambahkan tes saat Anda pergi, secara bertahap. Jangan menghabiskan waktu lama untuk menulis tes terlebih dahulu. Konversi sedikit. Uji sedikit. Konversi sedikit lagi. Tes sedikit lagi.
Gunakan tes-tes itu sampai seseorang mengetahui bahwa tes bekerja dan tanyakan mengapa semuanya berjalan dengan baik.
Saya memiliki argumen yang sama pada penulisan ulang (dari C ++ ke Java) dan saya hanya menggunakan tes meskipun mereka mengatakan kepada saya untuk tidak melakukannya.
Saya berkembang sangat cepat. Saya meminta contoh konkret dari hasil yang benar, yang mereka kirimkan dalam lembar kerja. Saya mengubah spreadsheet menjadi unittest.TestCase (tanpa memberi tahu mereka) dan menggunakannya untuk menguji.
Kapan dalam pengujian penerimaan pengguna - dan kesalahan ditemukan - Saya hanya meminta spreadsheet dengan contoh yang akan ditinjau, diperbaiki dan diperluas untuk mencakup masalah yang ditemukan selama tes penerimaan. Saya mengubah spreadsheet yang dikoreksi menjadi unittest.TestCase (tanpa memberi tahu mereka) dan menggunakannya untuk menguji.
Tidak ada yang perlu tahu secara detail mengapa Anda sukses.
Jadilah sukses.
sumber
Anda hanya dapat meyakinkan orang-orang seperti itu (jika sama sekali) dari sudut pandang praktis, menunjukkan nilai TDD dalam kehidupan nyata. Misalnya mengambil beberapa bug baru-baru ini sebagai contoh, dan menunjukkan bagaimana membangun unit test yang memastikan 100% bahwa bug ini mungkin tidak pernah muncul lagi. Dan tentu saja, tulis selusin unit test lagi untuk mencegah seluruh kelas bug serupa muncul (dan siapa tahu, mungkin dalam perjalanan bahkan mengungkap beberapa bug yang tidak aktif lagi dalam kode).
Jika ini tidak berhasil dalam jangka pendek, Anda perlu mengerjakan ini lebih lama, cukup dengan melakukan TDD dan menulis unit test dengan rajin pada tugas Anda sendiri. Kemudian kompilasi beberapa statistik sederhana setelah setengah tahun atau lebih (jika mungkin di lingkungan Anda) untuk membandingkan tingkat bug dalam kode / tugas yang dilakukan oleh pengembang yang berbeda (dianonimkan untuk mencegah mengasingkan teman satu tim Anda). Jika Anda dapat menunjukkan bahwa ada lebih sedikit bug yang ditemukan dalam kode Anda daripada di orang lain, Anda mungkin memiliki titik kuat untuk menjual baik kepada manajemen maupun sesama pengembang.
sumber
Anda harus praktis tentang hal-hal ini, dalam teori TDD adalah hal yang baik, tetapi kecuali jika Anda memperbarui tes untuk semua yang ditambahkan, tidak ada gunanya - tidak ada yang ingin menjalankan tes yang dilaporkan rusak kode ketika tes itu belum diperbarui! Sebagai hasilnya, dengan mudah bisa terlalu mahal untuk melakukannya - Anda tidak akan menjadi satu-satunya pengembang yang mengerjakan kode itu.
Klien memiliki tim pengujian .. yah, tidak ada masalah dalam mengalihkan beban pengujian dari pengembang ke penguji - itulah yang akhirnya mereka lakukan di sana, dan jika mereka menemukan bug melalui pengujian mereka (mungkin mereka memiliki banyak alat pengujian otomatis) maka ada gunanya menulis unit test di level Anda. Butuh sedikit waktu lebih lama untuk menemukan bug, tetapi mereka akan menemukan bug "integrasi" sial yang tidak akan dilakukan pengujian Anda.
Kemungkinan inilah sebabnya mereka tidak peduli untuk pengujian unit.
Terakhir, TDD adalah hal baru, ketika saya masih kecil, kami tidak pernah melakukan pengujian dan kami menulis kode yang berfungsi. Unit testing membuat beberapa orang merasa hangat dan tidak jelas, tetapi sama sekali bukan persyaratan untuk kode yang benar.
PS. Saya melihat satu lagi pertanyaan Anda di mana Anda mengkritik lapisan abstraksi, dan di sini Anda mengkritik kurangnya konstruktor DI! Putuskan pikiran Anda :)
sumber
Karena semuanya berubah begitu cepat seperti yang Anda katakan, jelaskan kepada mereka bahwa itu akan digunakan untuk Pengujian Regresi. Yang akan menghemat banyak sakit kepala ketika bug baru diperkenalkan karena seseorang memecah satu baris kode yang ditulis 10 tahun lalu untuk menyelesaikan masalah yang terjadi 1 dari setiap 10.000.000 eksekusi fungsi tertentu yang hanya dipanggil jika sistem menyala klien lebih besar dari perbedaan 3 menit dari jam sistem server. Hanya bertanya kepada mereka berapa banyak pelanggan yang mereka mampu kehilangan karena perangkat lunak kereta.
sumber
Tunjukkan bahwa menemukan bug selama biaya pengembangan X, selama pengujian 10X, dan setelah penyebaran 100X. Lihat apakah mereka setidaknya akan memungkinkan Anda untuk melakukan uji coba di mana Anda menerapkan TDD dalam modul tertentu, kemudian menindaklanjuti dengan perbandingan dengan modul lain saat mereka dikembangkan, diuji, digunakan, dan didukung. Dengan data yang memadai, Anda harus dapat menunjukkan betapa sedikit upaya yang digunakan untuk menghasilkan kode dalam modul TDD. Semoga berhasil.
sumber
Ya, mempertahankan tes adalah beban. Memperbarui mereka, memperbarui data pengujian Anda: semua ini menyedot waktu Anda.
Alternatifnya - secara manual menguji hal-hal, memperbaiki bug yang mengalami kemunduran, tidak dapat mengatakan dalam hitungan detik bahwa kode Anda berfungsi - lebih mahal.
sumber
Tes yang baik adalah beban tetapi itu adalah beban yang baik untuk dibawa. Lebih baik melakukan beberapa pekerjaan di muka yang akan menghemat waktu ketika ada masalah produksi atau selama migrasi. Saya akan selalu ingin melakukan tes meskipun itu sedikit beban tetapi saya ingin menanggung beban itu.
sumber