A diferença entre falha e erro no JUnit

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.