Prinsip kering menyatakan:
"Setiap pengetahuan harus memiliki representasi tunggal, tidak ambigu, otoritatif dalam suatu sistem."
Namun ketika menulis tes untuk kode Anda menggambarkan perilaku yang diharapkan untuk sistem dua kali (sekali dalam kode dan sekali dalam tes). Saya tahu kedua deskripsi berasal dari perspektif yang berbeda tetapi berbagi banyak ide mendasar.
Ada pemikiran tentang ini?
Secara umum saya pikir tes unit dan prinsip KERING adalah ide yang bagus dan saya mencoba menerapkannya sebanyak mungkin. Pertanyaan ini lebih pada tingkat filosofis, tetapi saya bertanya-tanya apakah ada yang juga memikirkan hal ini.
Jawaban:
Anda beroperasi pada premis yang salah.
Kode ini bukan merupakan deskripsi perilaku yang diharapkan, hanya persyaratan dan kasus uji saja. Dan bahkan kemudian, persyaratan dan tes menentukan dua sisi perilaku. Persyaratan menentukan karakteristik dan fungsionalitas sistem perangkat lunak secara keseluruhan dan pengujian menentukan apa hasil yang diharapkan dan cocok dengan persyaratan. Kode tersebut adalah interpretasi pengembang terhadap persyaratan dan arsitektur sistem.
sumber
Tidak, itu tidak melanggar prinsip KERING karena unit test tidak mereproduksi fungsionalitas, mereka hanya memastikan fungsionalitas (re: tanggung jawab) beroperasi dengan benar. Dalam hal unit test, metode yang Anda uji masih dipertahankan
authoritative representation
. Kode tes Anda mungkin terlihat sangat mirip dengan kode yang mengimplementasikan metode dalam versi produksi, tetapi memiliki tujuan yang jelas (untuk menegaskan tes).sumber
Agak. Jika mereka terlalu mirip, maka ya, itu hal yang buruk. Tes Anda tidak boleh dikodekan dengan cara yang sama dengan kode yang diuji. Jadi, Anda harus mendefinisikan (1) harapan dan (2) implementasi.
Saya suka berpikir bahwa ini mirip dengan akuntansi entri ganda . Sistem akuntansi selalu membuat setidaknya 2 entri (debit dan kredit). Ini adalah ukuran pengecekan kesalahan. Pada akhirnya, debet dan kredit harus seimbang, atau ada kesalahan. Anda tidak dapat memiliki sistem pendeteksian kesalahan tanpa redundansi.
Sebagai contoh, pertimbangkan CRC . Byte CRC Anda adalah bentuk redundansi. Cukup untuk mendeteksi kesalahan kecil pada sinyal. Demikian pula, CD audio memiliki banyak informasi yang berlebihan sehingga mereka masih dapat diputar dengan sempurna jika tergores. Apakah itu melanggar prinsip KERING? Mungkin, tapi begitulah cara Anda mendapatkan keandalan.
Ada cara lain untuk melihatnya juga:
Tes Anda adalah jawaban resmi. Kode yang diuji hanya dihasilkan secara otomatis oleh Anda, kode monyet. Jika kita dapat melakukan pembuatan kode secara otomatis berdasarkan pada tes unit (seperti kita membuat lapisan akses data secara otomatis berdasarkan skema basis data) maka kita tidak akan melanggar prinsip KERING (atau setidaknya bukan prinsip OAOO).
sumber
Tidak terlalu. Kode bukanlah deskripsi perilaku yang diharapkan, tetapi implementasinya . Yang bisa mengandung kesalahan, itu sebabnya kami membutuhkan tes.
Menerapkan bahkan algoritma atau abstraksi yang cukup sederhana jauh lebih sulit daripada menggambarkannya. Setiap programmer yang baik dapat menjelaskan dalam beberapa kalimat bagaimana pencarian biner bekerja - masih, Jon Bentley melaporkan bahwa dalam eksperimennya, lebih dari 70% programmer berpengalaman yang berpartisipasi dalam kursusnya gagal mengimplementasikannya dengan benar.
Inilah sebabnya kami membutuhkan unit test. Tidak ada yang suka bekerja dua kali lebih banyak untuk mencapai hasil yang sama, tetapi semua pengembang yang merumuskan dan menginjili praktik ini menyadari dari pengalaman susah payah mereka sendiri bahwa mereka membutuhkannya. Mereka adalah orang-orang pintar yang ingin mengembangkan perangkat lunak secepat mungkin - yang membutuhkan penghapusan semua tugas yang digandakan dan tidak berguna dari proses pengembangan. Tes unit bukan pekerjaan rangkap.
sumber