Bagaimana saya tahu jika saya memiliki cakupan tes unit yang cukup untuk menghapus tes integrasi?

15

Saya sedang mengerjakan sistem warisan (maksud saya, itu ditulis tanpa tes). Kami telah mencoba menguji beberapa sistem dengan menulis tes integrasi yang menguji fungsionalitas dari luar.

Ini memberi saya kepercayaan diri untuk memperbaiki bagian-bagian kode tanpa khawatir akan merusaknya. Tetapi masalahnya adalah tes integrasi ini membutuhkan penyebaran (2+ menit) dan banyak menit untuk berjalan. Juga, mereka sakit untuk dipertahankan. Mereka masing-masing mencakup ribuan baris kode dan ketika salah satu dari mereka istirahat, butuh beberapa jam untuk men-debug alasannya.

Saya telah menulis banyak unit test untuk perubahan fungsional yang telah saya buat akhir-akhir ini, tetapi sebelum saya berkomitmen saya selalu melakukan penyebaran baru dan menjalankan semua tes integrasi, hanya untuk memastikan saya tidak melewatkan apa pun. Pada titik ini saya tahu tes unit saya dan beberapa tes integrasi tumpang tindih dengan apa yang mereka uji.

Bagaimana saya tahu ketika tes unit baik saya cukup mencakup tes integrasi yang buruk sehingga saya dapat menghapus tes integrasi itu?

Daniel Kaplan
sumber

Jawaban:

18

Metrik termudah adalah dengan bertanya, "kapan terakhir kali uji integrasi ini sah gagal?" Jika sudah lama (ada banyak perubahan) sejak tes integrasi gagal, maka unit test mungkin melakukan pekerjaan yang cukup baik. Jika tes integrasi gagal baru-baru ini, maka ada cacat yang tidak tertangkap oleh tes unit.

Preferensi saya umumnya adalah untuk meningkatkan ketahanan tes integrasi, ke titik di mana mereka dapat dijalankan secara andal tanpa pengawasan. Jika mereka membutuhkan waktu lama untuk berlari, maka jalankanlah semalaman. Mereka masih berharga bahkan jika mereka hanya berjalan sesekali. Jika tes ini terlalu rapuh atau memerlukan intervensi manual, maka mungkin tidak sepadan dengan waktu yang dihabiskan untuk menjalankannya, dan Anda dapat mempertimbangkan membuang yang paling sering berhasil.

Greg Hewgill
sumber
3
+1 untuk merekomendasikan tes menjadi otomatis karena itu mengarah ke pertanyaan yang jelas tentang "Mengapa membunuh tes otomatis?"
1
Ya, saya setuju dengan ini. Tentu saja, bahkan itu masih menggigit Anda jika Anda tidak memiliki cakupan tes unit yang cukup baik. Misalnya, saat ini kami memiliki rangkaian uji integrasi yang membutuhkan waktu sekitar 6 jam untuk berjalan ... tetapi saya tidak berpikir tes pernah dihapus karena fokus perusahaan saya pada kompatibilitas
Earlz
2
Mungkin saya harus memulai pertanyaan baru untuk ini, tetapi apakah Anda menyarankan bahwa setiap kali tes integrasi gagal, saya harus mencari cara untuk menulis unit test yang juga gagal dan membuat keduanya lulus?
Daniel Kaplan
2
@tTYT: Ya, itu benar-benar ide yang bagus. Tes unit baik; unit test untuk hal-hal yang Anda tahu sudah rusak sebelumnya bahkan lebih baik.
Greg Hewgill
7

Tes unit bukan cawan suci pengujian, mereka hanya satu alat dari banyak yang harus digunakan untuk menguji basis kode. Karena itu, tidak ada jumlah unit tes yang dianggap aman untuk menggantikan tes lain. Jika Anda memiliki tes integrasi yang buruk, Anda harus berusaha membuatnya menjadi tes integrasi yang baik, bukan menggantinya dengan yang lain, seperti mengganti pintu depan Anda dengan pagar pembatas dan gerbang.

Ryathal
sumber
Jika proyek ini dimulai dari awal, itu akan lebih masuk akal bagi saya. Tetapi tes integrasi pertama saya adalah "periksa apakah Anda bisa masuk" dan akhirnya saya membuat banyak tes unit yang "memeriksa apakah Anda bisa masuk". Tes integrasi lumpuh setiap saat jika Anda mengubah html. Contoh ini benar-benar dibuat-buat, tetapi bukankah ini kasus yang bagus untuk menghapus tes integrasi?
Daniel Kaplan
3
@tieTYT: menguji sesuatu melalui UI seringkali menghasilkan solusi yang sangat tidak stabil. Namun demikian, pengujian oleh UI itu penting, terkadang pengujian manual di sini menghasilkan lebih sedikit upaya daripada mencoba mengotomatisasi tes itu dan menjaganya tetap stabil. Jadi, ketika Anda berpikir hal ini terjadi di sini, Anda dapat menghapus "tes integrasi" dari daftar tes otomatis dan menambahkannya ke rencana pengujian tes manual.
Doc Brown
@DanielKaplan mungkinkah untuk memperbarui tes integrasi menjadi lebih stabil? Jika gagal karena perubahan html kadang-kadang, maka mungkin menguji sesuatu seperti "nama pengguna muncul di halaman setelah login" daripada sesuatu yang lebih spesifik seperti "nama pengguna muncul di dalam div ini setelah login"
Jen