Параллельное тестирование
Последовательный запуск тестов становится узким местом, когда суит разрастается до тысяч случаев: час на прогон — это слишком долго для получения обратной связи на каждый PR. Параллельное тестирование решает проблему, запуская несколько тестов или их наборов одновременно на разных воркерах или машинах, сокращая общее время линейно числу воркеров.
Определение
Параллельное тестирование (Parallel Testing) — одновременный запуск нескольких тестов или наборов тестов в независимых процессах или потоках с целью сокращения общего времени прогона.
Не путать с параллельным тестированием как методом (запуск новой и старой системы параллельно для сравнения результатов — это отдельная практика).
Стратегии параллелизации
По файлу (file-level parallelism)
Каждый воркер запускает отдельный файл тестов. Самый простой и распространённый подход — именно так работает Playwright по умолчанию. Минимальная сложность настройки, хорошо работает когда файлы примерно одинакового размера.
По тесту (test-level parallelism)
Каждый тест запускается в отдельном воркере независимо. Подходит когда внутри файла есть медленные тесты. Требует более строгой изоляции состояния.
По окружению (environment matrix)
Один и тот же набор тестов запускается параллельно в разных конфигурациях: разные браузеры, ОС, версии Node.js. В GitHub Actions реализуется через strategy.matrix.
Sharding (разбивка suite на части)
Suite разбивается на N статических частей, каждая запускается на отдельном CI-воркере. Уменьшает clock time пропорционально числу shards. При 4 shards — ~4× ускорение.
Нативный sharding в фреймворках
Большинство современных фреймворков поддерживают sharding без дополнительных зависимостей:
Playwright
npx playwright test --shard=2/4
Любая
Vitest
vitest run --shard=2/4
Любая
Jest
jest --shard=2/4
v28+
pytest
pytest --splits 4 --group 2
pytest-split плагин
Пример GitHub Actions matrix для Playwright:
Динамическое распределение тестов
Статический sharding делит тесты поровну по числу. Динамическое распределение — более умный подход: тесты распределяются по воркерам с учётом исторического времени выполнения, чтобы воркеры завершали работу одновременно.
Currents.dev — платформа оркестрации для Playwright и Cypress с динамическим балансированием.
Sorry Cypress — open-source альтернатива для Cypress.
Проблемы параллельного запуска
Shared state (общее состояние)
Тесты, изменяющие общие тестовые данные (один пользователь, одна запись в БД), конфликтуют при параллельном запуске. Решение: каждый тест создаёт собственные данные или использует уникальные идентификаторы.
Race conditions
Параллельные записи в одну таблицу БД могут вызвать конфликты уникальности или нарушение порядка операций. Решение: изолировать БД на уровне схемы или транзакции.
Изоляция базы данных
Подходы к изоляции при параллельных тестах:
Отдельная БД на воркер — каждый воркер поднимает свою БД через Testcontainers
Транзакционный rollback — тест оборачивает операции в транзакцию, откатывает после
Шаблонная БД — быстрое создание копии из шаблона (PostgreSQL
CREATE DATABASE ... TEMPLATE)Tenant-изоляция — каждый воркер работает в своём namespace/schema
Конфликты портов
Если тесты поднимают локальный сервер, каждый воркер должен получить свой порт. В Playwright это решается автоматически через webServer конфигурацию с reuseExistingServer: false.
Cloud execution
Для крупных суитов или cross-browser параллелизма используют облачные платформы:
BrowserStack Automate
20 000+ реальных устройств и браузеров
LambdaTest
Выгодная цена, HyperExecute для параллелизации
Sauce Labs
Enterprise compliance, SOC2/ISO 27001
GitHub Actions
До 20 параллельных воркеров на план
Отчётность при sharding
При разбивке на shards каждый воркер создаёт свой отчёт. Для получения единого HTML-отчёта Playwright предоставляет команду merge:
Источники
Дополнительные материалы
Parallel testing: get feedback earlier, release faster — практические советы по переходу на параллельный запуск
Ускоряем прохождение iOS UI-тестов. Параллелизация — кейс на iOS с конкретными цифрами ускорения
Last updated