thetalkingwalnut bertanya:
Apa beberapa cara yang baik untuk meyakinkan pengembang skeptis pada tim tentang nilai Unit Testing?
Semua orang di sini akan menumpuk banyak alasan mengapa pengujian unit baik. Namun, saya menemukan bahwa sering kali cara terbaik untuk meyakinkan seseorang tentang sesuatu adalah dengan mendengarkan argumen mereka dan mengatasinya poin demi poin. Jika Anda mendengarkan dan membantu mereka mengungkapkan kekhawatiran mereka, Anda dapat membahas masing-masing dan mungkin mengubahnya menjadi sudut pandang Anda (atau paling tidak, biarkan mereka tanpa kaki untuk berdiri di atas). Siapa tahu? Mungkin mereka akan meyakinkan Anda mengapa unit test tidak sesuai untuk situasi Anda. Tidak mungkin, tetapi mungkin. Mungkin jika Anda memposting argumen mereka terhadap unit test, kami dapat membantu mengidentifikasi kontra argumen.
Penting untuk mendengarkan dan memahami kedua sisi argumen. Jika Anda mencoba untuk mengadopsi tes unit terlalu bersemangat tanpa memperhatikan kekhawatiran orang, Anda akan berakhir dengan perang agama (dan mungkin tes unit benar-benar tidak berharga). Jika Anda mengadopsinya secara perlahan dan mulai menerapkannya di tempat Anda akan melihat manfaat paling besar dengan biaya paling murah, Anda mungkin dapat menunjukkan nilai tes unit dan memiliki peluang yang lebih baik untuk meyakinkan orang. Saya menyadari ini tidak semudah kedengarannya - biasanya membutuhkan waktu dan metrik hati-hati untuk membuat argumen yang meyakinkan.
Tes unit adalah alat, seperti yang lain, dan harus diterapkan sedemikian rupa sehingga manfaat (menangkap bug) lebih besar daripada biaya (upaya menulisnya). Jangan menggunakannya jika / di mana mereka tidak masuk akal dan ingat bahwa mereka hanya bagian dari gudang alat Anda (misalnya inspeksi, pernyataan, penganalisa kode, metode formal, dll). Apa yang saya katakan kepada pengembang saya adalah ini:
Mereka dapat melewatkan menulis tes untuk suatu metode jika mereka memiliki argumen yang bagus mengapa itu tidak perlu (misalnya terlalu sederhana untuk menjadi layak atau terlalu sulit untuk menjadi layak untuk itu) dan bagaimana metode itu akan diverifikasi (misalnya inspeksi, asersi , metode formal, tes interaktif / integrasi). Mereka perlu mempertimbangkan bahwa beberapa verifikasi seperti inspeksi dan bukti formal dilakukan pada suatu titik waktu dan kemudian perlu diulang setiap kali kode produksi berubah, sedangkan unit test dan pernyataan dapat digunakan sebagai tes regresi (ditulis satu kali dan dieksekusi berulang kali setelahnya). ). Kadang-kadang saya setuju dengan mereka, tetapi lebih sering saya akan berdebat tentang apakah suatu metode benar-benar terlalu sederhana atau terlalu sulit untuk unit test.
Jika seorang pengembang berpendapat bahwa suatu metode tampaknya terlalu mudah untuk gagal, bukankah perlu mengambil 60 detik yang diperlukan untuk menulis unit test 5-line sederhana untuk itu? Ini 5 baris kode akan berjalan setiap malam (Anda membangun malam, kan?) Untuk tahun depan atau lebih dan akan bernilai usaha jika bahkan sekali saja itu terjadi untuk menangkap masalah yang mungkin memerlukan waktu 15 menit atau lebih lama untuk mengidentifikasi dan debug. Selain itu, menulis unit test yang mudah menaikkan hitungan unit test, yang membuat pengembang terlihat bagus.
Di sisi lain, jika pengembang berpendapat bahwa suatu metode tampaknya terlalu sulit untuk unit test (tidak sepadan dengan upaya signifikan yang diperlukan), mungkin itu adalah indikasi yang baik bahwa metode tersebut perlu dibagi atau di refactored untuk menguji bagian yang mudah. Biasanya, ini adalah metode yang mengandalkan sumber daya yang tidak biasa seperti lajang, waktu saat ini, atau sumber daya eksternal seperti kumpulan hasil basis data. Metode-metode ini biasanya perlu direactored menjadi metode yang mendapatkan sumber daya (mis. Panggilan getTime ()) dan metode yang menggunakan sumber daya sebagai argumen (mis. Menggunakan timestamp sebagai parameter). Saya membiarkan mereka melewati pengujian metode yang mengambil sumber daya dan mereka malah menulis uji unit untuk metode yang sekarang mengambil sumber daya sebagai argumen. Biasanya, ini membuat penulisan unit test lebih sederhana dan karena itu layak untuk ditulis.
Pengembang perlu menggambar "garis di pasir" dalam seberapa komprehensif tes unit mereka seharusnya. Kemudian dalam pengembangan, setiap kali kami menemukan bug, mereka harus menentukan apakah unit test yang lebih komprehensif akan menangkap masalah. Jika demikian dan jika bug semacam itu muncul berulang kali, mereka perlu memindahkan "baris" ke arah penulisan unit test yang lebih komprehensif di masa mendatang (dimulai dengan menambah atau memperluas tes unit untuk bug saat ini). Mereka perlu menemukan keseimbangan yang tepat.
Yang penting untuk mewujudkan unit test bukan peluru perak dan ada adalah hal seperti terlalu banyak unit testing. Di tempat kerja saya, setiap kali kami melakukan pelajaran, saya pasti mendengar "kita perlu menulis lebih banyak unit test". Manajemen mengangguk setuju karena sudah terbentur di kepala mereka bahwa "unit test" == "bagus".
Namun, kita perlu memahami dampak "lebih banyak unit test". Pengembang hanya dapat menulis ~ N baris kode seminggu dan Anda perlu mengetahui berapa persen dari kode itu yang harus menjadi kode uji unit vs kode produksi. Tempat kerja yang longgar mungkin memiliki 10% dari kode sebagai tes unit dan 90% dari kode sebagai kode produksi, menghasilkan produk dengan banyak fitur (walaupun sangat buggy) (pikirkan MS Word). Di sisi lain, toko ketat dengan unit test 90% dan kode produksi 10% akan memiliki produk yang solid dengan fitur yang sangat sedikit (pikirkan "vi"). Anda mungkin tidak pernah mendengar laporan tentang jatuhnya produk yang terakhir, tetapi kemungkinan hal itu ada hubungannya dengan produk yang tidak laku sama baiknya dengan yang berkaitan dengan kualitas kode.
Lebih buruk lagi, mungkin satu-satunya kepastian dalam pengembangan perangkat lunak adalah bahwa "perubahan tidak bisa dihindari". Asumsikan toko yang ketat (90% unit test / 10% kode produksi) menciptakan produk yang persis memiliki 2 fitur (dengan asumsi 5% dari kode produksi == 1 fitur). Jika pelanggan datang dan mengubah 1 fitur, maka perubahan itu menghancurkan 50% dari kode (45% dari tes unit dan 5% dari kode produksi). Toko longgar (tes unit 10% / kode produksi 90%) memiliki produk dengan 18 fitur, tidak ada yang bekerja dengan sangat baik. Pelanggan mereka benar-benar mengubah persyaratan untuk 4 fitur mereka. Meskipun perubahannya 4 kali lebih besar, hanya setengah dari basis kode yang dibuang (~ 25% = ~ 4.4% unit test + 20% dari kode produksi).
Maksud saya adalah bahwa Anda harus berkomunikasi bahwa Anda memahami keseimbangan antara terlalu sedikit dan terlalu banyak pengujian unit - pada dasarnya Anda telah memikirkan kedua sisi masalah. Jika Anda dapat meyakinkan rekan-rekan Anda dan / atau manajemen Anda tentang hal itu, Anda mendapatkan kredibilitas dan mungkin memiliki peluang yang lebih baik untuk memenangkan mereka.