Jawaban untuk pertanyaan Anda
Apakah ada yang namanya memiliki terlalu banyak unit test?
Tentu ... Anda bisa, misalnya, memiliki beberapa tes yang tampaknya berbeda pada pandangan pertama tetapi benar-benar menguji hal yang sama (secara logis tergantung pada baris yang sama dari kode aplikasi "menarik" yang sedang diuji).
Atau Anda dapat menguji internal kode Anda yang tidak pernah muncul ke luar (yaitu, bukan bagian dari kontrak antarmuka apa pun), di mana orang dapat berdebat tentang apakah itu masuk akal, sama sekali. Misalnya kata-kata yang tepat dari pesan log internal atau apa pun.
Saya telah ditugaskan untuk menulis unit test untuk aplikasi yang ada. Setelah menyelesaikan file pertama saya, saya memiliki 717 baris kode uji untuk 419 baris kode asli.
Itu menurut saya cukup normal. Tes Anda menghabiskan banyak baris kode pada pengaturan dan teardown di atas tes yang sebenarnya. Rasio dapat meningkat, atau mungkin tidak. Saya sendiri cukup uji berat, dan sering menginvestasikan lebih banyak waktu dan lokasi pada tes daripada kode yang sebenarnya.
Apakah rasio ini akan menjadi tidak terkelola saat kami meningkatkan cakupan kode kami?
Rasio tidak menjadi faktor dalam begitu banyak. Ada kualitas tes lain yang cenderung membuatnya tidak terkendali. Jika Anda secara teratur harus memperbaiki sejumlah tes ketika melakukan perubahan yang agak sederhana dalam kode Anda, Anda harus memperhatikan alasannya. Dan itu bukan berapa banyak baris yang Anda miliki, tetapi bagaimana Anda mendekati pengkodean tes.
Pemahaman saya tentang pengujian unit adalah untuk menguji setiap metode di kelas untuk memastikan bahwa setiap metode bekerja seperti yang diharapkan.
Itu benar untuk tes "unit" dalam arti yang ketat. Di sini, "unit" menjadi sesuatu seperti metode atau kelas. Maksud dari pengujian "unit" adalah hanya menguji satu unit kode tertentu, bukan keseluruhan sistem. Idealnya Anda akan menghapus seluruh sisa sistem (menggunakan ganda atau yang lainnya).
Namun, dalam permintaan tarik, teknisi saya mencatat bahwa saya harus fokus pada pengujian tingkat yang lebih tinggi.
Lalu Anda jatuh ke dalam perangkap dengan asumsi orang benar-benar berarti tes unit ketika mereka mengatakan tes unit. Saya telah bertemu banyak programmer yang mengatakan "unit test" tetapi berarti sesuatu yang sangat berbeda.
Dia menyarankan pengujian 4-5 kasus penggunaan yang paling umum digunakan dengan kelas yang bersangkutan, daripada menguji setiap fungsi secara mendalam.
Tentu, hanya berkonsentrasi pada 80% teratas dari kode penting mengurangi beban juga ... Saya menghargai bahwa Anda sangat memikirkan bos Anda, tetapi ini tidak menurut saya sebagai pilihan optimal.
Bagi saya, cakupan 100% unit test adalah tujuan yang mulia, tetapi bahkan jika kita hanya mencapai 50%, kita akan tahu bahwa 100% dari 50% itu tercakup.
Saya tidak tahu apa "cakupan uji unit". Saya berasumsi maksud Anda "cakupan kode", yaitu bahwa setelah menjalankan rangkaian uji, setiap baris kode (= 100%) telah dieksekusi setidaknya satu kali.
Ini adalah metrik rata-rata yang bagus, tetapi sejauh ini bukan standar terbaik yang bisa digunakan. Hanya mengeksekusi baris kode bukanlah keseluruhan gambar; misalnya, ini tidak menjelaskan jalur yang berbeda melalui cabang yang rumit dan bersarang. Ini lebih merupakan metrik yang mengarahkan jarinya ke potongan kode yang diuji terlalu sedikit (jelas, jika kelas dengan cakupan kode 10% atau 5%, maka ada sesuatu yang salah); di sisi lain, cakupan 100% tidak akan memberi tahu Anda apakah Anda telah cukup menguji atau apakah Anda telah menguji dengan benar.
Tes integrasi
Ini mengganggu saya secara substansial ketika orang-orang terus-menerus berbicara tentang pengujian unit hari ini, secara default. Menurut pendapat saya (dan pengalaman), pengujian unit sangat bagus untuk perpustakaan / API; di area yang lebih berorientasi bisnis (di mana kita berbicara tentang kasus penggunaan seperti pada pertanyaan yang ada), mereka tidak selalu merupakan pilihan terbaik.
Untuk kode aplikasi umum dan dalam bisnis rata-rata (di mana menghasilkan uang, mencapai tenggat waktu, dan memenuhi kepuasan pelanggan adalah penting, dan Anda terutama ingin menghindari bug yang berada langsung di wajah pengguna, atau yang dapat menyebabkan bencana nyata - kami tidak bicara peluncuran roket NASA di sini), tes integrasi atau fitur jauh lebih berguna.
Mereka berjalan seiring dengan Pengembangan Berbasis Perilaku atau Pengembangan Berbasis Fitur; mereka tidak bekerja dengan unit test (ketat), menurut definisi.
Agar singkat (ish), tes integrasi / fitur melatih seluruh tumpukan aplikasi. Dalam aplikasi berbasis web, ini akan bertindak seperti browser yang mengklik aplikasi (dan tidak, jelas itu tidak harus sesederhana itu, ada kerangka kerja yang sangat kuat di luar sana untuk melakukan itu - lihat http: // mentimun. io misalnya).
Oh, untuk menjawab pertanyaan terakhir Anda: Anda membuat seluruh tim Anda memiliki cakupan tes yang tinggi dengan memastikan bahwa fitur baru hanya diprogram setelah uji fitur telah diterapkan dan gagal. Dan ya, itu berarti setiap fitur. Ini menjamin Anda cakupan fitur 100% (positif). Ini secara definisi menjamin bahwa fitur aplikasi Anda tidak akan "hilang". Itu tidak menjamin cakupan kode 100% (misalnya, kecuali jika Anda secara aktif memprogram fitur negatif, Anda tidak akan melakukan penanganan kesalahan / penanganan pengecualian).
Itu tidak menjamin Anda aplikasi bebas bug; tentu saja Anda akan ingin menulis tes fitur untuk situasi buggy yang jelas atau sangat berbahaya, input pengguna yang salah, peretasan (misalnya, manajemen sesi sekitar, keamanan dan semacamnya) dll .; tetapi bahkan hanya memprogram tes positif memiliki manfaat luar biasa dan cukup layak dengan kerangka kerja modern yang kuat.
Tes fitur / integrasi jelas memiliki cacing mereka sendiri (misalnya, kinerja; pengujian berlebihan terhadap kerangka kerja pihak ketiga; karena Anda biasanya tidak menggunakan ganda, mereka juga cenderung lebih sulit untuk menulis, dalam pengalaman saya ...), tetapi saya d mengambil aplikasi 100% positif yang diuji fitur lebih dari 100% kode-cakupan-aplikasi yang diuji (bukan perpustakaan!) setiap hari.