A diferença entre falha e erro no JUnit
1. Introdução
Neste tutorial, vamos explorar as diferenças entre uma falha e um erro nos testes deJUnit.
Em suma, falhas são afirmações não cumpridas enquanto erros são causados por execução de teste anormal.
2. Código de amostra
Vamos considerar um exemplo muito simplista, ou seja, uma classe de calculadora que tem um método para dividir dois valoresdouble:
public static double divideNumbers(double dividend, double divisor) {
if (divisor == 0) {
throw new ArithmeticException("Division by zero!");
}
return dividend / divisor;
}
Observe queJava doesn’t actually throw an ArithmeticException sozinho para a divisãodouble - ele retornaInfinity ouNaN.
3. Falha de exemplo
Ao escrever testes de unidade com JUnit, provavelmente haverá situações em que os testes falharão. Uma possibilidade é queour code does not meet its test criteria. Isso significa que um ou mais casos de teste falham devido aassertions not being fulfilled.
No exemplo a seguir, a asserção falhará, porque o resultado da divisão é 2 e não 15. Nossa afirmação e o resultado real simplesmente não correspondem:
@Test
void whenDivideNumbers_thenExpectWrongResult() {
double result = SimpleCalculator.divideNumbers(6, 3);
assertEquals(15, result);
}
4. Exemplo de erro
Outra possibilidade é que temosan unexpected situation during test execution, most likely due to an exception; por exemplo, acessar uma referêncianull levantará umRuntimeException.
Vejamos um exemplo, onde o teste será abortado com um erro porque estamos tentando dividir por zero, contra o qual explicitamente nos protegemos lançando uma exceção em nosso código de calculadora:
@Test
void whenDivideByZero_thenThrowsException(){
SimpleCalculator.divideNumbers(10, 0);
}
Agora, poderíamos corrigir esse teste simplesmente incluindo a exceção como um de nossosassertions.
@Test
void whenDivideByZero_thenAssertException(){
assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0));
}
Então, se a exceção for lançada, o teste será aprovado, mas se não for, isso seria outra falha.
5. Conclusão
Tanto a falha quanto o erro nos testes JUnit indicam uma situação indesejada, mas sua semântica é diferente. Failures notify of an invalid test result, errors indicate an unexpected test execution.
Além disso, verifique o código de exemplo emGitHub.