Фрагментация
Введение
По умолчанию, 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
export default { testDir: 'e2e', reporter: [['html', { open: 'never' }]], };
© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-sharding