Tes unit selama tinjauan kode adalah pengganti yang buruk untuk tes unit selama pengembangan.
Apa yang Anda sarankan sangat masuk akal, secara intuitif. Untuk apa ulasannya? Untuk memeriksa apakah kodenya baik. Untuk apa tes? Untuk memeriksa apakah kodenya baik. Jadi mengapa tidak menggabungkan keduanya?
Inilah sebabnya.
Membawa kode yang sedang diuji adalah kerja keras. Menulis kode yang hanya berfungsi pada satu hal yang seharusnya dilakukan adalah satu hal; menulis kode yang dapat secara efektif dan efisien diuji adalah hal lain. Hanya fakta bahwa kode sekarang berjalan di bawah dua skenario - "pekerjaan nyata" dan "tes" - menuntut fleksibilitas yang jauh lebih besar, menuntut agar kode tersebut mampu berdiri sendiri dengan cara yang bermakna.
Menulis kode Anda sehingga dapat diuji merupakan pekerjaan dan keterampilan ekstra. Refactoring kode orang lain untuk testability, ketika itu tidak ditulis dengan testability dalam pikiran untuk memulai, bisa menjadi tugas utama.
Anda menggandakan upaya antara pengembang dan pengulas. Agaknya, pengembang Anda tidak menyerahkan kode di untuk diperiksa tanpa setidaknya beberapa tingkat kepercayaan bahwa itu bekerja. Dia sudah perlu menguji kodenya. Sekarang, ada berbagai tingkat dan cakupan pengujian. QA menguji kode setelah pengembang dan peninjau. Tetapi ruang lingkup apa pun yang Anda pikir sesuai untuk pengembang dan peninjau, tidak masuk akal bagi pengembang untuk mengetahui cara menguji kode ke tingkat itu sekali , tetapi membuat pengujiannya dibuang dan sulit untuk mereproduksi, dan kemudian membawa peninjau ke kembangkan tes lagi, kali ini yang otomatis dan direproduksi. Anda berdua hanya perlu menginvestasikan waktu dalam menulis tes yang sama - sekali buruk, sekali baik.
Anda mengubah ulasan menjadi langkah yang jauh lebih lama, lebih sulit. Jika pengujian adalah bagian utama dari proses peninjauan, apa yang terjadi ketika beberapa tes gagal ? Apakah pengulas bertanggung jawab untuk menjalankan semua tes, jadi ia perlu men-debug kode juga? Atau apakah akan bolak-balik, satu tes menulis, yang lain membuat mereka lulus?
Kadang-kadang Anda dapat menulis sejumlah besar tes yang semuanya ortogonal satu sama lain, sehingga Anda tidak perlu melakukan ping-pong. Reviewer menulis selusin tes, setengahnya gagal, pengembang memperbaiki bug dan semua tes tetap valid, dan lulus sekarang. Tapi ... sering kali, Anda memiliki bug pemblokir, atau bug yang membutuhkan desain ulang dan perubahan API, atau yang lainnya. Jika Anda melepaskan tanggung jawab untuk lulus tes bolak-balik antara peninjau dan pengembang, maka Anda sebenarnya tidak pada tahap peninjauan. Anda masih berkembang.
Perlu menulis tes tidak mendorong ulasan yang lebih menyeluruh. Ini pada dasarnya berarti bahwa semakin dalam Anda melangkah, semakin banyak tes yang harus Anda tulis, dan mungkin itu akan menjadi tes sulit yang perlu masuk jauh ke dalam sistem.
Bandingkan dengan pengembang yang menulis tes, di mana insentifnya adalah: jika saya tidak menulis tes penting, pengulas akan menunjukkan hal itu dalam ulasan.
Bahkan peninjau akan memiliki pemahaman yang jauh lebih baik tentang sistem jika dia perlu memeriksa tes kode secara menyeluruh , maka jika dia perlu memutuskan sendiri kapan dia bisa berhenti menulis tes penggalian yang dalam dan hanya OK tinjauan kode.
Jika pengembang tidak menulis unit test, reviewer tidak akan melakukannya. Ada banyak kendala untuk mengadopsi pengujian sebagai praktik umum. Mungkin Anda terlalu banyak mendapat tekanan, dan basis kode Anda sulit untuk diuji. Mungkin Anda tidak berpengalaman dalam pengujian, dan merasa seperti Anda tidak mampu membeli kurva belajar. Mungkin Anda punya pembunuh kapak yang mengirim catatan mengancam kepada orang-orang yang menulis tes. Saya tidak tahu!
Tapi apa pun penyebabnya, aman untuk bertaruh bahwa itu berlaku sama untuk pengulas dan pengembang. Jika tim sedang stres, resensi tidak memiliki waktu lebih banyak daripada pengembang (jika dia melakukannya, mendistribusikan kembali pekerjaan sehingga orang tidak begitu stres ). Jika tidak ada yang tahu cara menulis unit test dengan baik, pengulas mungkin juga tidak (jika dia melakukannya, dia harus duduk dan mengajar rekan satu timnya ).
Saran ini terdengar seperti mencoba meneruskan tanggung jawab dari satu kolega ke kolega lainnya. Dan saya tidak melihat cara apa pun untuk bekerja dengan baik, pertama dan terutama karena sangat sulit (dan tidak sehat) untuk menciptakan situasi di mana satu orang adalah satu-satunya yang dapat melakukan pengujian, dan orang lain tidak dapat melakukan semua pengujian sama sekali.
Apa yang dilakukannya kerja adalah memiliki tes tinjauan penutup juga. Jika pengembang telah menulis sepuluh tes, jauh lebih mungkin peninjau dapat membantu menyarankan sepuluh lainnya, daripada jika pengembang belum menulisnya.
Dan, jika menguji sudut-kasus adalah tugas utama, mungkin masuk akal untuk mendistribusikannya secara lebih luas di seluruh tim. ** Setelah kode diuji di tempat pertama, menulis lebih banyak tes menjadi jauh lebih mudah. **
Ulasan adalah waktu yang tepat untuk menemukan kasus sudut. Dan, jika peninjau dapat melompat dan menulis tes untuk kasus sudut yang dia temukan, maka hei - lebih baik! Tetapi secara umum, dengan asumsi bahwa resensi dapat menulis tes di mana pengembang tidak terdengar seperti ide yang sangat buruk.