Flaky-тесты — это нестабильные автотесты, которые иногда проходят успешно, а иногда падают без изменения кода. Они мешают CI/CD и снижают доверие к автоматизации.
Причины: задержки, нестабильные данные, асинхронность, внешние сервисы.
Как бороться:
Пример:
UI-тест на кнопку “Оплатить” иногда падает из-за того, что страница не успевает прогрузиться.
Решение — добавить waitForElement() или стабилизировать API-ответ.
Flaky (от англ. flaky — “ломкий”, “ненадёжный”) тест — это автоматизированный тест, который даёт разные результаты при одинаковых условиях:
то проходит,
то падает,
хотя код системы и теста не менялся.
Такие тесты создают “шум” в отчётах, затрудняют анализ CI и снижают доверие к автотестам.
def test_payment_success(api_client):
response = api_client.post("/payment", data={"sum": 100})
assert response.status_code == 200
Иногда падает с ошибкой 504 Gateway Timeout.
Почему? → сервис оплаты отвечает дольше из-за задержки сети.
Тест “флаки”, потому что ошибка не в логике, а во внешнем факторе.
Категория: Асинхронность / тайминги
Пример: Элемент UI не успел отрисоваться
Решение: Добавить явные ожидания (wait, retry)
Категория: Нестабильные данные
Пример: Тест использует общие данные в БД
Решение: Изолировать или создавать данные заново
Категория: Зависимость от окружения
Пример: API-тест зависит от стороннего сервиса
Решение: Использовать mock / stub
Категория: Параллельное выполнение
Пример: Несколько тестов меняют одни данные
Решение: Изолировать тестовые данные
Категория: Порядок выполнения тестов
Пример: Один тест влияет на другой
Решение: Делать независимыми (stateless)
Категория: Нагрузка на CI
Пример: Тест падает при нехватке ресурсов
Решение: Настроить стабильные агенты и окружение
Категория: Недетерминированный код
Пример: Рандом, кэш, время
Решение: Фиксировать seed, стабилизировать clock()
Изоляция тестов
Каждый тест должен работать независимо.
Создавать / удалять данные внутри теста.
Использовать фикстуры и teardown.
Контроль времени и ожиданий
Добавить явные ожидания (waitForElement, assertEventually).
Задать максимальные таймауты и polling-интервалы.
Избегать “жёстких sleep()” — они не гарантируют стабильность.
Использовать mock / stub
Подменить внешние API и сервисы тестовыми версиями.
Пример: вместо реального /payment — mock-сервис, возвращающий стабильный ответ.
Перезапуск flaky-тестов
Настроить auto-rerun при падении (в Jenkins, TestOps).
Если тест падает 1 раз из 5 — пометить его как flaky и вынести из основного набора.
Мониторинг стабильности
Вести статистику успешности каждого теста (% pass rate).
Автоматически детектить flaky по истории запусков (например, Allure TestOps, Jenkins Flaky Plugin).
Рефакторинг теста или системы
Проверить: может, проблема не в тесте, а в коде приложения (медленные API, race condition).
Признак: Ошибка “Element not found”.
Обнаружено: UI-тест на Chrome падает иногда
Решение: Добавлен waitForElement()
Признак: Ошибка 504.
Обнаружено: API зависает при нагрузке
Решение: Подменили сервис mock-ответом
Признак: Нестабильный результат при параллельных тестах.
Обнаружено: Данные общие для всех
Решение: Сделали уникальные user_id
После фиксов стабильность выросла с 80% → 98%.
Завести метрику “Flakiness rate” (% нестабильных тестов).
Порог допуска: <5% flaky = OK, >10% = сигнал тревоги.
Регулярно анализировать отчёты.
Выносить flaky-тесты в карантин до исправления.
Allure TestOps → умеет:
автоматически определять flaky по истории;
помечать нестабильные тесты;
считать стабильность по проектам.
Jenkins Flaky Test Handler → перезапускает только упавшие тесты.
Flaky-тесты — это нестабильные тесты, которые падают без причины. Они появляются из-за асинхронности, зависимостей и нестабильных данных.
Чтобы с ними бороться:
Делай тесты изолированными и детерминированными,
Используй ожидания и mock-и,
Анализируй статистику стабильности,
Автоматизируй rerun и контроль качества.
Чтобы пожаловаться или сообщить об ошибке, войдите в аккаунт или зарегистрируйтесь.