Apakah tes unit benar-benar digunakan sebagai dokumentasi?


22

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?


4
Jangan pernah berpikir untuk menggunakan unit test langsung sebagai dokumentasi. Saya pikir unit test sering tidak dapat dibaca, karena banyak pengembang tidak meluangkan waktu untuk menuliskannya dengan jelas.
superM

10
Komentar mungkin salah.

2
Saya tahu Anda bertanya secara spesifik tentang unit test, tetapi saya juga mencatat bahwa tes integrasi / sistem sebagai dokumentasi yang sangat berguna juga, hanya pada level yang berbeda
jk.

3
Saya telah melihat unit test yang akan lebih baik ditandai sebagai "unit percobaan". Ketergantungan mereka pada faktor-faktor eksternal sama saja dengan membuat mereka hampir tidak berguna. Mereka juga sangat tidak jelas. (Ya, saya memiliki tujuan jangka panjang untuk memperbaiki mereka menjadi lebih baik, tetapi saya juga melakukan hal-hal lain ...)
Donal Fellows

4
@Ant unit test memunculkan kode asli dan mendokumentasikan respons yang diharapkan dan membandingkannya dengan respons yang sebenarnya. Apakah kode yang dipanggil itu benar atau tidak, bukan itu intinya - tes mendokumentasikan cara memintanya.

Jawaban:


17

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.

  • Tes bisa tidak lengkap:
    • API berubah dan tidak diuji,
    • Orang yang menulis kode menulis tes untuk metode termudah untuk menguji terlebih dahulu daripada metode yang paling penting untuk menguji, dan kemudian tidak punya waktu untuk menyelesaikannya.
  • Tes bisa usang.
  • Tes dapat dihubung pendek dengan cara yang tidak jelas dan tidak benar-benar dieksekusi.

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:

  • apa yang sebenarnya mereka coba periksa (memberikan petunjuk tentang informasi paling penting, kecuali jika pengembang melakukan kesalahan yang disebutkan di atas hanya menerapkan tes "mudah"),
  • dan jika ada kasus sudut.

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.


Bolehkah saya bertanya mengapa saya diturunkan suara? Apa yang mengganggu Anda di sana atau apa yang tidak Anda setujui?
haylem

2
Bagian (IMO) terbaik dari argumen Anda ditulis dalam font terkecil - cara terbaik untuk memahami kode adalah dengan memiliki kode yang dapat dibaca. Saya akan mengubahnya menjadi "kode yang dapat dibaca dan bekerja", tetapi saya setuju. Kemudian jika Anda melihat unit test lagi - tes yang berjalan adalah kode yang berfungsi (dan seperti semua kode, harus dapat dibaca), jadi itu sebenarnya dokumentasi yang cukup bagus (jika sering terlalu lokal) bila dilakukan dengan baik.
Joris Timmermans

@MadKeithV: terima kasih. Saya memperbarui untuk "kode yang dapat dibaca dan bekerja" dan mendorong sedikit lebih tinggi.
haylem

11

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.


5

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.


4

Saya melihat unit test sebagai:

  • cara untuk membuktikan dokumentasi itu benar (dengan asumsi dokumentasi cocok dengan implementasi api).
  • cara untuk menunjukkan kepada pengembang cara menggunakan fitur tertentu; perlengkapan tes unit / unit test itu sendiri biasanya cukup kecil sehingga seseorang dapat dengan cepat belajar darinya.
  • dan jelas untuk menemukan bug regresi.

Untuk beberapa perluasan mereka dapat dilihat sebagai pelengkap untuk dokumentasi yang ada tetapi tidak sebagai dokumentasi.


3

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.

  • Sebenarnya tes unit dapat sedikit lebih ketat daripada contoh kode normal, karena Anda harus memiliki beberapa tes (contoh).
  • Semoga tes unit Anda menggambarkan penggunaan yang tepat . Misalnya Mereka jelas menunjukkan semua ketergantungan esensial baik melalui benda normal atau benda tiruan. (Kalau tidak, itu bukan tes unit yang sangat baik.)
  • CATATAN: Jika komentar atau "dokumentasi normal" Anda memberikan contoh kode, Anda sebenarnya melanggar prinsip KERING. Dan contoh kode tersebut dapat dengan mudah menjadi salah dari waktu ke waktu, sedangkan ada kemungkinan lebih kecil dari itu dengan pengujian unit yang dilakukan secara rutin.
  • Jika unit test menyeluruh (biasanya big if ), maka mereka harus memberikan informasi tambahan:
    • Semua kasus tepi yang diketahui dengan jelas diilustrasikan.
    • Semua pengecualian yang diharapkan bisa dibuang.
    • Semua bug yang ditemukan sebelumnya (ini mungkin lebih berguna ketika memperpanjang unit yang sedang diuji daripada saat menulis klien baru untuk unit).
    • Semua aturan bisnis mendasar yang terkait dengan unit. (jika ada)

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:

  • Saya berani menyarankan bahwa seringkali tes itu sendiri tidak cukup baik ditulis untuk tujuan itu. Jawaban lain telah disinggung untuk tes yang:
    • Tidak lengkap.
    • Membingungkan (Saya telah melihat kasus uji yang tidak memanggil metode yang sedang diuji secara langsung - Anda masuk 3/4 tingkat jauh ke dalam tumpukan panggilan sebelum dipanggil dan prasyarat untuk memanggil metode tersebut tersebar di tempat yang berbeda dalam hierarki kelas yang kompleks. )
    • Ketinggalan jaman. (Biasanya tes harus gagal ketika mereka menjadi usang, tetapi ini tidak selalu terjadi).
  • Biasanya ada banyak contoh penggunaan sudah tersedia dalam kode produksi setiap kali kebutuhan akan suatu contoh muncul.
  • Unit yang diuji ditulis dengan sangat baik (self documenting) sehingga metodenya tidak perlu contoh. Saya harap!
  • Dalam pengalaman saya sebagai seorang programmer, kita cenderung cukup tertarik untuk terjun di akhir yang mendalam dan RTFM Selasa depan ...
  • Dokumentasi dan komentar yang melanggar prinsip KERING.

2

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 khusus a=0dan a=-1, tetapi hanya jika bNULL. 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:

  • Deskripsi perilaku yang benar jelas, kesalahpahaman berkurang
  • Orang tidak dapat mengabaikan persyaratan ketika mereka mengubah kode, tidak seperti komentar

tetapi untuk contoh Anda, jika perilaku itu tidak didokumentasikan dalam komentar sama sekali, pengguna mungkin mendapatkan hasil yang tidak terduga untuk kasus tepi itu. Yang bukan merupakan hal yang baik.
stijn

@stijn: Benar. Dalam hal ini cara terbaik mungkin adalah dengan menyebutkan secara singkat kasus khusus dalam dokumen, ditambah tes unit untuk rincian berantakan.
sleske
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.