Salah satu faktor penting yang membuat unit test sangat berguna adalah umpan balik cepat .
Pertimbangkan apa yang terjadi ketika aplikasi Anda sepenuhnya tertutup dengan tes integrasi / Sistem / fungsional (yang sudah merupakan situasi ideal, jauh dari kenyataan di sebagian besar toko pengembangan). Ini sering dijalankan oleh tim pengujian khusus.
- Anda melakukan perubahan pada repo SCM,
- kadang-kadang (mungkin beberapa hari) kemudian orang-orang pengujian mendapatkan rilis internal baru dan mulai mengujinya,
- mereka menemukan bug dan mengajukan laporan bug,
- (dalam kasus yang ideal) seseorang memberikan laporan bug kembali kepada Anda.
Ini semua mungkin butuh berhari-hari atau bahkan berminggu-minggu. Pada saat ini Anda sudah mengerjakan tugas-tugas lain, sehingga Anda tidak memiliki rincian menit dari kode yang ditulis sebelumnya dalam pikiran Anda. Selain itu, Anda biasanya tidak memiliki bukti langsung tentang di mana bug itu berada, sehingga perlu waktu yang cukup lama untuk menemukan dan memperbaiki bug tersebut.
Sedangkan dalam unit testing (TDD)
- Anda menulis tes,
- Anda menulis beberapa kode untuk memenuhi tes,
- tes masih gagal,
- Anda melihat kode dan biasanya Anda memiliki pengalaman "oops" dalam beberapa detik (seperti "oops, saya lupa memeriksa kondisi itu!"), lalu
- segera perbaiki bug.
Ini semua terjadi dalam hitungan menit .
Ini bukan untuk mengatakan bahwa tes integrasi / sistem tidak berguna; mereka hanya melayani tujuan yang berbeda. Dengan unit test yang ditulis dengan baik, Anda dapat menangkap sebagian besar bug dalam kode sebelum mereka mencapai tahap integrasi, di mana sudah jauh lebih mahal untuk menemukan dan memperbaikinya. Anda benar bahwa tes integrasi diperlukan untuk menangkap jenis bug yang sulit atau tidak mungkin ditangkap dengan tes unit. Namun, dalam pengalaman saya itu adalah jenis yang lebih jarang; sebagian besar bug yang saya lihat disebabkan oleh kelalaian sederhana atau bahkan sepele di suatu tempat di dalam suatu metode.
Belum lagi pengujian unit juga menguji antarmuka Anda untuk kegunaan / keselamatan, dll., Sehingga memberi Anda umpan balik yang sangat penting untuk meningkatkan desain dan API Anda. Yang IMHO dapat sangat mengurangi kemungkinan bug / susbsystem integrasi bug: semakin mudah dan bersih API adalah, semakin sedikit kemungkinan kesalahpahaman atau kelalaian.
Apa yang Anda alami dengan pengujian unit otomatis, pengujian integrasi otomatis, dan pengujian penerimaan otomatis, dan menurut pengalaman Anda apa yang menghasilkan ROI tertinggi? dan mengapa?
ROI tergantung pada banyak faktor, mungkin yang terpenting adalah apakah proyek Anda adalah greenfield atau warisan. Dengan pengembangan greenfield saran saya (dan pengalaman sejauh ini) adalah melakukan pengujian unit gaya TDD dari awal. Saya yakin ini adalah metode yang paling hemat biaya dalam kasus ini.
Namun, dalam proyek warisan, membangun cakupan pengujian unit yang memadai adalah pekerjaan besar yang akan sangat lambat untuk menghasilkan manfaat. Akan lebih efisien untuk mencoba mencakup fungsionalitas paling penting dengan tes sistem / fungsional melalui UI jika memungkinkan. (aplikasi GUI desktop mungkin sulit untuk diuji secara otomatis melalui GUI, meskipun alat pendukung pengujian otomatis secara bertahap membaik ...). Ini memberi Anda jaring pengaman yang kasar tapi efektif dengan cepat. Kemudian Anda dapat mulai secara bertahap membangun unit test di sekitar bagian paling kritis dari aplikasi.
Jika Anda harus memilih hanya satu bentuk pengujian untuk diotomatiskan pada proyek Anda berikutnya, manakah itu?
Itu adalah pertanyaan teoretis dan saya merasa tidak ada gunanya. Semua jenis tes digunakan dalam kotak peralatan dari insinyur SW yang baik, dan semua ini memiliki skenario di mana mereka tidak tergantikan.