«1. Введение

В этом руководстве мы рассмотрим различия между сбоем и ошибкой в ​​тестах JUnit.

Короче говоря, сбои — это невыполненные утверждения, в то время как ошибки возникают из-за ненормального выполнения теста.

2. Пример кода

Давайте рассмотрим очень упрощенный пример, а именно класс калькулятора, который имеет один метод для деления двух значений типа double:

public static double divideNumbers(double dividend, double divisor) {  
    if (divisor == 0) { 
        throw new ArithmeticException("Division by zero!"); 
    } 
    return dividend / divisor; 
}

Обратите внимание, что Java на самом деле не генерирует ArithmeticException сам по себе. для двойного деления — возвращает Infinity или NaN.

3. Пример сбоя

При написании модульных тестов с помощью JUnit могут возникнуть ситуации, когда тесты не пройдут. Одна из возможностей состоит в том, что наш код не соответствует критериям тестирования. Это означает, что один или несколько тестовых случаев терпят неудачу из-за того, что утверждения не выполняются.

В следующем примере утверждение не будет выполнено, потому что результат деления равен 2, а не 15. Наше утверждение и фактический результат просто не совпадают:

@Test
void whenDivideNumbers_thenExpectWrongResult() {
    double result = SimpleCalculator.divideNumbers(6, 3);
    assertEquals(15, result);
}

4. Ошибка примера

Другая возможность заключается в том, что у нас возникла непредвиденная ситуация во время выполнения теста, скорее всего, из-за исключения; например, доступ к нулевой ссылке вызовет исключение RuntimeException.

Давайте рассмотрим пример, в котором тест прервется с ошибкой, потому что мы пытаемся разделить на ноль, от чего мы явно защищаемся, вызывая исключение в коде нашего калькулятора:

@Test
void whenDivideByZero_thenThrowsException(){
    SimpleCalculator.divideNumbers(10, 0);
}

Теперь мы можем исправить этот тест, просто включив исключение в качестве одного из наших утверждений.

@Test
void whenDivideByZero_thenAssertException(){
    assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0));
}

Затем, если выброшено исключение, тест проходит, но если нет, то это будет еще один сбой.

5. Заключение

И сбой, и ошибка в тестах JUnit указывают на нежелательную ситуацию, но их семантика различна. Сбои уведомляют о недопустимом результате теста, ошибки указывают на неожиданное выполнение теста.

Кроме того, ознакомьтесь с примером кода на GitHub.