Есть ли состояния гонок в тестах из-за многопоточности?
Что проверяют
Понимаете ли вы, откуда берутся нестабильные тесты, и отличаете ли гонку в самих тестах от гонки в продукте. Следом обычно спрашивают, что вы делаете с флаки-тестом, который падает раз в двадцать прогонов.
Как отвечать
Ответ «да, бывают», и дальше три источника:
- параллельный запуск тестов: JUnit 5 с
junit.jupiter.execution.parallel.enabled=true, TestNG сparallel="methods", pytest-xdist, воркеры Playwright. Тесты начинают делить общее: статическийWebDriver, одного тестового пользователя, одни записи в базе, файлы и порты; - асинхронность интерфейса и бэкенда: тест проверяет элемент раньше, чем пришли данные, или читает запись до того, как её обработала очередь;
- настоящая гонка в продукте: два одновременных запроса дважды применяют промокод или бронируют одно место.
Первое лечится изоляцией. У каждого теста свои данные с уникальными идентификаторами, ThreadLocal<WebDriver> в Selenium, отдельный браузерный контекст на тест (Playwright так делает по умолчанию). Если ресурс общий по природе, в JUnit 5 тест помечают @ResourceLock или запускают класс в одном потоке через @Execution(ExecutionMode.SAME_THREAD).
Второе: вместо Thread.sleep явное ожидание условия. В Selenium это WebDriverWait с ExpectedConditions, в Playwright встроенное автоожидание и expect(locator).toBeVisible(), для асинхронного бэкенда библиотека Awaitility.
Третье ловят специально: запускают N одновременных запросов с общим стартом (барьер CountDownLatch, сценарий в k6 или JMeter) и проверяют инвариант, например остаток на счёте.
Чтобы воспроизвести плавающее падение, гоняйте тест в цикле: @RepeatedTest, --repeat-each в Playwright, плагин pytest-repeat.
Где спотыкаются
Лечат флаки-тест ретраями или увеличением таймаута. Падение исчезает из отчёта, а причина остаётся, и иногда это реальная гонка в продукте.
Предлагают «добавить синхронизацию в тест». Если гонка в коде приложения, тест должен её обнаружить и упасть, а не спрятать.
Отвечают только теорией про мьютексы и семафоры. От QA ждут практики: как изолировать данные, как ждать, как воспроизвести.