Шардинг
Введение
По умолчанию, Playwright запускает тестовые файлы в параллельном режиме и стремится к оптимальному использованию ядер процессора на вашем компьютере. Для достижения еще большей параллелизации вы можете масштабировать выполнение тестов Playwright, запуская тесты на нескольких машинах одновременно. Мы называем этот режим работы "шардингом". Шардинг в Playwright означает разделение ваших тестов на более мелкие части, называемые "шардами". Каждый шард подобен отдельной задаче, которая может выполняться независимо. Основная цель - разделить ваши тесты, чтобы ускорить время их выполнения.
Когда вы делите тесты на шарды, каждый шард может выполняться самостоятельно, используя доступные ядра процессора. Это помогает ускорить процесс тестирования, выполняя задачи одновременно.
В конвейере CI каждый шард может выполняться как отдельная задача, используя аппаратные ресурсы, доступные в вашем конвейере CI, такие как ядра процессора, для более быстрого выполнения тестов.
Шардинг тестов между несколькими машинами
Чтобы разделить тестовый набор на шарды, передайте --shard=x/y
в командной строке. Например, чтобы разделить набор на четыре шарда, каждый из которых выполняет одну четверть тестов:
npx playwright test --shard=1/4
npx playwright test --shard=2/4
npx playwright test --shard=3/4
npx playwright test --shard=4/4
Теперь, если вы запустите эти шарды параллельно в разных задачах, ваш тестовый набор завершится в четыре раза быстрее.
Обратите внимание, что Playwright может разделять только те тесты, которые могут выполняться параллельно. По умолчанию это означает, что Playwright будет делить тестовые файлы. Узнайте о других вариантах в руководстве по параллелизму.
Балансировка шардов
Шардинг может выполняться на двух уровнях детализации в зависимости от того, используете ли вы опцию testProject.fullyParallel или нет. Это влияет на то, как тесты распределяются по шардам.
Шардинг с fullyParallel
Когда fullyParallel: true
включен, Playwright Test запускает отдельные тесты параллельно на нескольких шардах, обеспечивая равномерное распределение тестов по каждому шарду. Это позволяет достичь уровня детализации на уровне тестов, что означает, что каждый шард будет пытаться сбалансировать количество выполняемых тестов. Это предпочтительный режим для обеспечения равномерного распределения нагрузки при шардинге, так как Playwright может оптимизировать выполнение шардов на основе общего количества тестов.
Шардинг без fullyParallel
Без настройки fullyParallel, Playwright Test по умолчанию использует уровень детализации на уровне файлов, что означает, что целые тестовые файлы назначаются шардам (обратите внимание, что один и тот же файл может быть назначен разным шардам в разных проектах). В этом случае количество тестов в файле может значительно повлиять на распределение шардов. Если ваши тестовые файлы неравномерно распределены (т.е. некоторые файлы содержат намного больше тестов, чем другие), определенные шарды могут выполнять значительно больше тестов, в то время как другие могут выполнять меньше или даже ни одного.
Основные выводы:
- С
fullyParallel: true
: Тесты разделяются на уровне отдельных тестов, что приводит к более сбалансированному выполнению шардов. - Без
fullyParallel
: Тесты разделяются на уровне файлов, поэтому для балансировки шардов важно, чтобы ваши тестовые файлы были небольшими и равномерно распределенными. - Чтобы обеспечить наиболее эффективное использование шардинга, особенно в средах CI, рекомендуется использовать
fullyParallel: true
при стремлении к сбалансированному распределению по шардам. В противном случае вам может потребоваться вручную организовать ваши тестовые файлы, чтобы избежать дисбаланса.
Объединение отчетов из нескольких шардов
В предыдущем примере каждый тестовый шард имеет свой собственный отчет о тестировании. Если вы хотите получить объединенный отчет, показывающий все результаты тестов из всех шардов, вы можете их объединить.
Начните с добавления blob
репортера в конфигурацию при запуске на CI:
export default defineConfig({
testDir: './tests',
reporter: process.env.CI ? 'blob' : 'html',
});
Blob-отчет содержит информацию обо всех выполненных тестах и их результатах, а также все вложения тестов, такие как трассировки и различия в скриншотах. Blob-отчеты можно объединять и преобразовывать в любой другой отчет Playwright. По умолчанию blob-отчет будет сгенерирован в директорию blob-report
.
Чтобы объединить отчеты из нескольких шардов, поместите файлы blob-отчетов в одну директорию, например all-blob-reports
. Имена blob-отчетов содержат номер шарда, поэтому они не будут конфликтовать.
После этого выполните команду npx playwright merge-reports
:
npx playwright merge-reports --reporter html ./all-blob-reports
Это создаст стандартный HTML-отчет в директории playwright-report
.
Пример для GitHub Actions
GitHub Actions поддерживает шардинг тестов между несколькими задачами с использованием опции jobs.<job_id>.strategy.matrix
. Опция matrix
запускает отдельную задачу для каждой возможной комбинации предоставленных опций.
Следующий пример показывает, как настроить задачу для выполнения ваших тестов на четырех машинах параллельно, а затем объединить отчеты в один. Не забудьте добавить reporter: process.env.CI ? 'blob' : 'html',
в ваш файл playwright.config.ts
, как в примере выше.
- Сначала мы добавляем опцию
matrix
в конфигурацию нашей задачи с опциейshardTotal: [4]
, содержащей общее количество шардов, которые мы хотим создать, иshardIndex: [1, 2, 3, 4]
с массивом номеров шардов. - Затем мы запускаем наши тесты Playwright с опцией
--shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
. Это запустит нашу команду тестирования для каждого шарда. - Наконец, мы загружаем наш blob-отчет в артефакты GitHub Actions. Это сделает blob-отчет доступным для других задач в рабочем процессе.
name: Playwright Tests
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
jobs:
playwright-tests:
timeout-minutes: 60
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
- name: Upload blob report to GitHub Actions Artifacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: blob-report-${{ matrix.shardIndex }}
path: blob-report
retention-days: 1
- После завершения всех шардов вы можете запустить отдельную задачу, которая объединит отчеты и создаст объединенный HTML-отчет. Чтобы обеспечить порядок выполнения, мы делаем задачу
merge-reports
зависимой от нашей шардинговой задачиplaywright-tests
, добавляяneeds: [playwright-tests]
.
jobs:
...
merge-reports:
# Merge reports after playwright-tests, even if some shards have failed
if: ${{ !cancelled() }}
needs: [playwright-tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v4
with:
path: all-blob-reports
pattern: blob-report-*
merge-multiple: true
- name: Merge into HTML Report
run: npx playwright merge-reports --reporter html ./all-blob-reports
- name: Upload HTML report
uses: actions/upload-artifact@v4
with:
name: html-report--attempt-${{ github.run_attempt }}
path: playwright-report
retention-days: 14
Теперь вы можете увидеть, что отчеты были объединены, и объединенный HTML-отчет доступен на вкладке артефактов GitHub Actions.
CLI для объединения отчетов
npx playwright merge-reports path/to/blob-reports-dir
читает все blob-отчеты из переданной директории и объединяет их в один отчет.
При объединении отчетов с разных ОС вам потребуется предоставить явную конфигурацию объединения, чтобы уточнить, какая директория должна использоваться в качестве корня тестов.
Поддерживаемые опции:
-
--reporter reporter-to-use
Какой отчет создавать. Может быть несколько репортеров, разделенных запятой.
Пример:
npx playwright merge-reports --reporter=html,github ./blob-reports
-
--config path/to/config/file
Указывает файл конфигурации Playwright с выходными репортерами. Используйте эту опцию для передачи дополнительной конфигурации выходному репортеру. Этот файл конфигурации может отличаться от того, который использовался при создании blob-отчетов.
Пример:
npx playwright merge-reports --config=merge.config.ts ./blob-reports
merge.config.tsexport default {
testDir: 'e2e',
reporter: [['html', { open: 'never' }]],
};