Параллель, шардирование и 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.
Проверьте себя
1. Почему для параллельного запуска критична изоляция тестов?
AИначе браузер не запустится
BЗависимые друг от друга тесты ломаются, когда идут одновременно
CПараллель отключает авто-ожидания
DИзоляция нужна только в CI
2. Что такое шардирование тестов?
AЗапуск тестов в случайном порядке
BДеление набора на части, которые гоняются на разных машинах CI
CСжатие отчётов
DПерезапуск упавших тестов
3. Зачем в CI-конфиге используют upload-artifact с if: always()?
AЧтобы ускорить тесты
BЧтобы сохранить отчёт даже при падении тестов и было что разбирать
CЧтобы установить браузеры
DЧтобы отключить headless-режим
Поддержать проект