Saya memiliki sejumlah kode yang terlihat seperti ini:
function bool PassesBusinessRules()
{
bool meetsBusinessRules = false;
if (PassesBusinessRule1
&& PassesBusinessRule2
&& PassesBusinessRule3)
{
meetsBusinessRules= true;
}
return meetsBusinessRules;
}
Saya percaya harus ada empat unit tes untuk fungsi khusus ini. Tiga untuk menguji setiap kondisi dalam pernyataan if dan memastikan itu mengembalikan false. Dan tes lain yang memastikan fungsi kembali benar.
Pertanyaan: Haruskah sebenarnya ada sepuluh unit test saja? Sembilan yang memeriksa masing-masing jalur kegagalan yang mungkin. YAITU:
- False False False
- False False Benar
- False Benar False
Dan seterusnya untuk setiap kemungkinan kombinasi.
Saya pikir itu berlebihan, tetapi beberapa anggota lain di tim saya tidak. Cara saya melihatnya adalah jika BusinessRule1 gagal maka itu harus selalu mengembalikan false, tidak masalah jika diperiksa pertama atau terakhir.
unit-testing
bwalk2895
sumber
sumber
Jawaban:
Secara formal, jenis liputan tersebut memiliki nama.
Pertama, ada cakupan predikat : Anda ingin memiliki test case yang membuat pernyataan if benar, dan yang membuatnya salah. Memiliki cakupan ini dipenuhi mungkin merupakan persyaratan dasar untuk test suite yang baik.
Lalu ada Ketentuan Cakupan : Di sini Anda ingin menguji bahwa setiap sub-kondisi di if memiliki nilai true dan false. Ini jelas membuat lebih banyak tes, tetapi biasanya menangkap lebih banyak bug, jadi sering kali merupakan ide yang baik untuk disertakan dalam test suite Anda jika Anda punya waktu.
Kriteria cakupan paling maju biasanya disebut Cakupan Kondisi Kombinatorial : Di sini tujuannya adalah untuk memiliki test case yang melewati semua kemungkinan kombinasi nilai boolean dalam pengujian Anda.
Apakah ini lebih baik daripada predikat sederhana atau ketentuan cakupan? Dalam hal liputan, tentu saja. Tapi itu tidak gratis. Itu datang dengan biaya yang sangat tinggi dalam pemeliharaan uji. Untuk alasan ini, kebanyakan orang tidak peduli dengan cakupan kombinatorial penuh. Biasanya menguji semua cabang (atau semua kondisi), akan cukup baik untuk menangkap bug. Menambahkan tes tambahan untuk pengujian kombinatorial biasanya tidak akan menangkap lebih banyak bug, tetapi membutuhkan banyak upaya untuk membuat dan memelihara. Upaya ekstra biasanya membuat ini tidak sebanding dengan hasil yang sangat kecil, jadi saya tidak akan merekomendasikan ini.
Bagian dari keputusan ini harus didasarkan pada seberapa berisiko menurut Anda kode itu. Jika memiliki banyak ruang untuk gagal, layak untuk diuji. Jika agak stabil, dan tidak akan banyak berubah, Anda harus mempertimbangkan memfokuskan upaya pengujian Anda di tempat lain.
sumber
Pada akhirnya, itu tergantung pada Anda (tim r), kode dan lingkungan proyek tertentu. Tidak ada aturan universal. Anda (tim) harus menulis sebanyak mungkin tes yang Anda butuhkan untuk merasa nyaman bahwa kode itu memang benar . Jadi, jika rekan tim Anda tidak yakin dengan 4 tes, mungkin Anda perlu lebih banyak.
Waktu OTOH untuk menulis unit test biasanya merupakan sumber daya yang langka. Jadi usahakan untuk menemukan cara terbaik untuk menghabiskan waktu terbatas yang Anda miliki . Misalnya, jika Anda memiliki metode penting lain dengan cakupan 0%, mungkin lebih baik untuk menulis beberapa tes unit untuk membahasnya, daripada menambahkan tes tambahan untuk metode ini. Tentu saja, itu juga tergantung pada seberapa rapuh implementasi masing-masing. Merencanakan banyak perubahan pada metode khusus ini di masa mendatang dapat membenarkan cakupan tes unit tambahan. Jadi mungkin berada di jalur kritis di dalam program. Ini semua adalah faktor yang hanya Anda (tim r) yang dapat menilai.
Saya pribadi biasanya akan senang dengan 4 tes yang Anda buat, yaitu:
plus mungkin satu:
untuk memastikan bahwa satu-satunya cara untuk mendapatkan nilai pengembalian
true
adalah dengan memenuhi semua 3 aturan bisnis. Tetapi pada akhirnya, jika rekan setim Anda bersikeras agar jalur kombinatorial tertutup, mungkin lebih murah untuk menambahkan tes tambahan daripada melanjutkan argumen lebih lama :-)sumber
Jika Anda ingin aman, Anda akan membutuhkan delapan unit tes menggunakan kondisi yang diwakili oleh tabel kebenaran tiga variabel ( http://teach.valdosta.edu/plmoch/MATH4161/Spring%202004/and_or_if_files/image006.gif ).
Anda tidak pernah bisa yakin bahwa logika bisnis akan selalu menetapkan bahwa pemeriksaan dilakukan dalam urutan itu dan Anda ingin tes mengetahui sesedikit mungkin tentang implementasi yang sebenarnya.
sumber
Ya, harus ada kombinasi penuh di dunia yang ideal.
Saat melakukan tes unit, Anda harus benar-benar mencoba mengabaikan cara kerjanya. Cukup sediakan 3 input dan verifikasi bahwa output sudah benar.
sumber
Negara itu jahat. Fungsi berikut ini tidak memerlukan uji unit karena tidak memiliki efek samping dan dipahami dengan baik apa yang dilakukannya dan apa yang tidak dilakukannya. Mengapa mengujinya? Apakah Anda tidak mempercayai otak Anda sendiri ??? Fungsi statis sangat bagus!
sumber
a
,b
danc
. Anda dapat memindahkan logika bisnis di mana saja Anda inginkan, pada akhirnya Anda masih perlu mengujinya di suatu tempat.Saya tahu pertanyaan ini sudah cukup lama. Tapi saya ingin memberikan perspektif lain untuk masalah ini.
Pertama, unit test Anda harus memiliki dua tujuan:
what's the class' intention
danhow the class is doing its work
Jadi, rekapitulasi masalah, kami ingin menguji a
complex if statement
, untuk contoh yang diberikan, ada 2 ^ 3 kemungkinan, itu adalah jumlah tes penting yang dapat kami tulis.what is doing the code
Di sisi lain, jika Anda berada dalam posisi bahwa tes Anda bahkan lebih kompleks daripada implementasi, itu karena implementasinya harus dirancang ulang (kurang lebih tergantung pada kasus) daripada tes itu sendiri.
Untuk pernyataan if kompleks, misalnya, Anda dapat berpikir tentang pola responsabilitas berantai , menerapkan setiap penangan dengan cara ini:
If some simple business rule apply, derive to the next handler
Seberapa sederhana untuk menguji berbagai aturan sederhana, bukan aturan yang kompleks?
Semoga ini bisa membantu,
sumber
Ini adalah salah satu kasus di mana Sesuatu seperti quickcheck ( http://en.wikipedia.org/wiki/QuickCheck ) akan menjadi teman Anda. Alih-alih menuliskan semua N case dengan tangan, minta komputer membuat semua (atau setidaknya sejumlah besar) kasus uji yang mungkin dan memvalidasi bahwa semua mengembalikan hasil yang masuk akal.
Kami memprogram komputer untuk mencari nafkah di sini, mengapa tidak memprogram komputer untuk membuat test case untuk Anda?
sumber
Anda bisa mengubah kondisi menjadi kondisi penjaga:
Saya tidak berpikir itu mengurangi jumlah kasus, tetapi pengalaman saya adalah bahwa lebih mudah untuk memecahkannya dengan cara ini.
(Perhatikan bahwa saya penggemar "titik keluar" yang besar, tetapi saya membuat pengecualian untuk kondisi penjaga. Tetapi ada cara lain untuk menyusun kode sehingga Anda tidak memiliki pengembalian terpisah.)
sumber