Apa maksud "DAMP not DRY" ketika berbicara tentang unit test?

345

Saya mendengar seseorang mengatakan bahwa unit test (mis. NUnit, jUnit, xUnit) seharusnya

DAMP bukan KERING

(Misalnya, tes unit harus berisi "kode basah" bukan "kode kering")

Apa yang mereka bicarakan?

Ian Ringrose
sumber
2
Tidak ada yang istimewa tentang tes unit yang menjamin kode non-KERING. Menulis tes non-KERING adalah alasan oleh programmer malas untuk mencoba mengukir wilayah untuk kemalasan mereka. Sederhananya, KERINGAN dan mudah dibaca adalah masalah ortogonal.
Acumenus
2
KERING meningkatkan jarak navigasi kode yang pada gilirannya menghasilkan beban mental yang lebih tinggi untuk dipahami. Ini berlaku di lingkungan berbasis teks "normal". Editor proyek dapat mengurangi ortogonalitas kode tetapi tidak dalam setiap kasus.
Peter

Jawaban:

595

Itu keseimbangan, bukan kontradiksi

DAMP dan KERING tidak bertentangan, melainkan menyeimbangkan dua aspek yang berbeda dari pemeliharaan kode . Kode dapat dipertahankan (kode yang mudah diubah) adalah tujuan akhir di sini.

DAMP (Frasa Deskriptif dan Bermakna) mempromosikan keterbacaan kode.

Untuk mempertahankan kode, Anda harus terlebih dahulu memahami kode tersebut. Untuk memahaminya, Anda harus membacanya. Pertimbangkan sejenak berapa banyak waktu yang Anda habiskan untuk membaca kode. Itu banyak. DAMP meningkatkan pemeliharaan dengan mengurangi waktu yang diperlukan untuk membaca dan memahami kode.

KERING (Jangan ulangi sendiri) mempromosikan ortogonalitas kode.

Menghapus duplikasi memastikan bahwa setiap konsep dalam sistem memiliki representasi otoritatif tunggal dalam kode. Perubahan ke konsep bisnis tunggal menghasilkan perubahan tunggal pada kode. KERING meningkatkan pemeliharaan dengan mengisolasi perubahan (risiko) hanya pada bagian-bagian sistem yang harus diubah.

Jadi, mengapa duplikasi lebih dapat diterima dalam tes?

Tes sering mengandung duplikasi yang melekat karena mereka menguji hal yang sama berulang-ulang, hanya dengan nilai input yang sedikit berbeda atau kode pengaturan. Namun, tidak seperti kode produksi, duplikasi ini biasanya diisolasi hanya untuk skenario dalam satu fixture / file pengujian. Karena itu, duplikasi ini minimal dan jelas, yang berarti menimbulkan risiko lebih kecil untuk proyek daripada jenis duplikasi lainnya.

Lebih jauh lagi, menghapus duplikasi semacam ini mengurangi keterbacaan tes. Rincian yang sebelumnya digandakan dalam setiap tes sekarang disembunyikan di beberapa metode atau kelas baru. Untuk mendapatkan gambaran lengkap dari tes ini, Anda sekarang harus menyatukan semua bagian ini secara mental.

Oleh karena itu, karena duplikasi kode uji sering membawa risiko lebih kecil, dan meningkatkan keterbacaan, mudah untuk melihat bagaimana itu dianggap dapat diterima.

Sebagai prinsip, pilih DRY dalam kode produksi, pilih DAMP dalam kode uji. Meskipun keduanya sama pentingnya, dengan sedikit kebijaksanaan Anda bisa memberi keseimbangan dalam kebaikan Anda.

Chris Edwards
sumber
18
Ini adalah ringkasan yang bagus dan singkat. Saya juga ingin menunjukkan bahwa tes DAMP lebih tangguh dalam menghadapi perubahan persyaratan, dan mengukur kejelasan tes adalah manfaat luar biasa ketika orang lain ditugaskan untuk menulis ulang tes Anda agar sesuai dengan persyaratan baru. Jesper Lundberg juga memiliki risalah yang bagus tentang masalah ini.
Jason
3
@Jason, Btw apakah ada tautan ke "Jesper Lundberg juga memiliki risalah yang bagus tentang masalah ini" ?
Pacerier
2
@JohnSaunders, Anda dapat menghindari beberapa duplikasi itu dengan menggunakan pola pembuat data uji: natpryce.com/articles/000714.html
si618
2
MENGURANGI kode tes berpotensi membuat tes tidak jelas dengan memperkenalkan tamu misterius
jayeff
1
Saya juga menambahkan, bahwa tes yang ditulis dengan baik pada dasarnya adalah dokumentasi / komentar untuk aplikasi Anda. Jadi menjadi lebih deskriptif membantu menjelaskan maksud Anda kepada pengembang lain. Dan seperti kata OP, mereka cukup lengkap dalam setiap pengujian sehingga bahaya bagi aplikasi Anda minimal. Skenario kasus yang lebih buruk adalah Anda memiliki tes redundan atau pengaturan tes dan dibutuhkan waktu lebih lama untuk menjalankan test suite. Saya lebih suka berbuat salah di sisi cakupan tes yang baik.
Lee McAlilly
60

DAMP - Ungkapan deskriptif dan bermakna.

"DAMP not DRY" nilai keterbacaan atas penggunaan kembali kode. Gagasan DAMP tidak KERING dalam kasus uji adalah bahwa tes harus mudah dipahami, bahkan jika itu berarti kasus uji terkadang memiliki kode berulang.

Lihat juga Apakah kode duplikat lebih dapat ditoleransi dalam pengujian unit? untuk beberapa diskusi tentang manfaat sudut pandang ini.

Mungkin diciptakan oleh Jay Fields , terkait dengan Bahasa Khusus Domain.

Dominic Rodger
sumber
1
Jawaban yang bagus dan tautan ke pertanyaan terkait. Tidak ada pilihan DAMP vs DRY yang sempurna. Kami menginginkan kode yang sekering mungkin dan dalam pengujian yang berarti tidak terlalu kering sehingga pengujian menjadi sulit dipahami. Ketika tes gagal saya ingin alasannya jelas sehingga pengembang dapat memulai memperbaiki SUT yang berarti saya condong ke arah kode DAMP dalam tes. Seperti kebanyakan konsep pemrograman, selalu mungkin untuk mengambil sesuatu yang terlalu jauh. Jika kode tes unit Anda sangat kering sehingga perlu waktu lama untuk menentukan bagaimana dan mengapa tes gagal itu mungkin "terlalu kering".
Gerald Davis
29

"KERING" adalah "Jangan ulangi dirimu sendiri"

Ini adalah istilah yang digunakan untuk memberitahu orang-orang untuk menulis kode yang dapat digunakan kembali, sehingga Anda tidak berakhir menulis kode yang sama berulang-ulang.

"DAMP" adalah "Frasa Deskriptif dan Bermakna".

Istilah ini dimaksudkan untuk memberi tahu Anda untuk menulis kode yang dapat dengan mudah dipahami oleh seseorang yang melihatnya. Jika Anda mengikuti prinsip ini, Anda akan memiliki nama variabel dan fungsi yang panjang dan deskriptif, dll.

Spudley
sumber
15
AIUI, KERING tidak hanya masalah menghemat waktu melalui penggunaan kembali - itu juga mencegah jalur kode yang berbeda mendapatkan "tidak sinkron". Jika Anda menyalin dan menempelkan logika yang sama di beberapa kelas, setiap instance dari kode itu perlu diperbarui ketika perubahan diperlukan. (Dan mau tidak mau salah satu dari mereka tidak akan, dan akan meledak ketika berolahraga.)
Andrzej Doyle
20

Damp = 'Frasa Deskriptif dan Bermakna' - tes unit Anda harus bisa 'dibaca':

Keterbacaan lebih penting daripada menghindari kode yang berlebihan.

Dari artikel:

DAMP adalah singkatan dari "frase deskriptif dan bermakna" dan merupakan kebalikan dari KERING, tidak dalam arti bahwa "semuanya harus terlihat seperti tumpukan sampah dan tidak mungkin untuk dibaca", karena keterbacaan lebih penting daripada menghindari kode yang berlebihan.

Apa artinya ini dan di mana menggunakannya?

DAMP sebagian besar berlaku saat menulis kode tes. Kode uji harus sangat mudah dipahami sampai-sampai beberapa redundansi dapat diterima.

stuartd
sumber
11

Ada beberapa jawaban di sini, tetapi saya ingin menambahkan yang lain karena saya pikir mereka tidak perlu menjelaskannya sebaik mungkin.

Gagasan KERING (Jangan ulangi diri Anda sendiri) adalah bahwa dalam kode aplikasi Anda, Anda ingin menghindari kode yang berlebihan atau berulang. Jika Anda memiliki sesuatu yang perlu dilakukan kode Anda beberapa kali, Anda harus memiliki fungsi atau kelas untuk itu, daripada mengulangi kode yang sama di beberapa tempat.

Ini adalah konsep pemrograman yang cukup terkenal.

DAMP (Frasa Deskriptif dan Berarti) adalah untuk unit test Anda. Idenya di sini adalah bahwa nama metode pengujian unit Anda harus panjang dan deskriptif - kalimat pendek yang menjelaskan apa yang Anda uji.

misalnya: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Ketika Anda membaca nama metode DAMP seperti ini, Anda harus memahami dengan tepat apa yang ingin dicapai oleh penulis tes, tanpa harus membaca kode tes (meskipun kode tes juga dapat mengikuti konsep ini juga tentu saja dengan nama variabel bertele-tele, dll).

Ini dimungkinkan karena metode unit test memiliki input dan output yang sangat spesifik, sehingga prinsip DAMP bekerja dengan baik untuk mereka. Metode dalam kode aplikasi utama Anda kemungkinan tidak cukup spesifik untuk menjamin nama-nama seperti ini, terutama jika Anda telah menuliskannya dengan prinsip KERING.

DAMP dan KERING tidak bertentangan satu sama lain - mereka mencakup aspek yang berbeda tentang bagaimana kode Anda ditulis - tetapi meskipun demikian mereka biasanya tidak digunakan bersama karena metode yang ditulis dengan prinsip KERING dalam pikiran akan menjadi tujuan umum dan tidak mungkin cocok untuk nama metode yang sangat spesifik. Secara umum, seperti dijelaskan di atas, kode aplikasi Anda harus KERING dan kode uji unit Anda DAMP.

Saya harap itu membantu menjelaskannya sedikit lebih baik.

SDC
sumber
5

Saya setuju dengan Chris Edwards bahwa Anda perlu mencapai keseimbangan di antara keduanya. Hal lain yang perlu diperhatikan adalah bahwa jika, dalam upaya untuk menghapus duplikasi, Anda akhirnya menambahkan banyak struktur tambahan dalam kode uji unit Anda (yaitu ketika mengambil KERING ke ekstrem), Anda berisiko memperkenalkan bug di sana. Dalam situasi seperti itu, Anda harus menguji unit test unit Anda atau membiarkan bit struktur tidak teruji.

Philip Atz
sumber
0

Saya tidak ingin menduplikasi upaya di sini, tetapi Anda dapat memiliki tes yang DAMP tetapi memiliki manfaat KERING. Di sisi lain, tes KERING tidak akan memenuhi tes DAMP dalam beberapa kasus.

Saya sudah membuat blog tentang KERING vs DAMP yang mencakup beberapa contoh.

Tidak ada pendekatan yang harus menjadi satu-satunya solusi Anda, kadang-kadang DAMP berlebihan, kadang-kadang tambahan yang sangat bagus.

Sebagai aturan umum, Anda harus menerapkan aturan tiga. Jika Anda menemukan duplikasi untuk ketiga kalinya, mungkin ada baiknya Anda memeriksa tes gaya DAMP, tetapi meskipun demikian tidak semua duplikasi itu buruk . Konteks penting.

Finglas
sumber