TDD / Tes terlalu banyak beban overhead / pemeliharaan?

24

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.

Martin Blore
sumber
3
MENJALANKAN! MELARIKAN DIRI! Siapa pun yang tidak dapat memahami mengapa tes otomatis akan membuat hidup mereka lebih mudah dalam jangka panjang perlu menghilangkan kepala mereka dari Anda-tahu-di mana.
MattC
6
@MattC TDD! = Tes otomatis
Nemanja Trifunovic
@Nemanja Trifunovic: Uhh ... siapa yang berlatih TDD menggunakan tes manual? "Aku memulai aplikasinya tetapi tidak ada tombol untuk mengklik !?" "Ya; itu merah merah, hijau, refactor!"
Steven Evers
2
@SnOrfus: Ada tes otomatis tanpa TDD. Beberapa contoh: tes integrasi otomatis, tes regresi, tes stres.
Nemanja Trifunovic
2
@ Martin, saya akan tertarik dengan komentar tindak lanjut (atau posting blog) yang membahas apa yang akhirnya Anda lakukan dan seberapa baik (atau tidak) itu bekerja untuk Anda dalam jangka panjang.
StevenV

Jawaban:

36

mencobanya dengan gaya TDD, hanya akan membuatnya menjadi mimpi buruk pemeliharaan dan tidak mungkin dipertahankan oleh tim.

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.

Selain itu, karena ini adalah aplikasi front-end (bukan berbasis web), menambahkan tes tidak ada gunanya,

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.

karena perubahan bisnis (oleh perubahan itu berarti peningkatan tentu saja), tes akan menjadi usang, pengembang lain yang datang ke proyek di masa depan tidak akan mempertahankan mereka dan menjadi lebih menjadi beban bagi mereka untuk memperbaiki dll.

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,

  1. 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.

  2. 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.

S.Lott
sumber
Responnya sangat menginspirasi S.Lott :). Sangat menakutkan bagi saya untuk diberitahu oleh arsitek perusahaan bahwa saya akan "menciptakan overhead yang tidak perlu". Saya tidak terlihat menunda proyek dengan tidak diketahui oleh mereka, bahwa pada akhirnya jika proyek datang terlambat, mereka dapat dengan mudah mengarahkan jari pada pengujian yang saya lakukan dan mengakhiri kontrak. Seperti yang Anda katakan, menyelundupkan mereka dalam pembuktian nanti bagaimana itu membantu mungkin adalah cara yang benar. Anda benar dari sudut pandang argumen, saya tidak punya alasan, dan mereka juga tidak.
Martin Blore
Mengapa front-end tidak terlalu banyak masalah desain? Saat ini banyak teknologi seperti AJAX melakukan banyak hal di front-end.
卢 声 远 Shengyuan Lu
@ 卢 声 远 Shengyuan Lu: Sulit untuk menguji "tampilan" GUI. Anda dapat menguji font dan warna. Namun, kebiasaan browser membuatnya sangat sulit untuk menguji penempatan dan ukuran yang tepat dengan pengujian otomatis.
S.Lott
@ Martin Blore: "mereka juga tidak." Tepat. Siapa pun yang mengatakan pengujian entah bagaimana akan secara ajaib menambah risiko itu gila. Anda harus tetap menguji - itu tidak bisa dihindari. Anda dapat menguji dengan baik (menggunakan TDD) atau Anda dapat menguji dengan buruk dan serampangan. Merencanakan pengujian yang buruk dan serampangan tampaknya lebih berisiko bagi saya. Tetapi tidak ada dasar diskusi sampai "para penentang" memiliki pengalaman langsung.
S.Lott
5

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.

Péter Török
sumber
Itu ide bagus Peter, terima kasih untuk itu. Proyek saya saat ini memiliki tim uji jadi saya yakin itu akan sangat mudah untuk menangkap bug yang ditemukan dalam rilis tonggak dll.
Martin Blore
3

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 :)

gbjbaanb
sumber
2

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.

Woot4Moo
sumber
2

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.

SnoopDougieDoug
sumber
2

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.

Frank Shearar
sumber
2
Saya pikir ini adalah salah satu poin paling penting untuk dibuat untuk tidak mengatakan yang mengklaim TDD adalah buang-buang waktu dan overhead yang tidak perlu. Bukannya TDD tidak membutuhkan waktu. Itu adalah fakta bahwa ini adalah investasi yang mencegah biaya di masa depan yang pesanannya lebih besar
sara
2

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.

Rachel
sumber