Dalam pengujian unit saya, saya sering melemparkan nilai arbitrer ke kode saya untuk melihat apa fungsinya. Misalnya, jika saya tahu foo(1, 2, 3)
seharusnya mengembalikan 17, saya dapat menulis ini:
assertEqual(foo(1, 2, 3), 17)
Angka-angka ini murni arbitrer dan tidak memiliki makna yang lebih luas (mereka tidak, misalnya, syarat batas, meskipun saya juga mengujinya). Saya akan berjuang untuk menghasilkan nama-nama bagus untuk angka-angka ini, dan menulis sesuatu seperti const int TWO = 2;
ini jelas tidak membantu. Apakah boleh menulis tes seperti ini, atau haruskah saya memasukkan angka ke dalam konstanta?
Dalam Apakah semua angka ajaib dibuat sama? , kami belajar bahwa angka ajaib baik-baik saja jika artinya jelas dari konteks, tetapi dalam kasus ini angka-angka itu sebenarnya tidak memiliki arti sama sekali.
const int TWO = 2;
bahkan lebih buruk daripada hanya menggunakan 2
. Itu sesuai dengan kata-kata aturan dengan niat untuk melanggar semangatnya.
foo
, itu tidak akan berarti apa-apa, dan begitu pula parameternya. Namun dalam kenyataannya, saya cukup yakin fungsi tidak memiliki nama itu, dan parameter tidak memiliki nama bar1
, bar2
dan bar3
. Buat contoh yang lebih realistis di mana nama memiliki makna, maka jauh lebih masuk akal untuk membahas jika nilai data uji juga membutuhkan nama.
1, 2, 3
adalah indeks array 3D di mana Anda sebelumnya menyimpan nilai17
, maka saya pikir tes ini akan bagus (selama Anda memiliki beberapa tes negatif juga). Tetapi jika itu adalah hasil perhitungan, Anda harus memastikan bahwa siapa pun yang membaca tes ini akan mengerti mengapafoo(1, 2, 3)
harus demikian17
, dan angka ajaib mungkin tidak akan mencapai tujuan itu.