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 .