Kolega tidak mau menggunakan tes unit "karena lebih ke kode"

25

Seorang kolega tidak mau menggunakan tes unit dan sebagai gantinya memilih untuk tes cepat, berikan kepada pengguna, dan jika semuanya baik-baik saja, itu dipublikasikan langsung. Tidak perlu dikatakan bahwa beberapa bug dapat lewat.

Saya menyebutkan bahwa kita harus berpikir tentang menggunakan unit test - tetapi dia menentangnya begitu disadari lebih banyak kode harus ditulis. Ini membuat saya dalam posisi memodifikasi sesuatu dan tidak yakin outputnya sama, terutama karena kodenya spaghetti dan saya mencoba untuk memperbaiki ketika saya mendapat kesempatan.

Jadi apa cara terbaik untuk saya?

billy.bob
sumber
3
Keengganan untuk menulis tes unit mungkin kurang berhubungan dengan kolega Anda daripada dengan overhead sistemik dari implementasi tes unit umum.
mario
2
@james: Silakan lihat tanggapan saya terhadap @ m.edmondson.
doppelgreener
Baik!! Persaingan kurang untuk Anda !!
@ Jonathan - cukup adil, saya berdiri dikoreksi
ozz
@ m.Edmondson - pekerjaan baru .... itu sedikit membingungkan di bagian komentar saya, tapi itu terdengar seperti tempat yang sial untuk bekerja, teknologi lama, para pengembang tidak mau menggunakan praktik dev yang masuk akal.
ozz

Jawaban:

23

Dia tidak mengetahui manfaat pengujian unit dan itulah yang perlu Anda ubah:

  • Kesadarannya.

Anda harus membuktikan padanya bahwa itu akan meningkatkan pekerjaannya bukan hanya milik Anda. Itu akan sulit, dia mungkin akan mencoba untuk fokus pada setiap aspek negatif yang bisa dia temukan jika dia takut akan perubahan.

Anda dapat mencoba berdiskusi dengannya tentang semua manfaatnya dan mendengarkan semua pertengkarannya. Tunggu sampai dia selesai berbicara sebelum mulai berbicara sendiri.

Untuk mempersiapkan diri Anda, Anda harus melihat P.SE atau Google untuk semua hal manajemen atau pengembang khawatir tentang pengujian unit dan menyusun jawaban yang akan Anda gunakan selama diskusi Anda dengan kolega Anda.

Hanya mendengarkannya dan memberikan bukti bahwa itu akan meningkatkan pekerjaannya akan banyak membantu Anda. Anda membuktikan bahwa Anda prihatin dengan pendapatnya, dan Anda memberikan semua data yang dia butuhkan untuk menganalisis situasi dan akhirnya berubah pikiran.


sumber
20
Suka daftar satu item. +1
Armand
1
Jawaban ini akan sempurna jika Anda berhenti tepat setelah daftar. +1 :)
Pos Tim
Hai Tim selamat atas posisi kedua Anda dalam pemilihan SO!
6
Saya merasa bahwa daftar itu pantas bagan pie sendiri.
Tomas
Anda mungkin juga perlu mengubah kesediaannya untuk mengirimkan bug. Beberapa penghindaran cacat mungkin membuat pengujian yang lebih baik lebih penting.
stonemetal
15

Tulis tes unit (jangan katakan padanya)

Tunggu sampai barang rusak, Biarkan dia melakukan tes manual selama dua hari, lalu tarik unit test Anda dan temukan bug dalam tiga detik.

Berlindung...

thorsten müller
sumber
1
+1 Untuk menunjukkan bahwa bug tidak dapat dihindari dan harus dilindungi.
Neil
+1 Menulis serangkaian uji unit lengkap untuk satu bagian tertentu dari kode dapat memunculkan masalah yang cukup dengan kode yang menunjukkan manfaatnya. Saya ingat menonton presentasi tentang bagaimana unit test dapat digunakan untuk mempertahankan antarmuka / spesifikasi API / perilaku melalui penulisan ulang kode lengkap ...
JBRWilkinson
3
@ JBRWilkinson: Merb (mantan kerangka kerja aplikasi web Ruby) melakukan hal itu. Tidak dengan tes unit, tetapi dengan tes fungsional. Arsitekturnya telah tumbuh "secara organik", dan meskipun kerangka itu bagus untuk digunakan , itu tidak baik untuk dipertahankan dan diperluas . Dan karena rawatan dan ekstensibilitas sebenarnya adalah dua dari nilai jual utama atas kompetitornya Ruby on Rails, mereka jelas perlu melakukan sesuatu tentang hal itu. Dan apa yang mereka lakukan adalah benar - benar ke rm -rfdirektori tes sumber dan unit, hanya menyimpan tes fungsional, dan hanya membuat mereka lulus satu per satu.
Jörg W Mittag
11

Mengotomatiskan tugas-tugas manual seharusnya menarik bagi setiap programmer.

Jadi dia tidak "menulis lebih banyak kode" dia melakukan lebih sedikit secara manual.

Les
sumber
1
tergantung jika Anda memiliki tim pengujian yang melakukan semua itu untuk Anda :)
gbjbaanb
11

(Salah satu) poin dari pengujian otomatis adalah pengulangan . Jika Anda melakukan tes cepat dengan tangan, Anda dapat melakukannya menyelesaikannya lebih cepat daripada menulis yang sama dengan tes unit (setidaknya untuk pemula yang menguji unit - siapa pun yang berpengalaman dalam pengujian unit dapat melakukan tes cukup cepat).

Tetapi bagaimana ketika besok, atau minggu depan, perubahan kecil (atau besar ...) dilakukan pada kode? Apakah kolega Anda dengan senang hati mengulangi tes manual yang sama berulang-ulang setelah setiap perubahan, untuk memastikan tidak ada yang rusak? Atau apakah dia lebih suka "kode dan berdoa"?

Semakin banyak kode diubah, semakin banyak unit tes mengembalikan investasi awal Anda . Tidak perlu waktu lama untuk mendapatkan sisi positif, bahkan tanpa tes benar-benar menangkap bug. Tetapi mereka secara teratur juga melakukan itu - pada titik ini, mereka menjadi sangat berharga. Dan begitu seseorang mengalami perasaan aman, dan percaya diri pada kode seseorang yang diberikan oleh unit test yang berhasil, biasanya tidak ada jalan untuk kembali.

Jika dia agak yakin tetapi takut untuk menjelajah ke area baru, tawarkan dia sesi pemrograman pasangan untuk menulis tes unit pertamanya bersama-sama . Pilih kelas yang tidak terlalu sulit untuk diuji tetapi cukup kompleks sehingga layak untuk diuji.

Namun, jika dia tidak yakin, Anda mungkin perlu mengumpulkan fakta-fakta sulit . Fakta seperti itu mungkin saja

  • tingkat cacat dalam kode yang ditulis oleh Anda vs miliknya
  • menulis satu set unit test terhadap kodenya dan mendokumentasikan bug yang ditemukan.

Kumpulkan beberapa data seperti itu, lalu tunjukkan hasilnya dengan sopan. Jika ini masih belum cukup untuk meyakinkannya, Anda mungkin perlu mendiskusikan masalahnya dan membagikan bukti yang dikumpulkan dengan manajemen. Itu seharusnya menjadi pilihan terakhir Anda, tetapi terkadang tidak ada cara lain.

Péter Török
sumber
Sangat tidak mungkin - meskipun tidak diketahui memiliki halaman rencana pengujian (dokumen excel) yang panjang
billy.bob
@ m.edmondson, ya, itu hanya pertanyaan retoris :-)
Péter Török
+1 untuk pengulangan. Saya seorang refactor yang agresif, dan saya menyukai kenyataan bahwa saya dapat menemukan regresi dengan sangat cepat ketika saya benar-benar menulis ulang bagian kode.
Michael K
3

Tulis cakupan tes dasar untuk bit terburuk dari kodenya, rafactor berdasarkan pada tes-tes tersebut, kemudian buat kasus dengan manajemen bahwa pengujian unit pada build berkelanjutan akan meningkatkan produktivitas. Perubahan menjadi lebih mudah ketika diamanatkan oleh majikan daripada diinjili oleh pengembang tunggal.

Tidak tahu bagaimana mengekspresikan ini dengan benar, tetapi: jika Anda refactoring kodenya "ketika Anda mendapat kesempatan" ... well, dia mungkin berpikir Anda sedikit bodoh karena melibatkan diri Anda dalam "bisnisnya" , jadi kecil kemungkinannya untuk mendengarkan Anda dengan pikiran terbuka. Dalam pengalaman saya, orang-orang menjadi terikat dengan apa yang telah mereka lakukan - bahkan ketika itu tidak terlalu baik.

TZHX
sumber
Kami menggunakan .NET 1 (Lelucon yang saya tahu) - dapatkah pengujian unit diterapkan di sini?
billy.bob
1
@ m.edmondson: Sesuatu seperti NUnit mungkin? ( nunit.org )
dr Hannibal Lecter
@dr Hannibal Lecter - Ya, saya pikir kami punya salinannya di suatu tempat. Saya akan lihat apakah saya bisa menemukannya
billy.bob
4
unit test tidak perlu menggunakan rangkaian spesifik untuk menjadi efektif. Saya telah menulisnya hanya dengan python melakukan panggilan terhadap program c ++ dan memverifikasi nilai yang diterima. suatu kerangka kerja membantu, tentu saja, tetapi itu bukan keharusan.
TZHX
3

Untuk berperan sebagai advokat setan: dia benar. Saya biasanya menyebutnya:

Tes otomatis memecahkan masalah banyak kode dengan lebih banyak kode.

Alasan:

  • mempelajari tentang korelasi tingkat kesalahan dan metrik OO , hasil utama: "Setelah mengontrol ukuran [kelas] tidak ada metrik yang kami pelajari terkait dengan kesalahan-kecenderungan lagi" . (Ukuran membahas studi kelas. Apakah efek ini meluas ke ukuran basis kode? Mungkin. Di saya pendapat )
  • Secara empiris, proyek-proyek besar cenderung berjalan lambat. "5K baris semalam di proyek baru" vs. "10 baris / hari pada proyek besar". Apakah itu menunjukkan "resistensi" untuk berubah meningkat dengan ukuran basis kode?
  • Kami selalu menyatakan "tidak ada bahasa terbaik, itu tergantung pada masalahnya." Salah satu persyaratan utama adalah memodelkan entitas masalah dan operasi dengan mudah dalam bahasa pilihan. Bukankah itu menyarankan memilih bahasa di mana mengekspresikan masalah Anda lebih rumit lebih buruk , dan bukankah itu lagi berkorelasi dengan ukuran akhir dari basis kode?

Sekarang, ada beberapa argumen untuk melawan dengan mudah. Biarkan saya alamat yang saya bisa pikirkan:

  • ukuran vs kesederhanaan: Tentu saja dimungkinkan untuk membuat kode lebih pendek dan lebih buruk. Namun, itu hanya masalah ketika membandingkan basis kode dengan rasio singkat-kesederhanaan-vs-kesederhanaan, untuk diskusi kita dapat mengasumsikan kita entah bagaimana bisa mengendalikan faktor ini.

  • Tes unit menekan Anda untuk mengurangi dependensi, dan saya secara empiris setuju bahwa mengurangi depency dapat mengurangi masalah ukuran kode (dalam arti bahwa dari dua basis kode dengan ukuran yang sama, yang dengan lebih banyak ketergantungan lebih buruk). Namun , sementara mengurangi ketergantungan antara unit kode produksi, ia memperkenalkan sambungan antara tes dan unit itu sendiri.


TL; DR: Saya tidak berpendapat tes unit buruk; Saya bertanya: apakah ada titik impas di mana tes sakit yang berkorelasi dengan jumlah kode?

Peterchen
sumber
2

Saya pikir Anda berada dalam posisi yang sulit. Saya telah berada di tim di mana orang tidak akan menulis tes unit, atau lebih buruk, tes unit tidak dapat dipertahankan yang mengerikan. Tetapi semua orang menyadari fakta bahwa pengujian unit itu baik.

Jadi, mendapatkan unit test unit tim untuk memiliki kualitas yang baik adalah jalan yang sulit. Selalu waspada di mana hal-hal dapat ditingkatkan, menyampaikan gagasan, berbagi pengalaman.

Anda di sisi lain memiliki pengembang yang bahkan belum menyadari manfaatnya. Dan kemudian juga kode kode spageti. Saya kira salah satu alasan paling penting dalam kasus khusus ini adalah fakta bahwa menulis unit test yang bagus memaksa desain yang digabungkan secara longgar. Jadi membuatnya menulis tes semoga dalam jangka panjang juga meningkatkan kode "nyata".

Tapi saya pikir pada akhirnya, itu adalah keputusan tim (saya tidak tahu berapa banyak Anda di tim?). Jika tim dapat mencapai konsensus bahwa harus ada unit test unit yang mencakup dengan baik, maka semua orang harus menyesuaikan, berbagi pengalaman, dan membiarkan tim Anda tumbuh kuat bersama.

Namun jika tim tidak dapat mencapai konsensus bahwa Anda harus menulis tes unit, maka saya sarankan Anda mencari tim pengembangan yang berbeda untuk bekerja bersama;)

Pete
sumber
2

Apakah dia bosnya?

Jika demikian ... Anda agak macet kecuali Anda dapat meyakinkannya tentang manfaat yang pada dasarnya sejalan "satu ons pencegahan bernilai satu pon penyembuhan". Bug berhasil. TDD membantu mengurangi hal itu dengan membangun output yang konsisten.

Bukankah dia bosnya?

Apa standar pengkodean tempat Anda bekerja? Kenapa dia diizinkan memuntahkan kode spageti? Sampaikan kasus bisnis kepada bos dengan mengatakan "Kami akan menghabiskan waktu BANYAK lebih sedikit untuk bug jika kami menghabiskan lebih banyak waktu untuk TDD". Meyakinkan seseorang yang dapat menegakkan perubahan dengan kasus bisnis.

Dokumentasikan kasus di mana TDD dapat menghemat waktu & $$ UANG $$.

Bug ini muncul dengan sendirinya. Itu akan ditangkap sebelum ditayangkan. Menghabiskan 2 jam pencegahan akan menghemat 10 jam penyembuhan. Itu terjadi di sini, di sini, dan di sini. Itu 10 jam kerja yang akan menyelamatkan perusahaan 30 jam kerja. Itu uang sebanyak ini.

WernerCD
sumber
1
Mencoba untuk melakukan tes unit dari atas seperti memaksa pasangan Anda untuk makan lebih banyak sayuran. Mereka akan menurut dengan enggan, dan kembali ke kebiasaan lama ketika Anda berhenti menonton. Memperlakukan pengembang dengan lebih baik seperti orang dewasa yang responsif dan memberi tahu mereka bahwa unit test berguna.
nikie
1

Ini membuat saya mampu memodifikasi sesuatu

Mengapa?

Mereka menciptakan masalah. Mereka harus menyelesaikannya.

Manajer apa yang memungkinkan ini terjadi? Mengapa kode kereta orang lain sekarang menjadi masalah Anda?

Anda memiliki kolega dan manajer yang membuat ini terjadi. Dan dengan membersihkan kekacauan mereka, Anda adalah peserta yang bersedia dan aktif.

Tidak ada yang akan berubah jika mereka tidak merasakan sakitnya kualitas yang buruk.

S.Lott
sumber
> Mereka menciptakan masalah => Mereka harus menyelesaikannya. Terkadang orang yang paling dekat dengan kanvas tidak dapat melihat seluruh gambar. Menulis unit test akan melakukan sedikit pekerjaan tetapi tidak harus membersihkan pekerjaan orang lain. Kesempatan untuk memimpin dengan memberi contoh.
JBRWilkinson
1
@JBRWilkinson: Meskipun benar - dan apa yang sering saya lakukan - itu tidak mempengaruhi perubahan budaya. Jika seseorang menolak untuk melakukan tes, ada budaya di tempat yang membuat penolakan ini (a) mungkin dan (b) diperkuat sebagai perilaku yang baik. Diam-diam menanggung beban memperbaiki kekacauan orang lain tidak akan memperbaiki penyebab yang mendasarinya.
S.Lott
Sementara saya setuju bahwa itu tidak akan berkelanjutan bagi anggota tim untuk hanya mengeluarkan kode jelek dan mengandalkan orang lain yang berurusan dengan kekacauan mereka, saya pikir itu berbahaya untuk mengadopsi "jika Anda memecahkannya, Anda memilikinya" -modalitas. Anda tidak ingin orang takut mengubah dan meningkatkan kode. Alih-alih, fokuslah untuk menyebarkan praktik yang baik dan membangun rangkaian uji suara. Kemudian Anda dapat bekerja menuju pola pikir yang lebih "dimiliki bersama". Ini kode semua orang. Semua orang memperbaikinya, semua orang memperbaikinya dan bertanggung jawab.
Sara
1

Dia benar sekali, unit test adalah "lebih banyak kode".

Namun itu hanya lebih banyak kode yang harus ditulis untuk memastikan bahwa program bekerja sebagaimana mestinya (berulang-ulang). Ini bukan waktu yang terbuang. Ini adalah bagian dari sistem dan juga komponen inti.

Tantang dia di:

  1. Apa yang terjadi jika seseorang yang tidak terbiasa dengan kode mengubah sesuatu.
  2. Apa yang terjadi jika seseorang yang tidak berpengalaman mengubah sesuatu.
  3. Biaya pemeliharaan sistem tidak diukur dalam berapa lama waktu yang dibutuhkan untuk membuat. Ini proposisi jangka panjang. Pikirkan tentang total biaya kepemilikan.
  4. Perkiraannya (jika itu diperlukan sebelum pengkodean dimulai) harus mencakup persyaratan untuk menulis tes unit. Para pebisnis tidak membuat persyaratan yang memerlukan pengujian unit secara langsung, tetapi mereka memang memiliki persyaratan kualitas implisit dan mengharuskan perubahan di masa depan tidak dipenuhi dengan bug atau bahwa programmer yang sama mengubah sumbernya.
rupjones
sumber
Saya tidak yakin saya membeli "lebih banyak kode" begitu saja. Mungkin. Mungkin sering. Tetapi tidak harus begitu. Suite pengujian yang baik membantu Anda berdua dalam menulis lebih sedikit kode untuk memulai (Anda tahu kapan Anda selesai dan dapat langsung berhenti) dan membantu Anda refactor dan memperkecil kodenya lebih sering. Ini menghasilkan banyak tes dan tidak banyak kode produksi, sebagai lawan dari tidak ada tes dan gumpalan besar kode produksi yang tidak akan pernah dibersihkan.
Sara
1

Berbicara sebagai kode produksi saat ini, ditindaklanjuti dengan unit test daripada TDD, yang tampaknya tidak cocok di tempat saya saat ini (saya sudah melakukan TDD pada beberapa proyek, tetapi melihatnya sebagai alat lain di tas ol, bukan peluru perak) ...

Ini bisa menjadi penjualan yang sulit. Saya masih belum bisa menjual rekan kerja saya di unit testing. Saya tahu bahwa saya cenderung membuat lebih banyak kesalahan dalam kode pengujian unit saya daripada dalam kode produksi saya. Jadi, agak frustasi harus menghabiskan begitu banyak waktu memperbaiki kode uji unit ... Namun, itu asuransi yang bagus ketika kode dimodifikasi. Cara hebat untuk menguji kondisi tepi secara otomatis.

Brian Knoblauch
sumber
1

Tunjukkan padanya berapa banyak tes unit membantu dengan membuat tes unit sendiri.

Seperti yang pernah dikatakan Santo Fransiskus, "Berkhotbah Selalu. Bila perlu, gunakan kata-kata."

Jika dia melihat bahwa kode Anda menggunakan tes unit, dan bahwa Anda dapat menyelesaikan bug lebih cepat dengan tes unit, maka itu dapat berubah pikiran. Tapi, mungkin tidak.

Tidak peduli hasilnya, dia tidak melihat Anda mendorong sesuatu yang tidak ingin Anda lakukan. Itulah yang harus Anda ubah, persepsi bahwa Anda tidak memimpin dengan memberi contoh.

George Stocker
sumber