mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
170 lines
6.3 KiB
Markdown
170 lines
6.3 KiB
Markdown
---
|
|
id: test-sharding
|
|
title: "Sharding"
|
|
---
|
|
|
|
By default, Playwright runs tests in [parallel](/test-parallel.md) and strives for optimal utilization of CPU cores on your machine. In order to achieve even greater parallelisation, you can further scale Playwright test execution by running tests on multiple machines simultaneously. We call this mode of operation "sharding".
|
|
|
|
## Sharding tests between multiple machines
|
|
|
|
To shard the test suite, pass `--shard=x/y` to the command line. For example, to split the suite into four shards, each running one fourth of the tests:
|
|
|
|
```bash
|
|
npx playwright test --shard=1/4
|
|
npx playwright test --shard=2/4
|
|
npx playwright test --shard=3/4
|
|
npx playwright test --shard=4/4
|
|
```
|
|
|
|
Now, if you run these shards in parallel on different computers, your test suite completes four times faster.
|
|
|
|
## Merging reports from multiple shards
|
|
|
|
In the previous example, each test shard has its own test report. If you want to have a combined report showing all the test results from all the shards, you can merge them.
|
|
|
|
Start with adding `blob` reporter to the config when running on CI:
|
|
|
|
```ts title="playwright.config.ts"
|
|
export default defineConfig({
|
|
testDir: './tests',
|
|
reporter: process.env.CI ? 'blob' : 'html',
|
|
});
|
|
```
|
|
|
|
Blob report contains information about all the tests that were run and their results as well as all test attachments such as traces and screenshot diffs. Blob reports can be merged and converted to any other Playwright report. By default, blob report will be generated into `blob-report` directory.
|
|
|
|
To merge reports from multiple shards, put the blob report files into a single directory, for example `all-blob-reports`. Blob report names contain shard number, so they will not clash.
|
|
|
|
Afterwards, run `npx playwright merge-reports` command:
|
|
|
|
```bash
|
|
npx playwright merge-reports --reporter html ./all-blob-reports
|
|
```
|
|
|
|
This will produce a standard HTML report into `playwright-report` directory.
|
|
|
|
## GitHub Actions example
|
|
|
|
GitHub Actions supports [sharding tests between multiple jobs](https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs) using the [`jobs.<job_id>.strategy.matrix`](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) option. The `matrix` option will run a separate job for every possible combination of the provided options.
|
|
|
|
The following example shows you how to configure a job to run your tests on four machines in parallel and then merge the reports into a single report. Don't for get to add `reporter: process.env.CI ? 'blob' : 'html',` to your `playwright.config.ts` file as in the example above.
|
|
|
|
1. First we add a `matrix` option to our job configuration with the `shard` option containing the number of shards we want to create. `shard: [1/4, 2/4, 3/4, 4/4]` will create four shards, each with a different shard number.
|
|
|
|
1. Then we run our Playwright tests with the `--shard ${{ matrix.shard }}` option. This will our test command for each shard.
|
|
|
|
1. Finally we upload our blob report to the GitHub Actions Artifacts. This will make the blob report available to other jobs in the workflow.
|
|
|
|
|
|
|
|
```yaml title=".github/workflows/playwright.yml"
|
|
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:
|
|
shard: [1/4, 2/4, 3/4, 4/4]
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18
|
|
- 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.shard }}
|
|
|
|
- name: Upload blob report to GitHub Actions Artifacts
|
|
if: always()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: all-blob-reports
|
|
path: blob-report
|
|
retention-days: 1
|
|
```
|
|
|
|
1. After all shards have completed, you can run a separate job that will merge the reports and produce a combined [HTML report](./test-reporters.md#html-reporter). To ensure the execution order, we make the `merge-reports` job [depend](https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow#defining-prerequisite-jobs) on our sharded `playwright-tests` job by adding `needs: [playwright-tests]`.
|
|
|
|
```yaml title=".github/workflows/playwright.yml"
|
|
jobs:
|
|
...
|
|
merge-reports:
|
|
# Merge reports after playwright-tests, even if some shards have failed
|
|
if: always()
|
|
needs: [playwright-tests]
|
|
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18
|
|
- name: Install dependencies
|
|
run: npm ci
|
|
|
|
- name: Download blob reports from GitHub Actions Artifacts
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: all-blob-reports
|
|
path: all-blob-reports
|
|
|
|
- name: Merge into HTML Report
|
|
run: npx playwright merge-reports --reporter html ./all-blob-reports
|
|
|
|
- name: Upload HTML report
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: html-report--attempt-${{ github.run_attempt }}
|
|
path: playwright-report
|
|
retention-days: 14
|
|
```
|
|
|
|
You can now see the reports have been merged and a combined HTML report is available in the GitHub Actions Artifacts tab.
|
|
|
|
<img width="875" alt="image" src="https://github.com/microsoft/playwright/assets/9798949/b69dac59-fc19-4b98-8f49-814b1c29ca02" />
|
|
|
|
|
|
## Merge-reports CLI
|
|
|
|
`npx playwright merge-reports path/to/blob-reports-dir` reads all blob reports from the passed directory and merges them into a single report.
|
|
|
|
Supported options:
|
|
- `--reporter reporter-to-use`
|
|
|
|
Which report to produce. Can be multiple reporters separated by comma.
|
|
|
|
Example:
|
|
|
|
```bash
|
|
npx playwright merge-reports --reporter=html,github ./blob-reports
|
|
```
|
|
|
|
- `--config path/to/config/file`
|
|
|
|
Specifies the Playwright configuration file with output reporters. Use this option to pass
|
|
additional configuration to the output reporter. This configuration file can differ from
|
|
the one used during the creation of blob reports.
|
|
|
|
Example:
|
|
|
|
```bash
|
|
npx playwright merge-reports --config=merge.config.ts ./blob-reports
|
|
```
|
|
|
|
```ts title="merge.config.ts"
|
|
export default {
|
|
reporter: [['html', { open: 'never' }]],
|
|
};
|
|
```
|