예를 들어 (리팩터링으로)
assert(a + b, math.add(a, b));
도움이되지 않습니다 :
math.add
내부적으로 어떻게 행동하는지 이해 하고
- 엣지 케이스에서 어떤 일이 일어날 지 알아
다음과 같이 말합니다.
- 메소드의 기능을 알고 싶다면 수백 줄의 소스 코드를 직접보십시오 (예, 수백 개의 LOC를 포함
math.add
할 수 있기 때문에 아래 참조).
- 방법이 올바르게 작동하는지 알고 싶지 않습니다. 예상 값과 실제 값이 실제로 예상 한 값과 다를 경우 괜찮습니다 .
또한 다음과 같은 테스트를 추가 할 필요가 없습니다.
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
그들은 일단 당신이 첫 번째 주장을 한 후에도 도움이되지 않습니다.
대신 다음은 어떻습니까?
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.");
이것은 자명하며 나중에 소스 코드를 유지할 사람에게 도움이됩니다. 이 사람이 math.add
코드를 단순화하고 성능을 최적화하기 위해 코드를 약간 수정하고 다음 과 같은 테스트 결과를 봅니다.
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
이 사람은 새로 수정 된 방법이 인수의 순서에 따라 다르다는 것을 즉시 이해할 것입니다. 첫 번째 인수가 정수이고 두 번째 인수가 긴 숫자 인 경우 결과는 정수가되고 긴 숫자는 예상됩니다.
같은 방식으로, 4.141592
첫 번째 주장에서 실제 가치를 얻는 것은 자명하다 : 당신은 그 방법이 큰 정밀도를 다룰 것으로 예상 되지만 실제로는 실패 한다는 것을 알고있다 .
같은 이유로 일부 언어에서는 다음 두 가지 주장이 의미가 있습니다.
// 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));
또한, 어떻습니까 :
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
자체 설명도 : 메소드가 무한대를 올바르게 처리 할 수 있기를 원합니다. 가는 무한 넘어 하거나 예외를 던지는 것은 예상되는 동작하지 않습니다.
아니면 언어에 따라 더 의미가 있습니까?
/**
* 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?
아무도 정말로 모른다 :)