Tomando o seu exemplo (com um pouco de refatoração),
assert(a + b, math.add(a, b));
não ajuda a:
- entender como
math.addse comporta internamente,
- saiba o que acontecerá com casos extremos.
É como dizer:
- Se você quiser saber o que o método faz, consulte as centenas de linhas de código-fonte (porque, sim,
math.add pode conter centenas de LOC; veja abaixo).
- Não me preocupo em saber se o método funciona corretamente. Tudo bem se os valores esperados e reais forem diferentes do que eu realmente esperava .
Isso também significa que você não precisa adicionar testes como:
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
Eles também não ajudam, ou pelo menos, uma vez que você fez a primeira afirmação, a segunda não traz nada útil.
Em vez disso, o que dizer de:
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.");
Isso é auto-explicativo e muito útil para você e para a pessoa que manterá o código-fonte posteriormente. Imagine que essa pessoa faça uma ligeira modificação no math.addpara simplificar o código e otimizar o desempenho e veja o resultado do teste como:
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
essa pessoa entenderá imediatamente que o método recém-modificado depende da ordem dos argumentos: se o primeiro argumento for um número inteiro e o segundo for um numérico longo, o resultado seria um inteiro, enquanto um numérico longo é esperado.
Da mesma forma, obter o valor real de 4.141592na primeira asserção é auto-explicativo: você sabe que o método deve lidar com uma grande precisão , mas, na verdade, falha.
Pela mesma razão, duas afirmações a seguir podem fazer sentido em alguns idiomas:
// 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));
Além disso, o que dizer de:
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
Também é auto-explicativo: você deseja que seu método seja capaz de lidar corretamente com o infinito. Ir além do infinito ou lançar uma exceção não é um comportamento esperado.
Ou talvez, dependendo do seu idioma, isso faça mais sentido?
/**
* 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?Ninguém realmente sabe :) #