Saya punya sesuatu seperti ini:
public byte[] EncodeMyObject(MyObject obj)
Saya telah menguji unit seperti ini:
byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF };
Assert.IsEqual(expectedResults, EncodeMyObject(myObject));
EDIT: Dua cara yang saya lihat diusulkan adalah:
1) Menggunakan nilai yang diharapkan hardcoded, seperti contoh di atas.
2) Menggunakan dekoder untuk mendekode array byte yang disandikan dan membandingkan objek input / output.
Masalah yang saya lihat dengan metode 1 adalah sangat rapuh dan membutuhkan banyak nilai kode keras.
Masalah dengan metode 2 adalah bahwa pengujian encoder tergantung pada decoder yang bekerja dengan benar. Jika encoder / decoder rusak secara merata (di tempat yang sama), maka pengujian dapat menghasilkan false positive.
Ini mungkin satu-satunya cara untuk menguji metode jenis ini. Jika itu masalahnya maka baiklah. Saya mengajukan pertanyaan untuk melihat apakah ada strategi yang lebih baik untuk jenis pengujian ini. Saya tidak dapat mengungkapkan internal encoder tertentu yang sedang saya kerjakan. Saya bertanya secara umum bagaimana Anda akan menyelesaikan masalah jenis ini, dan saya merasa internal tidak penting. Asumsikan bahwa objek input yang diberikan akan selalu menghasilkan array byte keluaran yang sama.
sumber
myObject
beralih darimyObject
ke{ 0x01, 0x02, 0xFF }
? Bisakah algoritma itu dipecah dan diuji? Alasan saya bertanya adalah saat ini, sepertinya Anda memiliki tes yang membuktikan bahwa satu benda ajaib menghasilkan benda ajaib lain. Satu-satunya kepercayaan Anda adalah bahwa satu input menghasilkan satu output. Jika Anda dapat memecah algoritma, Anda bisa mendapatkan kepercayaan lebih lanjut dalam algoritma, dan kurang bergantung pada input dan output magis.Jawaban:
Anda berada dalam situasi yang menjengkelkan di sana. Jika Anda memiliki format statis yang Anda encode, metode pertama Anda akan menjadi cara untuk pergi. Jika itu hanya format Anda sendiri, dan tidak ada orang lain yang harus memecahkan kode dari metode kedua adalah cara untuk pergi. Tetapi Anda tidak benar-benar cocok dengan salah satu kategori tersebut.
Apa yang saya lakukan adalah mencoba memecah hal-hal berdasarkan tingkat abstraksi.
Jadi saya akan mulai dengan sesuatu pada level bit, yang akan saya uji seperti
Jadi idenya adalah bahwa penulis bit tahu bagaimana menulis jenis bidang yang paling primitif, seperti int.
Tipe yang lebih kompleks akan diimplementasikan menggunakan dan menguji sesuatu seperti:
Perhatikan bahwa ini menghindari segala pengetahuan tentang bagaimana bit aktual dikemas. Itu diuji oleh tes sebelumnya, dan untuk tes ini kita akan menganggapnya berfungsi.
Kemudian pada tingkat abstraksi berikutnya yang kita miliki
jadi, sekali lagi, kami tidak mencoba untuk memasukkan pengetahuan tentang bagaimana varstrings atau tanggal atau angka sebenarnya dikodekan. Dalam pengujian ini, kami hanya tertarik pada pengkodean yang dihasilkan oleh encodeObject.
Hasil akhirnya adalah bahwa jika format untuk tanggal diubah, Anda harus memperbaiki tes yang sebenarnya melibatkan tanggal, tetapi semua kode dan tes lainnya tidak peduli dengan bagaimana tanggal sebenarnya dikodekan dan setelah Anda memperbarui kode untuk membuat pekerjaan itu, semua tes itu akan lulus dengan baik.
sumber
Tergantung. Jika pengkodean adalah sesuatu yang benar-benar diperbaiki, di mana setiap implementasi seharusnya membuat output yang persis sama, tidak masuk akal untuk memeriksa apa pun selain memverifikasi bahwa input contoh memetakan dengan tepat output yang diharapkan. Itu adalah ujian yang paling jelas, dan mungkin juga yang paling mudah untuk ditulis.
Jika ada ruang gerak dengan output alternatif, seperti dalam standar MPEG (misalnya ada operator tertentu yang dapat Anda terapkan pada input, tetapi Anda bebas untuk menukar upaya pengkodean versus kualitas output atau ruang penyimpanan), maka lebih baik untuk menerapkan mendefinisikan strategi decoding ke output dan memverifikasi bahwa itu sama dengan input - atau, jika encodingnya lossy, itu cukup dekat dengan input asli. Itu lebih sulit untuk diprogram, tetapi melindungi Anda dari segala peningkatan di masa depan yang mungkin dilakukan pada pembuat enkode Anda.
sumber
Uji itu
encode(decode(coded_value)) == coded_value
dandecode(encode(value)) == value
. Anda dapat memberikan input acak ke tes jika Anda mau.Mungkin saja encoder dan decoder rusak dengan cara yang gratis, tetapi sepertinya tidak mungkin kecuali Anda memiliki kesalahpahaman konseptual standar pengkodean. Melakukan tes hardcode dari encoder dan decoder (seperti yang sudah Anda lakukan) harus waspada terhadap hal itu.
Jika Anda memiliki akses ke implementasi lain dari ini yang diketahui berfungsi, Anda setidaknya dapat menggunakannya untuk mendapatkan keyakinan bahwa implementasi Anda baik bahkan jika menggunakannya dalam unit test tidak mungkin dilakukan.
sumber
decode(encode(char))
tidak akan samachar
(itu akan samachar+2
).Uji dengan persyaratan .
Jika persyaratan hanya 'meng-encode ke byte stream yang ketika di-decode menghasilkan objek yang setara.', Maka cukup uji encoder dengan decoding. Jika Anda menulis encoder dan decoder, maka cukup uji bersama-sama. Mereka tidak dapat memiliki "kesalahan pencocokan". Jika mereka bekerja bersama, maka tes akan berlalu.
Jika ada persyaratan lain untuk aliran data, maka Anda harus mengujinya dengan memeriksa data yang disandikan.
Jika format yang dikodekan sudah ditentukan sebelumnya, maka Anda harus memverifikasi data yang dikodekan terhadap hasil yang diharapkan, seperti yang Anda lakukan, atau (lebih baik) mendapatkan dekoder referensi yang dapat dipercaya untuk melakukan verifikasi. Penggunaan dekoder referensi menghilangkan kemungkinan Anda telah salah menafsirkan spesifikasi format.
sumber
Bergantung pada kerangka kerja pengujian dan paradigma yang Anda gunakan, Anda masih bisa menggunakan pola Arrange Act Assert untuk ini seperti yang Anda katakan.
Anda harus mengetahui persyaratan untuk
EncodeMyObject()
dan dapat menggunakan pola ini untuk menguji masing-masing kriteria yang valid dan tidak valid, dengan mengatur masing-masing kriteria tersebut dan meng-hardcoding hasil yang diharapkanexpected
, demikian pula untuk decoder.Karena yang diharapkan adalah hard coded, ini akan rapuh jika Anda punya perubahan besar.
Anda mungkin dapat mengotomatisasi dengan sesuatu yang didorong oleh parameter (lihat Pex ) atau jika Anda sedang melakukan DDD atau BDD melihat gerkin / mentimun .
sumber
Anda harus memutuskan apa yang penting bagi Anda.
Apakah penting bagi Anda bahwa Obyek selamat dari perjalanan pulang pergi, dan format kawat yang tepat tidak terlalu penting? Atau apakah format kawat yang tepat merupakan bagian penting dari fungsi encoder dan decoder Anda?
Jika yang pertama, maka pastikan saja benda-benda itu selamat dari perjalanan pulang pergi. Jika encoder dan decoder keduanya rusak dengan cara yang saling melengkapi, Anda tidak terlalu peduli.
Jika yang terakhir, maka Anda perlu menguji bahwa format kawat seperti yang Anda harapkan untuk input yang diberikan. Ini berarti menguji format secara langsung, atau menggunakan implementasi referensi. Tetapi setelah menguji dasar-dasarnya, Anda mungkin mendapatkan nilai dari tes bolak-balik tambahan, yang seharusnya lebih mudah ditulis dalam volume.
sumber