Параллель, шардирование и CI
Большой набор E2E может идти минуты — параллель, шардирование и CI делают это быстрым и автоматическим.
Параллелизм — одновременный запуск тестов в нескольких процессах; шардирование — деление набора на части, которые гоняются на разных машинах CI.
Параллельный запуск из коробки
Playwright по умолчанию запускает файлы тестов параллельно в нескольких воркерах (процессах). Каждый воркер — свой браузер, тесты изолированы. Чем больше ядер у машины, тем больше воркеров и тем быстрее прогон.
# задать число воркеров вручную
npx playwright test --workers=4Именно поэтому изоляция так важна (см. раздел про организацию): если тесты зависят друг от друга, параллель их сломает. С чистыми контекстами и уникальными данными параллель «бесплатно» ускоряет прогон в разы.
Параллель внутри файла
По умолчанию тесты в одном файле идут последовательно, а файлы — параллельно. Можно разрешить параллель и внутри файла, если тесты в нём независимы:
test.describe.configure({ mode: 'parallel' });Шардирование: делим между машинами
Когда тестов очень много, их делят на шарды и раздают разным машинам CI. Каждая машина гоняет свою часть, общее время падает почти линейно числу машин.
# машина 1 из 3
npx playwright test --shard=1/3
# машина 2 из 3
npx playwright test --shard=2/3
# машина 3 из 3
npx playwright test --shard=3/3Запуск в CI
В CI (например, GitHub Actions) тесты гоняют автоматически на каждый push или pull request. Браузер там невидим, поэтому работает headless-режим. Вот минимальный workflow.
name: E2E
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
# ставим браузеры в CI-окружении
- run: npx playwright install --with-deps
- run: npx playwright test
# сохраняем отчёт даже при падении
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/Ключевые моменты: npx playwright install --with-deps ставит браузеры и системные библиотеки в чистом окружении (без этого браузер просто не запустится), а upload-artifact с if: always() сохраняет отчёт, даже если тесты упали — чтобы было что разбирать.
Ретраи именно в CI
В конфиге часто включают ретраи только для CI — локально они мешают замечать нестабильность, а в CI спасают от случайных сбоев инфраструктуры.
export default defineConfig({
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
});Итог
- Playwright по умолчанию гоняет тесты параллельно в воркерах — отсюда важность изоляции.
- Шардирование делит набор между машинами CI для ещё большего ускорения.
- В CI нужен
playwright install --with-depsи headless-режим. - Отчёт сохраняют артефактом с
if: always(); ретраи часто включают только в CI.