Saya pikir saya akan menambahkan empat kasus lagi, di mana Debug. Assert dapat menjadi pilihan yang tepat.
1) Sesuatu yang belum saya lihat disebutkan di sini adalah cakupan konseptual tambahan yang dapat diberikan oleh Asserts selama pengujian otomatis . Sebagai contoh sederhana:
Ketika beberapa pemanggil tingkat yang lebih tinggi dimodifikasi oleh seorang penulis yang percaya mereka telah memperluas cakupan kode untuk menangani skenario tambahan, idealnya (!) Mereka akan menulis unit test untuk mencakup kondisi baru ini. Maka mungkin kode terintegrasi sepenuhnya tampaknya berfungsi dengan baik.
Namun, sebenarnya cacat yang halus telah diperkenalkan, tetapi tidak terdeteksi dalam hasil tes. Callee telah menjadi non-deterministik dalam kasus ini, dan hanya terjadi untuk memberikan hasil yang diharapkan. Atau mungkin telah menghasilkan kesalahan pembulatan yang tanpa disadari. Atau menyebabkan kesalahan yang diimbangi secara merata di tempat lain. Atau diberikan tidak hanya akses yang diminta tetapi juga hak istimewa tambahan yang tidak seharusnya diberikan. Dll
Pada titik ini, pernyataan Debug.Assert () yang terkandung dalam callee digabungkan dengan kasing baru (atau kasing tepi) yang didorong oleh unit test dapat memberikan notifikasi yang tak ternilai selama pengujian bahwa asumsi penulis asli telah dibatalkan, dan kode seharusnya tidak dirilis tanpa ulasan tambahan. Pertanyaan dengan unit test adalah mitra yang sempurna.
2) Selain itu, beberapa tes sederhana untuk ditulis, tetapi mahal dan tidak perlu diberikan asumsi awal . Sebagai contoh:
Jika suatu objek hanya dapat diakses dari titik masuk aman tertentu, haruskah permintaan tambahan dibuat ke database hak jaringan dari setiap metode objek untuk memastikan pemanggil memiliki izin? Tentunya tidak. Mungkin solusi ideal termasuk caching atau perluasan fitur lainnya, tetapi desain tidak memerlukannya. Debug.Assert () akan segera menunjukkan ketika objek telah dilampirkan ke titik masuk yang tidak aman.
3) Selanjutnya, dalam beberapa kasus, produk Anda mungkin tidak memiliki interaksi diagnostik yang membantu untuk semua atau sebagian operasinya ketika digunakan dalam mode rilis . Sebagai contoh:
Misalkan itu adalah perangkat real-time tertanam. Melempar pengecualian dan memulai kembali ketika menemukan paket yang salah adalah kontra-produktif. Alih-alih, perangkat mungkin mendapat manfaat dari pengoperasian dengan upaya terbaik, bahkan hingga menghasilkan derau dalam outputnya. Ini juga mungkin tidak memiliki antarmuka manusia, perangkat logging, atau bahkan dapat diakses secara fisik oleh manusia sama sekali ketika digunakan dalam mode rilis, dan kesadaran kesalahan paling baik diberikan dengan menilai output yang sama. Dalam hal ini, Pernyataan liberal dan pengujian pra-rilis menyeluruh lebih berharga daripada pengecualian.
4) Terakhir, beberapa tes tidak perlu hanya karena callee dianggap sangat dapat diandalkan . Dalam kebanyakan kasus, semakin banyak kode yang dapat digunakan kembali, semakin banyak upaya yang dilakukan agar dapat diandalkan. Oleh karena itu biasa untuk Pengecualian untuk parameter tak terduga dari penelepon, tetapi Tegas untuk hasil yang tidak terduga dari callees. Sebagai contoh:
Jika String.Find
operasi inti menyatakan itu akan mengembalikan a -1
ketika kriteria pencarian tidak ditemukan, Anda mungkin dapat dengan aman melakukan satu operasi daripada tiga. Namun, jika benar-benar dikembalikan -2
, Anda mungkin tidak memiliki tindakan yang wajar. Akan tidak membantu untuk mengganti perhitungan yang lebih sederhana dengan perhitungan yang menguji nilai secara terpisah -1
, dan tidak masuk akal di sebagian besar lingkungan rilis untuk mengotori kode Anda dengan tes yang memastikan perpustakaan inti beroperasi seperti yang diharapkan. Dalam hal ini, Sisipan ideal.