Что такое Flaky-тест?

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

Ответ

Flaky-тест — это нестабильный автоматизированный тест, который может проходить или падать при одних и тех же условиях (исходный код, данные, окружение). Его результаты непредсказуемы, что подрывает доверие к тестовой пачке.

Основные причины нестабильности:

  • Проблемы с синхронизацией: Тест не дожидается завершения асинхронных операций (загрузка страницы, ответ API, появление элемента в UI).
  • Зависимость от внешних сервисов: Недоступность или нестабильная работа сторонних API, баз данных, сетевых ресурсов.
  • Неизолированное состояние: Тесты влияют друг на друга из-за разделяемых данных, кеша или отсутствия очистки окружения перед запуском.
  • Случайные данные: Использование недетерминированных значений (например, текущее время) без моков.

Пример проблемного UI-теста (Python + Selenium):

def test_login_button_is_displayed():
    driver.get("https://example.com/login")
    # Потенциально flaky: элемент может ещё не успеть отрендериться
    login_button = driver.find_element(By.ID, "login-btn")
    assert login_button.is_displayed()  # Может упасть с NoSuchElementException или AssertionError

Стратегии борьбы с Flaky-тестами:

  1. Явные ожидания: Использовать WebDriverWait в UI-тестах или поллинги для API.
  2. Изоляция и идемпотентность: Каждый тест должен запускаться на чистом состоянии. Использовать setup/teardown методы для подготовки данных и очистки.
  3. Моки и стабы: Заменять нестабильные внешние зависимости на контролируемые заглушки.
  4. Повторные запуски (Retry): Настройка автоматического перезапуска упавших тестов в CI/CD (как временная мера).
  5. Детектирование и карантин: Регулярный анализ падений и вынос нестабильных тестов в отдельную, "карантинную" пачку, чтобы не блокировать основной pipeline.