Meskipun ada beberapa cara untuk mencegah pengujian unit agar tidak dieksekusi, berapakah nilai pemeriksaan pada pengujian unit yang gagal?
Saya akan menggunakan contoh sederhana: Sensitivitas Kasus. Kode saat ini peka terhadap huruf besar-kecil. Input yang valid ke dalam metode adalah "Cat" dan itu akan mengembalikan enum dari Animal.Cat. Namun, fungsionalitas yang diinginkan dari metode ini tidak boleh peka huruf besar-kecil. Jadi, jika metode yang dijelaskan lulus "kucing" itu mungkin bisa mengembalikan sesuatu seperti Animal.Null bukan Animal.Cat dan unit test akan gagal. Meskipun perubahan kode sederhana akan berhasil, masalah yang lebih kompleks mungkin memerlukan waktu berminggu-minggu untuk diperbaiki, tetapi mengidentifikasi bug dengan unit test bisa menjadi tugas yang tidak terlalu rumit.
Aplikasi saat ini sedang dianalisis memiliki kode 4 tahun yang "berfungsi". Namun, diskusi terbaru tentang unit test telah menemukan kekurangan dalam kode. Beberapa hanya perlu dokumentasi implementasi eksplisit (mis. Case sensitif atau tidak), atau kode yang tidak mengeksekusi bug berdasarkan bagaimana itu disebut. Tetapi unit test dapat dibuat dengan menjalankan skenario tertentu yang akan menyebabkan bug dilihat dan merupakan input yang valid.
Apa nilai memeriksa unit test yang menjalankan bug sampai seseorang dapat memperbaiki kode?
Haruskah pengujian unit ini ditandai dengan pengabaian, prioritas, kategori dll, untuk menentukan apakah membangun berhasil berdasarkan tes yang dilaksanakan? Akhirnya tes unit harus dibuat untuk mengeksekusi kode begitu seseorang memperbaikinya.
Di satu sisi itu menunjukkan bahwa bug yang diidentifikasi belum diperbaiki. Di sisi lain, mungkin ada ratusan unit test gagal muncul di log dan menyaring yang gagal vs kegagalan karena kode check-in akan sulit ditemukan.
sumber
Jawaban:
Saya tidak suka unittests rusak check in karena mereka menghasilkan suara yang tidak perlu. Setelah setiap unittest saya harus memeriksa semua masalah yang gagal (merah). Apakah merah karena ada masalah baru atau karena ada yang lama terbuka untuk dilakukan / diperbaiki. Ini tidak apa-apa jika ada lebih dari 20 unittests.
Sebaliknya saya gunakan
[Ignore("Reason")]
atribut yang membuat hasilnya kuning atauthrow new NotImplementedException()
yang membuat hasilnya abu-abuCatatan: Saya menggunakan NUnit untuk .net. Saya tidak yakin apakah fitur "abu-abu" ada di kerangka kerja lain yang belum dikirim.
Jadi saya suka arti berikut dari hasil tes unit.
Semuanya kecuali "merah" dapat diperiksa.
Untuk menjawab pertanyaan: ada lebih banyak ruginya daripada nilai untuk memeriksa "test-gagal-merah" tetapi memeriksa "tes-tes yang diabaikan-kuning" atau "tes-abu-Tidak-terimplentasikan-Namun" dapat berguna sebagai daftar tugas.
sumber
will probably never be fixed
adalah keputusan politis jika Anda ingin mengeluarkan uang dalam tes otomatis atau tidak. Dengan "tes yang diabaikan" Anda memiliki kesempatan untuk memperbaikinya. Membuang "tes yang diabaikan" berarti "meninggalkan tes otomatis pada dan sampai tidak ada lagi"Saya tidak akan berpura-pura bahwa ini adalah standar industri, tetapi saya memeriksa tes yang rusak sebagai cara untuk mengingatkan saya atau anggota proyek saya yang lain bahwa masih ada masalah dengan kode atau tes unit itu sendiri.
Saya kira satu hal yang perlu dipertimbangkan adalah apakah kebijakan pengembangan Anda memungkinkan untuk tes gagal tanpa penalti. Saya punya teman yang bekerja di toko yang melakukan pengembangan berbasis tes, jadi mereka selalu memulai dengan tes yang gagal ...
sumber
Uji unit yang gagal memberikan visibilitas tim pengembangan ke dalam apa yang harus dilakukan untuk memenuhi spesifikasi yang disepakati.
Singkatnya, tes unit yang gagal memberi tim daftar "TODO".
Untuk alasan ini, kegagalan unit test jauh lebih baik daripada tidak ada unit test sama sekali. *
Tidak adanya unit test membuat tim pengembangan dalam kegelapan; spesifikasi harus berulang kali dikonfirmasi secara manual .
[* Asalkan unit test benar-benar menguji sesuatu yang bermanfaat.]
sumber
Tujuan dari unit test adalah untuk menegaskan perilaku yang diharapkan dari suatu sistem, bukan untuk mendokumentasikan kerusakan. Jika kita menggunakan unit test untuk mendokumentasikan cacat, maka kegunaannya untuk menegaskan perilaku yang diharapkan berkurang. Jawaban untuk pertanyaan "Mengapa tes ini gagal?" bukan sederhana "Oh, ada sesuatu yang rusak yang saya tidak harapkan akan rusak." Sudah menjadi tidak diketahui apakah tes gagal diharapkan atau tidak terduga.
Ini adalah paragraf dari awal bab 13 tentang Bekerja Secara Efektif dengan Kode Legacy :
sumber
Tetapi yang rusak yang mengidentifikasi bug dalam proyek baru, dinamai demikian. Dengan begitu Anda dapat melihat bahwa mereka HARUS rusak ... Ketika mereka diperbaiki, mereka akan berubah menjadi hijau, dan dipindahkan ke ruang uji normal.
CATATAN: Proyek itu harus disetel agar tidak dibangun di server build, jika server build Anda mencegah checkin yang merusak build (dengan asumsi Anda mendefinisikan build rusak sebagai salah satu di mana semua tes tidak lulus)
sumber
Tes unit harus menguji kasus kesalahan selain kasus keberhasilan suatu fungsi. Suatu fungsi harus secara eksplisit menolak input yang buruk atau harus memiliki dokumentasi untuk menjelaskan input apa yang dianggap valid.
Jika Anda memiliki fungsi yang tidak melakukan hal-hal tersebut, itu adalah bug dan Anda harus memiliki cara untuk merekam bahwa itu ada. Membuat unit test yang menunjukkan masalah ini adalah salah satu cara untuk melakukannya. Mengajukan tiket bug adalah pilihan lain.
Maksud dari pengujian unit bukanlah untuk mencapai kesuksesan 100%, intinya adalah untuk menemukan dan memperbaiki bug dalam kode. Tidak melakukan tes adalah cara mudah untuk mencapai kesuksesan 100%, tetapi itu tidak terlalu bermanfaat bagi proyek.
sumber
Ajukan bug untuk setiap kegagalan, dan perhatikan itu dalam hasil pengujian. Kemudian jika Anda pernah bertindak bersama-sama dan memperbaiki bug, tes Anda lulus dan Anda menghapusnya dari hasil tes. Jangan pernah mengabaikan masalah.
sumber
Bagaimana saya melihat TDD dilakukan dengan menerapkan tes untuk kode yang belum selesai, tulis tes terlebih dahulu dengan atribut [ExpectedException] atau serupa. Ini harus lulus pada awalnya karena kode yang tidak lengkap tidak akan memiliki logika di dalamnya dan menulis kode Exception () baru di dalamnya. Meskipun pengecualian yang salah adalah salah, ini setidaknya akan membuat tes lulus pada awalnya dan cocok untuk checkin. Kami mungkin lupa tes yang diabaikan tetapi mungkin dapat merapikan atau mengisi kode yang tidak lengkap. Ketika kami melakukannya, secara otomatis tes terkait yang mengharapkan pengecualian sekarang akan mulai gagal dan alarm Anda untuk memperbaikinya. Ini mungkin melibatkan sedikit perubahan tes untuk menyingkirkan ExpectException dan sebagai gantinya melakukan pernyataan nyata. CI, Dev, penguji dan pelanggan semua senang dan situasi win-win?
sumber