Tes Unit Menulis di Tengah

14

Apakah unit menguji 100% atau tidak sama sekali jenis kesepakatan?

Saya sedang menelusuri proyek lama saya dan mulai menambahkan fitur, kali ini dengan pengujian unit. Namun, apakah ini pada akhirnya tidak ada gunanya jika saya akan menggunakan kembali komponen masa lalu yang tidak memiliki unit test?

Apakah saya perlu menulis tes unit untuk semua kelas sebelumnya dan tidak repot sama sekali, atau apakah boleh untuk hanya menulis tes unit untuk hal-hal baru yang saya tambahkan?

Lionel
sumber

Jawaban:

14

Setiap unit test lebih baik daripada tidak sama sekali. Jadi ini bukan kesepakatan semua-atau-tidak sama sekali.

Dalam kasus Anda, karena Test Driven Development belum menjadi norma - Anda akan bertanya-tanya bagaimana tes tersebut dapat digunakan.

Anda ingin memastikan bahwa kode apa pun di masa depan yang Anda tulis tidak merusak fungsionalitas apa pun (saat ini) - dan di situlah sub-kasus Anda sangat berguna. Jika tes yang ditulis dengan baik lulus, kemungkinan besar Anda tidak merusak apa pun. Pengembang berikutnya yang datang akan berterima kasih atas tes dan dokumentasi.

Apa yang dapat Anda mulai dengan adalah jika Anda memiliki arsitektur berlapis yang terpisah, mengambil tingkatan akses data dan bekerja ke atas (menuju tingkat UI) dengan pengujian. Jika proyek memiliki model domain, kandidat yang paling mungkin untuk TDD sebagai yang cenderung memiliki sebagian besar logika. Jika tingkat layanan (atau logika bisnis) hanya membuat panggilan ke Tingkat Domain / Akses Data, tidak ada gunanya melakukan Layanan tingkat dengan gaya TDD. Itu adalah tes yang lembut dan tidak banyak nilainya.

Ditambahkan ke alat cakupan kode seperti Emma - dan Anda dapat terus memantau peningkatan dalam cakupan tes secara keseluruhan.

JoseK
sumber
3

Saya telah bekerja pada basis kode yang sangat besar yang awalnya tidak memiliki unit test. Dengan mengikuti beberapa praktik kami sekarang (setelah beberapa tahun) memiliki sebagian besar basis kode tercakup oleh tes.

Semua kode baru harus memiliki unit test.

Semua kode yang diubah harus memiliki unit test yang ditambahkan padanya.

Cara kami menambahkan tes ke kode lama dengan aman tanpa merusaknya adalah dengan menggunakan pendekatan dasar berikut:

Pilih bagian kecil kode yang perlu Anda ubah fungsinya.

  1. Cobalah untuk membuat tes integrasi tingkat sistem untuk mengelilingi kode. Karena kompleksitas pengujian kombinatorial pada tingkat ini, tes ini hanya akan membentuk tes "asap" untuk mengambil kesalahan besar.
  2. Perkenalkan antarmuka yang Anda butuhkan untuk dapat menguji kode yang Anda ubah. Gunakan teknik Refactoring yang terdiri dari urutan perubahan yang sangat kecil yang Anda yakini benar. Coba gunakan dukungan alat jika memungkinkan. Anda dapat melakukan ini dengan, misalnya, memindahkan / mengekstraksi metode yang Anda ubah ke objeknya sendiri. Periksa perubahan Anda secara teratur sehingga Anda dapat kembali. Tinjau-tinjau secara berkala bagaimana Anda membuat perubahan dengan menelusuri riwayat kontrol revisi.

    Cobalah untuk membuat minimum tentang perubahan yang diperlukan untuk memutuskan ketergantungan yang mencegah Anda menambahkan tes.

  3. Tulis tes sejauh mungkin mencakup fungsionalitas kode yang akan Anda ubah. Lapor masuk secara teratur dan tinjau semua perubahan.
  4. Tulis tes untuk perubahan fungsionalitas / fungsionalitas baru.
  5. Menerapkan fungsionalitas (ini adalah siklus TDD normal Anda)
  6. Pastikan untuk memperbaiki area yang telah Anda cakup oleh tes (red-green-refactor).

Kami menemukan bahwa semakin banyak kami melakukan ini, semakin mudah didapat. Karena setiap kali Anda kembali ke basis kode, itu sedikit lebih baik.

Kami telah melihat penurunan besar dalam jumlah bug yang sampai ke penguji QA kami. Dengan regresi fungsi yang sekarang hampir tidak pernah terdengar, jadi saya pikir itu sepadan dengan usaha kami.

flamingpenguin
sumber
2

(karena kurangnya kemampuan berkomentar) saya pikir lebih baik daripada tidak menguji sama sekali. Tidak setiap cuplikan harus diuji, tetapi hanya apa yang akan digunakan oleh programmer pada akhirnya. Menguji fungsi utilitiy yang Anda gunakan secara internal itu baik, tetapi tidak diperlukan jika Anda mengakses semuanya melalui API bersih sesudahnya.

hantu0m
sumber
2

Jika barang lama telah berfungsi dengan baik selama bertahun-tahun, membuat unit test sekarang tidak wajib kecuali Anda mengubah sesuatu pada barang lama. Bagaimanapun, menulis unit test untuk bagian-bagian baru sama sekali tidak ada gunanya. Bagian-bagian baru adalah yang paling mungkin mengandung bug, dan mereka juga merupakan bagian yang paling mungkin diubah atau di-refactored.

pengguna281377
sumber
+1 "bagian-bagian baru adalah yang paling mungkin mengandung bug"
MIA
Itu tergantung pada kompleksitas proyek. "Bekerja dengan baik" biasanya berarti "belum rusak baru-baru ini" atau "belum rusak dengan cara yang disebutkan orang" ... tidak menyarankan Anda selalu harus menulis unit test untuk kode yang ada, tetapi jangan berasumsi bahwa itu berfungsi dengan benar atau sebagaimana dimaksud, baik.
Dave DuPlantis
1

Anda dapat mulai menutupi kode Anda saat ini dan, jika Anda punya waktu untuk menghabiskan, mulailah membahas fungsionalitas inti dari kode lama. Anda juga dapat meminta waktu tambahan untuk PM Anda =)

Alexey Anufriyev
sumber
0

Apakah unit menguji 100% atau tidak sama sekali jenis kesepakatan?

Benar-benar tidak! Mulai menguji kode baru yang Anda tambahkan. Anda akan melihat manfaat luar biasa dari melakukan itu, bahkan jika beberapa komponen yang lebih tua tidak memiliki tes. Karena Anda harus berurusan dengan salah satu komponen itu, atau menemukan bug di dalamnya, tulis sebuah tes. Seiring waktu, Anda akan mendapatkan lebih banyak kode lama yang diuji.

Marcie
sumber