«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.