Какую стратегию обработки исключений вы применяете в автотестах?

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

Ответ

Стратегия строится на принципах надежности, информативности отчетов и сохранения контекста сбоя.

Ключевые практики:

  1. Явная обработка ожидаемых исключений: Использую try-catch для ошибок, которые являются частью сценария (например, проверка сообщения об ошибке при неверных данных).
  2. Сквозное логирование: Все исключения логируются с максимальным контекстом (шаг теста, входные данные, состояние системы).
  3. Гранулярные проверки (Assertions): Использую утверждения из фреймворка (JUnit/TestNG, pytest) для четкого указания на причину падения.
  4. Завершающие действия (Teardown): Критическую очистку ресурсов (закрытие браузера, соединения с БД) помещаю в блок finally или аннотации фреймворка (@AfterEach, @AfterMethod).
  5. Retry для неустойчивых операций: Для нестабильных сетевых вызовов или условий гонки применяю механизмы повторных попыток.

Пример структуры на Java (TestNG):

@Test
public void testUnstableApiCall() {
    WebDriver driver = new ChromeDriver();
    int maxRetries = 3;
    int attempt = 0;
    boolean testPassed = false;

    while (attempt < maxRetries && !testPassed) {
        try {
            driver.get("https://unstable-service.example.com");
            WebElement data = driver.findElement(By.id("dynamic-data"));
            // Явная проверка с информативным сообщением
            Assert.assertEquals(data.getText(), "Expected Value",
                "Текст на элементе не соответствует ожидаемому");
            testPassed = true;
        } catch (StaleElementReferenceException | TimeoutException e) {
            attempt++;
            log.warn("Attempt " + attempt + " failed. Retrying...", e);
            if (attempt == maxRetries) {
                // При последней неудаче — провалить тест и приложить скриншот
                captureScreenshot(driver, "testUnstableApiCall_final_failure");
                Assert.fail("Test failed after " + maxRetries + " retries: " + e.getMessage());
            }
        } finally {
            // Очистка выполнится в любом случае
            driver.quit();
        }
    }
}

Итог: Такой подход минимизирует ложно-положительные срабатывания из-за временных проблем и обеспечивает детальные отчеты для отладки.