Как обрабатывать исключения в тестовом коде?

«Как обрабатывать исключения в тестовом коде?» — вопрос из категории Основы тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В тестировании исключения обрабатываются для проверки корректности работы приложения в ошибочных сценариях и для обеспечения устойчивости самих тестов.

Основные подходы:

  1. Обработка исключений в тестах для проверки негативных сценариев:

    // JUnit 5 / TestNG пример: проверка, что метод выбрасывает ожидаемое исключение
    @Test
    void divisionByZero_ShouldThrowArithmeticException() {
        Calculator calculator = new Calculator();
        assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
    }
  2. Обработка исключений для предотвращения падения теста из-за нестабильности (например, в UI-тестах):

    // Пример с try-catch для graceful degradation
    @Test
    void testElementInteraction() {
        try {
            WebElement button = driver.findElement(By.id("unstable-button"));
            button.click();
        } catch (NoSuchElementException e) {
            // Логируем проблему, но не падаем, если элемент временно отсутствует
            log.warn("Элемент не найден, возможно, страница не до конца загрузилась: " + e.getMessage());
            // Возможно, предпринять альтернативное действие или пометить тест как skipped
        }
    }
  3. Использование механизмов фреймворка (например, правила в JUnit 4 или ExpectedException):

    // JUnit 4 Rule (устаревший, но встречается в legacy-коде)
    @Rule
    public ExpectedException exceptionRule = ExpectedException.none();
    
    @Test
    public void testExpectedException() {
        exceptionRule.expect(IllegalArgumentException.class);
        exceptionRule.expectMessage("Invalid input");
        someMethod("invalid");
    }

Почему это важно:

  • Проверка требований: Убедиться, что приложение корректно сообщает об ошибках.
  • Устойчивость тестов: Тесты не должны падать из-за временных проблем (например, таймаут сети).
  • Качество отчетов: Четкое различие между падением из-за бага в приложении и проблемой в тестовом окружении.