Di perusahaan tempat saya bekerja, para eksekutif bersikeras bahwa cakupan kode dengan uji unit harus 99% atau lebih. Ini menghasilkan lebih banyak tes daripada kode. Kami benar-benar membutuhkan 3 hari untuk menulis tes untuk satu kelas yang membutuhkan satu hari untuk diimplementasikan.
Namun, sebagai hasilnya, saya belajar banyak tentang TDD, alat pengujian, praktik, dll.
Di perusahaan tempat saya bekerja setelah itu, pengujian unit adalah hal yang tidak diketahui. Itu adalah sesuatu yang mungkin pernah didengar seseorang. Saya berjuang untuk memperkenalkan mereka pada konsep pengujian unit, tetapi tanpa efek.
Sekarang, sebagai wiraswasta, saya bertanya-tanya - berapa banyak waktu yang benar - benar diperlukan untuk dihabiskan untuk pengujian unit? Menjadi sebagian besar pengembang iPhone / Android, bagian mana dari kode yang harus dicakup dalam pengujian?
sumber
Jawaban:
Jumlah pengujian unit yang diperlukan tergantung pada beberapa faktor:
sumber
Dalam kelompok produk kami, kami menargetkan cakupan kode 50-70% dari pengujian unit dan 90% + cakupan dari pengujian unit dan otomatisasi pengujian digabungkan. Waktu umum yang dianggarkan untuk tes unit penulisan adalah sekitar 1 hari untuk setiap fitur yang membutuhkan 3-4 hari pengkodean head down. Tapi itu bisa bervariasi dengan banyak faktor.
Cakupan kode 99% bagus. Tes unit sangat bagus. Tetapi 99% cakupan kode dari pengujian unit saja? Saya merasa sulit untuk percaya bahwa Anda bisa mendapatkan cakupan sebanyak itu dari pengujian unit saja.
Untuk kasus di mana Anda menghabiskan 3 hari menulis tes untuk kelas yang dinyatakan membutuhkan 1 hari untuk diterapkan. Anda tidak menjelaskan mengapa perlu waktu lama atau membagikan kode apa pun. Dari spekulasi, saya kira Anda tidak benar-benar menulis unit test yang benar untuk kelas Anda, tetapi sebenarnya menulis otomatisasi tes . Dan sebenarnya tidak ada yang salah dengan itu - selama Anda mengenali perbedaan antara dua jenis tes yang berbeda.
Tetapi Anda mengatakan tiga hari penulisan tes hanya untuk satu kelas. Mungkin kelas itu sendiri tidak dirancang untuk pengujian unit. Apakah kelas menerapkan UI? Jaringan? File I / O? Jika demikian, Anda mungkin akhirnya menulis lebih banyak kode untuk menguji runtime Java daripada logika bisnis Anda yang berinteraksi dengan runtime.
TDD membuat Anda berpikir dalam hal antarmuka dan antarmuka untuk dependensi. Kelas tunggal yang mengimplementasikan UI, jaringan, dan file / io untuk fitur tunggal mungkin lebih baik disajikan dibagi menjadi beberapa kelas - satu untuk jaringan, satu untuk file / io, dan UI dipecah menjadi desain model-viewer-controller. Kemudian Anda dapat menerapkan tes yang sesuai untuk masing-masing dengan objek tiruan sederhana untuk dependensi. Tentu saja, semua ini membutuhkan lebih banyak waktu. Jadi, daripada 1 hari untuk kode dan 3 hari untuk menulis tes, jenis desain ini mungkin memerlukan 3 hari pengkodean dan 1 hari tes menulis. Tetapi kode akan jauh lebih baik dipelihara dan digunakan kembali.
sumber
Tes unit terbayar pada waktu pemeliharaan. Jika Anda berencana untuk memiliki aplikasi lama, Anda akan menghabiskan lebih banyak waktu pemeliharaan daripada yang Anda pikirkan sekarang (jika Anda belum mencoba ini, Anda akan terkejut berapa lama proyek yang sukses dapat hidup)
Apa yang Anda inginkan, adalah bahwa jika Anda secara tidak sengaja mengubah fungsionalitas tes Anda pecah sehingga Anda menemukan hal-hal ini secepat mungkin. Pelanggan sangat tidak suka ketika fungsi berubah secara tak terduga.
sumber
Jika Anda melakukan TDD, Anda akan menulis tes pada saat yang sama dengan kode, beralih di antara mereka setiap beberapa menit (atau kurang.) Tidak akan ada waktu yang berbeda dihabiskan untuk tes. Menggunakan TDD membuatnya lebih mudah untuk mengetahui bahwa Anda memiliki cakupan tes yang solid.
Jika Anda adalah Unit testing setelah fakta, Anda perlu menulis tes yang akan memberi tahu Anda jika kode rusak karena perubahan. Saya tidak akan mengandalkan metrik cakupan di sini, tetapi akan didasarkan pada kasus penggunaan dan parameter untuk antarmuka publik. Ini pada akhirnya akan didasarkan pada selera dan pengalaman Anda yang baik.
sumber
Jika Anda tidak akan menghabiskan waktu untuk tes, Anda akan menghabiskan lebih banyak waktu untuk debug dalam kode langsung.
Jadi habiskan waktu sebanyak yang dibutuhkan untuk tes, untuk mencakup semua (atau 99% kode).
sumber
Seperti yang telah dicatat oleh orang lain, sebagian besar tergantung pada jenis perangkat lunak. Rasio waktu pengujian / pengembangan 3: 1 yang Anda sebutkan mungkin agak terlalu banyak untuk proyek rata-rata, tetapi mungkin sangat oke untuk aplikasi misi kritis dan mungkin bahkan terlalu sedikit untuk sistem yang kritis.
Cakupan unit tes 99+% sama mungkin terlalu banyak untuk diharapkan dalam kasus aplikasi rata-rata, tetapi terlalu sedikit untuk proyek yang kritis.
Dalam pengalaman saya, mengingat bahwa bagian penting dari kode produksi adalah kode penanganan kesalahan, cakupan 80-90% akan cukup untuk sebagian besar aplikasi, dan ini bisa memerlukan kira-kira jumlah waktu yang sama yang dihabiskan untuk menulis tes unit sebagai kode produksi. (Kemudian lagi, jika seseorang bekerja dengan sungguh-sungguh dalam mode TDD, keduanya sepenuhnya terjalin untuk secara praktis menjadi satu tugas tunggal, sehingga orang hanya dapat memperkirakan nilai rasio aktual.)
sumber