Mengambil contoh Anda (dengan sedikit refactoring),
assert(a + b, math.add(a, b));
tidak membantu untuk:
- memahami bagaimana
math.add
berperilaku secara internal,
- tahu apa yang akan terjadi dengan kasus tepi.
Ini seperti mengatakan:
- Jika Anda ingin tahu apa metode ini, buka dan lihat sendiri ratusan baris kode sumber (karena, ya,
math.add
dapat berisi ratusan LOC; lihat di bawah).
- Saya tidak ingin tahu apakah metode ini bekerja dengan benar. Tidak apa-apa jika nilai yang diharapkan dan aktual berbeda dari apa yang saya harapkan .
Ini juga berarti Anda tidak perlu menambahkan tes seperti:
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
Mereka tidak membantu, atau setidaknya, begitu Anda membuat pernyataan pertama, yang kedua tidak membawa apa-apa yang berguna.
Sebaliknya, bagaimana dengan:
const numeric Pi = 3.1415926535897932384626433832795;
const numeric Expected = 4.1415926535897932384626433832795;
assert(Expected, math.add(Pi, 1),
"Adding an integer to a long numeric doesn't give a long numeric result.");
assert(Expected, math.add(1, Pi),
"Adding a long numeric to an integer doesn't give a long numeric result.");
Ini cukup jelas dan sangat membantu bagi Anda dan orang yang akan menjaga kode sumber nanti. Bayangkan orang ini melakukan sedikit modifikasi pada math.add
untuk menyederhanakan kode dan mengoptimalkan kinerja, dan melihat hasil tes seperti:
Test TestNumeric() failed on assertion 2, line 5: Adding a long numeric to an
integer doesn't give a long numeric result.
Expected value: 4.1415926535897932384626433832795
Actual value: 4
orang ini akan segera memahami bahwa metode yang baru dimodifikasi tergantung pada urutan argumen: jika argumen pertama adalah bilangan bulat dan yang kedua adalah angka yang panjang, hasilnya akan berupa bilangan bulat, sedangkan angka yang panjang diharapkan.
Dengan cara yang sama, memperoleh nilai aktual 4.141592
pada pernyataan pertama cukup jelas: Anda tahu bahwa metode ini diharapkan dapat menangani presisi besar , tetapi sebenarnya gagal.
Untuk alasan yang sama, dua pernyataan berikut dapat masuk akal dalam beberapa bahasa:
// We don't expect a concatenation. `math` library is not intended for this.
assert(0, math.add("Hello", "World"));
// We expect the method to convert every string as if it was a decimal.
assert(5, math.add("0x2F", 5));
Juga, bagaimana dengan:
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
Cukup jelas juga: Anda ingin metode Anda dapat menangani infinity dengan benar. Melampaui batas tanpa batas atau melempar pengecualian bukanlah perilaku yang diharapkan.
Atau mungkin, tergantung pada bahasa Anda, ini akan lebih masuk akal?
/**
* Ensures that when adding numbers which exceed the maximum value, the method
* fails with OverflowException, instead of restarting at numeric.Minimum + 1.
*/
TestOverflow()
{
UnitTest.ExpectException(ofType(OverflowException));
numeric result = math.add(numeric.Maximum, 1));
UnitTest.Fail("The tested code succeeded, while an OverflowException was
expected.");
}
How does unit testing work?
Tidak ada satu yang benar-benar tahu :)