Jika saya sudah memiliki tes integrasi untuk program saya, dan mereka semua lulus, maka saya merasa itu akan berhasil. Lalu apa alasan untuk menulis / menambah unit test? Karena saya sudah harus menulis tes integrasi, saya hanya ingin menulis unit test untuk bagian yang tidak tercakup oleh tes integrasi.
Apa yang saya tahu manfaat dari tes unit daripada tes integrasi
- Kecil dan karenanya cepat dijalankan (tetapi menambahkan unit baru untuk menguji sesuatu sudah diuji dengan uji integrasi berarti total test suit saya menjadi lebih besar dan lebih lama untuk dijalankan)
- Temukan bug lebih mudah karena hanya menguji satu hal (tapi saya bisa mulai menulis unit test untuk memverifikasi setiap bagian individu ketika tes integrasi saya gagal)
- Temukan bug yang mungkin tidak tertangkap dalam tes integrasi. mis. bug masking / offsetting. (tetapi jika integrasi saya menguji semua yang lulus, yang berarti program saya akan bekerja bahkan ada bug tersembunyi ada. Jadi temukan / perbaiki bug ini bukan prioritas yang sangat tinggi kecuali mereka mulai melanggar tes integrasi di masa depan atau menyebabkan masalah kinerja)
Dan kami selalu ingin menulis lebih sedikit kode, tetapi tes unit tulis membutuhkan lebih banyak kode (terutama mengatur objek tiruan). Perbedaan antara beberapa tes unit saya dan tes integrasi adalah bahwa dalam tes unit, saya menggunakan objek tiruan, dan dalam tes integrasi, saya menggunakan objek nyata. Yang memiliki banyak duplikasi dan saya tidak suka kode duplikat, bahkan dalam tes karena ini menambah overhead untuk mengubah perilaku kode (alat refactor tidak dapat melakukan semua pekerjaan sepanjang waktu).
sumber
Jawaban:
Anda telah memberikan argumen yang bagus untuk dan menentang pengujian unit. Jadi, Anda harus bertanya pada diri sendiri, " Apakah saya melihat nilai dalam argumen positif yang lebih besar daripada biaya dalam yang negatif? " Tentu saja saya:
Dalam buku saya, pro lebih besar daripada kontra.
sumber
Saya tidak melihat banyak nilai dalam mengimplementasikan kembali testcase integrasi yang ada sebagai yang paling tidak kompatibel.
Tes integrasi seringkali jauh lebih mudah untuk ditulis untuk aplikasi warisan non tdd karena biasanya fungsionalitas yang akan diuji secara ketat digabungkan sehingga unit pengujian dalam isolasi (= unittesting) dapat menjadi sulit / mahal / tidak mungkin.
Menurut pendapat saya pengembangan yang digerakkan oleh tes paling efektif jika Anda menulis unit test sebelum kode aktual. Dengan cara ini kode yang memenuhi tes menjadi jelas dipisahkan dengan referensi eksternal minimum yang mudah diuji.
Jika kode sudah ada tanpa tes unit, biasanya banyak pekerjaan tambahan untuk menulis tes unit setelah itu karena kode itu tidak ditulis untuk pengujian mudah.
Jika Anda melakukan TDD kode secara otomatis mudah diuji.
sumber
unit-tests
, dan saya ingin memasukkanunit-tests
untuk bagian-bagian tertentu, menurut Anda lebih baik menulis duluintegration tests
untuk kode warisan. Setelah itu ditulis, maka Anda dapat melepaskan kopling ketat, dan membuat fungsi dengan antarmuka yang dapat diuji? Karena Andaintegration-test
sudah menulis, Anda dapat memverifikasi pada setiap langkah refactoring, bahwa versi baru kode masih berfungsi seperti yang diinginkan?Tes integrasi seharusnya hanya memverifikasi bahwa beberapa komponen bekerja bersama seperti yang diharapkan. Apakah logika masing-masing komponen akurat atau tidak harus diverifikasi oleh unit test.
Sebagian besar metode memiliki beberapa jalur eksekusi yang memungkinkan; pikirkan if-then-else's, variabel input dengan nilai yang salah tak terduga atau sekadar salah, dll. Biasanya pengembang cenderung hanya memikirkan jalur bahagia: jalur normal yang tidak salah. Tetapi sejauh menyangkut jalur lain itu, Anda memiliki dua opsi: Anda dapat membiarkan pengguna akhir menjelajahi jalur itu melalui tindakan yang diambil di UI dan berharap mereka tidak membuat crash aplikasi Anda, atau Anda dapat menulis unit test yang menegaskan perilaku dari jalan-jalan lain itu dan mengambil tindakan bila perlu.
sumber
Beberapa alasan yang Anda tunjukkan dalam pertanyaan Anda benar-benar penting dan dengan sendirinya bisa membuat kasus yang mendukung pengujian unit, tetapi YMMV. Misalnya, seberapa sering Anda menjalankan test suite terintegrasi Anda? Pengalaman saya dengan tes terintegrasi adalah cepat atau lambat mereka akan menjadi sangat lambat Anda tidak akan menjalankannya setiap kali Anda membuat perubahan dan waktu antara memasukkan dan mendeteksi bug akan meningkat.
Juga, kesalahan besar yang mungkin Anda lakukan adalah mempercayainya
Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.
tidak penting. Apakah Anda mengharapkan pengguna menemukan bug untuk Anda? Memercayai pertanggungan yang diperoleh dari tes terintegrasi berbahaya menurut saya, Anda dapat dengan mudah mendapatkan% cakupan yang tinggi tetapi pada kenyataannya Anda menguji sangat sedikit.
Saya kira referensi kanonik terhadap tes terintegrasi adalah posting JBrains:
http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1
jika Anda belum membacanya.
Akhirnya, IMO umpan balik yang bisa Anda dapatkan dari unit test untuk desain Anda sangat berharga. Menilai desain dengan perasaan dan mengandalkan tes terintegrasi juga bisa menjadi kesalahan.
sumber
Jika Anda berharap harus memodifikasi atau memperbaiki kode Anda, memiliki unit test sangat penting. Tes unit ada tidak hanya untuk menunjukkan bug pada saat kode ditulis, tetapi untuk menunjukkan kapan bug baru muncul ketika lebih banyak kode ditulis.
Ya, jauh lebih baik untuk menulis integrasi dan tes unit Anda terlebih dahulu, tetapi ada banyak nilai untuk memilikinya bahkan jika mereka ditulis nanti.
sumber