Lấy ví dụ của bạn (với một chút tái cấu trúc),
assert(a + b, math.add(a, b));
không giúp:
- hiểu cách
math.add
cư xử trong nội bộ,
- biết những gì sẽ xảy ra với các trường hợp cạnh.
Đó là khá nhiều như nói:
- Nếu bạn muốn biết phương thức này làm gì, hãy tự mình đi xem hàng trăm dòng mã nguồn (bởi vì, vâng,
math.add
có thể chứa hàng trăm LỘC; xem bên dưới).
- Tôi không bận tâm để biết liệu phương pháp này hoạt động chính xác. Sẽ ổn nếu cả giá trị mong đợi và giá trị thực tế khác với những gì tôi thực sự mong đợi .
Điều này cũng có nghĩa là bạn không phải thêm các bài kiểm tra như:
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
Họ không giúp đỡ, hoặc ít nhất, một khi bạn đưa ra khẳng định đầu tiên, điều thứ hai không mang lại điều gì hữu ích.
Thay vào đó, những gì về:
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.");
Điều này là tự giải thích và rất hữu ích cho cả bạn và cho người sẽ duy trì mã nguồn sau này. Hãy tưởng tượng rằng người này thực hiện một sửa đổi nhỏ math.add
để đơn giản hóa mã và tối ưu hóa hiệu suất và xem kết quả thử nghiệm như sau:
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
người này sẽ hiểu ngay rằng phương thức mới được sửa đổi phụ thuộc vào thứ tự của các đối số: nếu đối số thứ nhất là một số nguyên và đối số thứ hai là một số dài, kết quả sẽ là một số nguyên, trong khi một số dài được mong đợi.
Theo cách tương tự, việc đạt được giá trị thực tế 4.141592
ở lần xác nhận đầu tiên là tự giải thích: bạn biết rằng phương pháp này được dự kiến sẽ xử lý với độ chính xác lớn , nhưng thực tế, nó đã thất bại.
Vì lý do rất giống nhau, hai xác nhận sau đây có thể có ý nghĩa trong một số ngôn ngữ:
// 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));
Ngoài ra, những gì về:
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
Tự giải thích quá: bạn muốn phương pháp của bạn có thể giải quyết chính xác với vô hạn. Vượt quá vô hạn hoặc ném một ngoại lệ không phải là một hành vi dự kiến.
Hoặc có thể, tùy thuộc vào ngôn ngữ của bạn, điều này sẽ có ý nghĩa hơn?
/**
* 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?
Không ai thực sự biết :)