Параллелизация, шардирование и повторные попытки в Playwright
В этой главе рассматриваются стратегия параллельного выполнения Playwright, шардирование и механизм повторных попыток при сбоях, которые помогают эффективно запускать крупномасштабные наборы тестов.
Параллельное выполнение
По умолчанию Playwright использует несколько Worker-процессов для параллельного выполнения тестов, полностью задействуя многоядерные CPU.
Конфигурация fullyParallel
fullyParallelУправляет тем, выполняются ли тесты в одном файле параллельно.
Пример
export default defineConfig({
fullyParallel: true, // Тесты в одном файле также выполняются параллельно
});
КогдаfullyParallel: falseКогда ..., тесты в одном файле выполняются последовательно, а тесты в разных файлах — параллельно.
КогдаfullyParallel: trueКогда ..., все тесты выполняются полностью параллельно (включая тесты в одном файле).
Управление количеством Worker-процессов
Пример
// Использовать 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.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
Пример
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 }}
Механизм повторных попыток
Повторные попытки позволяют упавшим тестам автоматически запускаться снова, снижая влияние случайных нестабильных факторов.
Настройка повторных попыток
Пример
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 только при повторных попытках |
| Не злоупотребляйте повторными попытками | Повторные попытки не должны скрывать реальные ошибки. Если тест часто падает и проходит только после повторных попыток, вам следует устранить первопричину. |