Keuntungan dari ini adalah ke Fail Fast .
Kami tidak memiliki kode, kami juga tidak memiliki banyak contoh awalan yang atau tidak menguji awalan cabang menurut kode. Yang kita miliki adalah ini:
- 089 - 100 => cabang uji
- 10B, 10C => cabang uji
- <088 => mungkin cabang nyata
- > 100 => mungkin cabang nyata
Fakta bahwa kode memungkinkan angka dan string lebih dari sedikit aneh. Tentu saja, 10B dan 10C dapat dianggap sebagai angka heksa, tetapi jika semua awalan diperlakukan sebagai angka heksa, 10B dan 10C berada di luar rentang tes dan akan diperlakukan sebagai cabang nyata.
Ini kemungkinan berarti bahwa awalan disimpan sebagai string tetapi diperlakukan sebagai angka dalam beberapa kasus. Berikut adalah kode paling sederhana yang dapat saya pikirkan yang mereplikasi perilaku ini (menggunakan C # untuk tujuan ilustrasi):
bool IsTest(string strPrefix) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix))
return iPrefix >= 89 && iPrefix <= 100;
return true; //here is the problem
}
Dalam bahasa Inggris, jika string adalah angka dan antara 89 dan 100, itu adalah tes. Jika itu bukan angka, itu ujian. Kalau tidak, ini bukan ujian.
Jika kode mengikuti pola ini, tidak ada unit test akan menangkap ini pada saat kode itu digunakan. Berikut adalah beberapa contoh unit test:
assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change
Tes unit menunjukkan bahwa "10B" harus diperlakukan sebagai cabang uji. Pengguna @ gnasher729 di atas mengatakan bahwa aturan bisnis berubah dan itulah yang ditunjukkan oleh pernyataan terakhir di atas. Pada titik tertentu yang menyatakan harus beralih ke isFalse
, tetapi itu tidak terjadi. Tes unit dijalankan pada waktu pengembangan dan waktu pengembangan tetapi kemudian tidak ada titik setelahnya.
Apa pelajarannya di sini? Kode membutuhkan beberapa cara untuk memberi sinyal bahwa ia menerima input yang tidak terduga. Berikut adalah cara alternatif untuk menulis kode ini yang menekankan bahwa ia mengharapkan awalan menjadi angka:
// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix)) {
isTest = iPrefix >= 89 && iPrefix <= 100;
return true;
}
isTest = true; //this is just some value that won't be read
return false;
}
Bagi mereka yang tidak tahu C #, nilai kembali menunjukkan apakah kode mampu mengurai awalan dari string yang diberikan. Jika nilai kembali benar, kode panggilan dapat menggunakan variabel isTest out untuk memeriksa apakah awalan cabang adalah awalan tes. Jika nilai kembali salah, kode panggilan harus melaporkan bahwa awalan yang diberikan tidak diharapkan, dan variabel isTest out tidak berarti dan harus diabaikan.
Jika Anda setuju dengan pengecualian, Anda dapat melakukan ini sebagai gantinya:
// Alternative B
bool IsTest(string strPrefix) {
int iPrefix = int.Parse(strPrefix);
return iPrefix >= 89 && iPrefix <= 100;
}
Alternatif ini lebih mudah. Dalam hal ini, kode panggilan harus menangkap pengecualian. Dalam kedua kasus, kode harus memiliki beberapa cara pelaporan kepada pemanggil bahwa itu tidak mengharapkan strPrefix yang tidak dapat dikonversi ke integer. Dengan cara ini kode gagal dengan cepat dan bank dapat dengan cepat menemukan masalah tanpa rasa malu denda SEC.