Перейти к основному содержимому

Разница между сбоем и ошибкой в JUnit

· 2 мин. чтения

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 .