Параллелизация, шардирование и повторные попытки в Playwright

В этой главе рассматриваются стратегия параллельного выполнения Playwright, шардирование и механизм повторных попыток при сбоях, которые помогают эффективно запускать крупномасштабные наборы тестов.


Параллельное выполнение

По умолчанию Playwright использует несколько Worker-процессов для параллельного выполнения тестов, полностью задействуя многоядерные CPU.

Конфигурация fullyParallel

fullyParallelУправляет тем, выполняются ли тесты в одном файле параллельно.

Пример

// Путь к файлу: playwright.config.ts
export default defineConfig({
  fullyParallel: true,  // Тесты в одном файле также выполняются параллельно
});

КогдаfullyParallel: falseКогда ..., тесты в одном файле выполняются последовательно, а тесты в разных файлах — параллельно.

КогдаfullyParallel: trueКогда ..., все тесты выполняются полностью параллельно (включая тесты в одном файле).

Управление количеством Worker-процессов

Пример

export default defineConfig({
  // Использовать 4 Worker-процесса
  workers: 4,

  // Локально использовать значение по умолчанию, в CI — фиксированное значение 2
  workers: process.env.CI ? 2 : undefined,

  // Однопоточный режим (удобен для отладки)
  workers: 1,
});

Последовательные тесты

Используйтеtest.describe.serialЗаставляет тесты в одной группе выполняться последовательно.

Пример

// Последовательное выполнение — каждый тест зависит от результата предыдущего теста
test.describe.serial('Регистрация пользователя и вход', () => {
  test('Шаг 1: Регистрация', async ({ page }) => { /* ... */ });
  test('Шаг 2: Подтвердить email', async ({ page }) => { /* ... */ });
  test('Шаг 3: Вход', async ({ page }) => { /* ... */ });
});

Старайтесь избегать использования последовательных тестов, потому что они нарушают изоляцию тестов.

Если тесты должны выполняться по порядку, рассмотрите объединение нескольких шагов в один тест.

Локальное управление параллелизмом

Черезtest.describe.configureВы можете управлять параллельным режимом отдельной группы.

Пример

test.describe('Группа тестов', () => {
  test.describe.configure({ mode: 'serial' });  // Принудительно последовательный режим
  // test.describe.configure({ mode: 'parallel' }); // Принудительный параллельный режим

  test('A', async () => {});
  test('B', async () => {});
});

Шардирование

Шардинг распределяет тесты между несколькими CI-машинами, чтобы сократить общее время выполнения.

Использование

# 机器 1:运行第 1/4 片
npx playwright test --shard=1/4

# 机器 2:运行第 2/4 片
npx playwright test --shard=2/4

# 机器 3:运行第 3/4 片
npx playwright test --shard=3/4

# 机器 4:运行第 4/4 片
npx playwright test --shard=4/4

Объединение отчётов шардов

После завершения работы всех машин объедините созданные файлы отчётов.

# 每台机器生成报告(不自动打开)
npx playwright test --shard=1/4 --reporter=blob

# 合并所有 blob 报告
npx playwright merge-reports --reporter=html ./all-blob-reports

Конфигурация шардов в GitHub Actions

Пример

# Путь к файлу: .github/workflows/playwright.yml
jobs
:
  test
:
    strategy
:
      fail-fast
: false
      matrix
:
        shardIndex
: [1, 2, 3, 4]
        shardTotal
: [4]
    steps
:
      - uses
: actions/checkout@v4
      - uses
: actions/setup-node@v4
      - run
: npm ci
      - run
: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}

Механизм повторных попыток

Повторные попытки позволяют упавшим тестам автоматически запускаться снова, снижая влияние случайных нестабильных факторов.

Настройка повторных попыток

Пример

// Путь к файлу: playwright.config.ts
export default defineConfig({
  // Локально без повторов (быстрая обратная связь), в CI повторять 2 раза
  retries: process.env.CI ? 2 : 0,
});

Настройка повторов для отдельного файла или группы

Пример

// Установить повторы для всей группы
test.describe.configure({ retries: 3 });

test.describe('Нестабильная функция (требует нескольких повторных попыток)', () => {
  test('Тест A', async ({ page }) => { /* ... */ });
  test('Тест B', async ({ page }) => { /* ... */ });
});

Стратегии повторов

СтратегияОписание
Повторы в среде CIЛокально без повторов (быстрая обратная связь), в CI повторять 2-3 раза
Сбор трассировкиВ сочетании сtrace: 'on-first-retry', записывать Trace только при повторных попытках
Не злоупотребляйте повторными попыткамиПовторные попытки не должны скрывать реальные ошибки. Если тест часто падает и проходит только после повторных попыток, вам следует устранить первопричину.
Другие расширения