Как запускать параллельно тесты, создающие товар из разных интерфейсов, и какие нюансы учесть?
Что проверяют
Понимаете ли вы, что главная проблема параллельного запуска не в настройке раннера, а в общих данных и общем состоянии системы. Следом обычно спрашивают, как вы убираете созданные товары и что будет, если два теста одновременно создадут товар с одним артикулом.
Как отвечать
Начните с изоляции данных:
- уникальные данные: имя и артикул генерируются с суффиксом из UUID или номера воркера, никаких общих «Тестовый товар 1». Проверяйте свой товар по его id, а не «в каталоге стало на один больше»;
- предусловия через API: даже UI-тест создаёт категорию, продавца и склад запросами к API, а через интерфейс проходит только проверяемый сценарий;
- отдельные учётки: у каждого воркера свой пользователь, иначе тесты выбивают сессии друг друга и упираются в лимиты;
- уборка: товар удаляется в teardown через API, а данные упавших тестов несут метку для периодической чистки.
Товар, созданный через UI, проверяют через API и наоборот. Поиск и витрина часто обновляются асинхронно через индекс или очередь, поэтому ждут опросом с таймаутом (Awaitility, expect.poll в Playwright), а не sleep.
Инструменты по стеку:
- JUnit 5:
junit.jupiter.execution.parallel.enabled=trueвjunit-platform.properties,@Execution(CONCURRENT)и@ResourceLockдля тестов с общим ресурсом; - TestNG:
parallel="methods"иthread-countвtestng.xml; - pytest и Playwright:
pytest-xdistс-n auto, воркеры Playwright и шардирование по агентам CI.
WebDriver держат на поток в ThreadLocal, без статических полей с состоянием.
Предложите и осознанный тест гонки: одновременное создание товара с одним артикулом из UI и API. Ожидаемо один запрос успешен, второй получает конфликт, дубля в базе нет.
Где спотыкаются
Считают, что достаточно включить thread-count. Тесты начинают падать случайно, и параллельность выключают обратно, не разобравшись с данными.
Пишут проверки на глобальное состояние: число товаров, первая строка списка, последний созданный. В параллели они недетерминированы.
Лечат нестабильность через Thread.sleep и перезапуск упавших тестов. Это прячет и гонки в тестах, и реальные баги синхронизации в продукте.