githubEdit

Параллельное тестирование

Последовательный запуск тестов становится узким местом, когда суит разрастается до тысяч случаев: час на прогон — это слишком долго для получения обратной связи на каждый 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:

Источники

Дополнительные материалы

Last updated