Saya tidak dapat menghitung berapa kali saya membaca pernyataan dalam uraian 'tes unit adalah sumber dokumentasi yang sangat penting dari kode yang diuji'. Saya tidak menyangkal mereka benar.
Tetapi secara pribadi saya belum menemukan diri saya menggunakannya sebagai dokumentasi. Untuk kerangka kerja khas yang saya gunakan, deklarasi metode mendokumentasikan perilaku mereka dan hanya itu yang saya butuhkan. Dan saya berasumsi unit tes mencadangkan semua yang dinyatakan dalam dokumentasi itu, ditambah kemungkinan beberapa hal internal, jadi di satu sisi duplikat dokumentasi sementara di sisi lain mungkin menambah beberapa lagi yang tidak relevan.
Jadi pertanyaannya adalah: kapan unit test digunakan sebagai dokumentasi? Kapan komentar tidak mencakup semuanya? Oleh pengembang mengembangkan sumber? Dan apa yang mereka ungkapkan yang dapat bermanfaat dan relevan sehingga dokumentasi itu sendiri tidak dapat ungkapkan?
sumber
Jawaban:
Mereka BUKAN Dokumentasi Referensi MUTLAK
Perhatikan bahwa banyak dari hal-hal berikut ini berlaku untuk komentar juga, karena mereka dapat tidak sinkron dengan kode, seperti tes (meskipun kurang dapat diberlakukan).
Jadi pada akhirnya, cara terbaik untuk memahami kode adalah memiliki kode kerja yang dapat dibaca .
Jika mungkin dan tidak menulis bagian kode tingkat rendah yang terprogram atau kondisi yang rumit, maka dokumentasi tambahan akan menjadi sangat penting.
TAPI Mereka MASIH Komplemen Dokumentasi yang MEMBANTU
Namun, ketika ragu tentang apa yang dilakukan kelas tertentu, terutama jika agak panjang, tidak jelas dan kurang komentar (Anda tahu jenisnya ...), saya dengan cepat mencoba menemukan kelas tesnya dan memeriksa:
Plus, jika ditulis menggunakan gaya BDD , mereka memberikan definisi kontrak kelas yang agak bagus . Buka IDE Anda (atau gunakan grep) untuk melihat hanya nama metode dan tada: Anda memiliki daftar perilaku.
Regresi dan Bug Juga Memerlukan Tes
Juga, ini adalah praktik yang baik untuk menulis tes untuk regresi dan untuk laporan bug: Anda memperbaiki sesuatu, Anda menulis tes untuk mereproduksi kasus ini. Ketika melihat kembali pada mereka, itu adalah cara yang baik untuk menemukan laporan bug yang relevan dan semua detail tentang masalah lama, misalnya.
Saya akan mengatakan mereka pelengkap yang baik untuk dokumentasi nyata, dan setidaknya sumber daya berharga dalam hal ini. Ini alat yang bagus, jika digunakan dengan benar. Jika Anda mulai menguji di awal proyek Anda, dan biasakan, itu BISA menjadi dokumentasi referensi yang sangat baik. Pada proyek yang sudah ada dengan kebiasaan pengkodean yang buruk yang telah mengotori basis kode, tangani mereka dengan hati-hati.
sumber
Salah satu interpretasi adalah bahwa tes unit adalah "dokumentasi yang dapat dieksekusi". Anda dapat menjalankan tes unit terhadap kode dan itu akan memberi tahu Anda apakah masih berfungsi seperti ketika tes ditulis untuk lulus, atau tidak. Dengan cara itu, unit ini menguji "mendokumentasikan" fungsionalitas sistem pada suatu saat, dengan cara yang dapat dieksekusi.
Di sisi lain saya juga jarang benar-benar membaca kode tes unit sebagai "dokumentasi" untuk memahami fungsi. Tes unit tunggal terlalu terlokalisasi, spesifik dan abstrak sehingga tidak dapat memberi tahu Anda banyak tentang sistem aktual yang ada di belakang kelas yang sedang diuji.
sumber
Jika dengan dokumentasi yang Anda maksud, saya ingin sesuatu untuk mengetahui bagaimana kode bekerja maka tes unit adalah contoh kecil yang sempurna tentang bagaimana unit kode bekerja di kedua kasus yang diharapkan , tepi , dan kesalahan (alias bug ). Juga, pengujian Anda dapat dibuat sebelum kode ditulis sehingga mendasari apa yang harus dilakukan kode dari sudut pandang bisnis / persyaratan.
Apakah mereka mengganti dokumentasi? Tidak.
Apakah mereka merupakan tambahan yang berguna untuk dokumentasi? Iya nih.
sumber
Saya melihat unit test sebagai:
Untuk beberapa perluasan mereka dapat dilihat sebagai pelengkap untuk dokumentasi yang ada tetapi tidak sebagai dokumentasi.
sumber
Saya akan menjawab pertanyaan Anda dengan menanyakan yang lain.
Seberapa sering ketika bekerja dengan API / rutin baru Anda telah membantu membantu mencari contoh kode dari hal yang Anda coba gunakan? Gagal Anda beralih ke google untuk mencari contoh kode secara daring?
Itulah tepatnya ketika Anda akan menggunakan unit test sebagai dokumentasi.
Saya menduga ada beberapa alasan mengapa unit test tidak cenderung digunakan sebagai dokumentasi meskipun mereka bisa menjadi pelengkap yang sangat baik untuk dokumentasi yang lebih tradisional:
sumber
TL; DR Unit test dan komentar API saling melengkapi - beberapa hal paling baik dijelaskan dalam kode, dan lainnya dalam prosa.
Tes unit terutama berguna untuk mendokumentasikan kasus khusus dan kondisi tepi yang sulit (dan rumit) untuk dijelaskan dalam komentar API. Juga, komentar API biasanya diarahkan ke orang yang ingin menggunakan API.
Jika Anda ingin memodifikasi kodenya, biasanya ada banyak lagi yang perlu Anda ketahui, dan beberapa di antaranya sulit dimasukkan ke dalam komentar (dan komentar ini cepat basi). Dalam hal ini, unit test juga berfungsi sebagai dokumentasi.
Contoh: Anda memiliki metode m
(a, b)
yang melakukan perhitungan tertentu. Karena persyaratan kompatibilitas ke belakang, itu harus input kasus khususa=0
dana=-1
, tetapi hanya jikab
NULL. Menempatkan itu dalam komentar itu rumit, bertele-tele, dan kemungkinan akan basi jika persyaratan tersebut kemudian dihapus.Jika Anda melakukan beberapa tes unit yang memeriksa perilaku
m(0, NULL)
,m(-1, x)
Anda mendapatkan beberapa manfaat:sumber