Boilerplate for running WordPress performance tests with Playwright
GPL-2.0 License
Example repository demonstrating how to set up performance testing in a WordPress project.
Read the introduction blog post to learn more about this setup.
In short, running npm run wp-env start
and npm run test:performance
is all that's needed for performance testing.
After running tests, you will get a nicely formatted output such as this:
Performance Test Results
Frontend Tests
wpLoadAlloptionsQuery | wpDbQueries | wpMemoryUsage | wpBeforeTemplate | wpTemplate | wpTotal | largestContentfulPaint | timeToFirstByte | lcpMinusTtfb |
---|---|---|---|---|---|---|---|---|
0.96 ms | 26 | 3.75 MB | 26.70 ms | 12.89 ms | 41.36 ms | 125.95 ms | 48.55 ms | 76.55 ms |
By default, performance tests are run in sequence in order to not skew results with multiple simultaneous requests.
However, on Continuous Integration platforms like GitHub Actions it might be desired to run them in parallel on multiple machines. In Playwright, this mode of operation is called sharding.
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:
npm run test:performance -- --shard=1/4
npm run test:performance -- --shard=2/4
npm run test:performance -- --shard=3/4
npm run test:performance -- --shard=4/4
In this example, each test shard has its own test report. To have a combined report showing all the test results from all the shards, you can merge them.
npm run test:performance -- --shard=1/4 --reporter=blob
npm run test:performance -- --shard=2/4 --reporter=blob
npm run test:performance -- --shard=3/4 --reporter=blob
npm run test:performance -- --shard=4/4 --reporter=blob
npm run test:performance:merge-results
The blob reporter is the special glue that collects all test information in a special format so that they can be later merged.
npm run test:performance:merge-results
then reads all blob reports and merges them into a single report.
GitHub Actions supports sharding tests between multiple jobs using the jobs.<job_id>.strategy.matrix
option.
The matrix option will run a separate job for every possible combination of the provided options.
# .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: Start WordPres
run: npm run wp-env start
- 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
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 single performance report
run: npm run test:performance:merge-reports
- name: Upload performance report
uses: actions/upload-artifact@v3
with:
name: performance-report-${{ github.run_attempt }}
path: artifacts/performance-results.json
retention-days: 14
You can now see the reports have been merged and a combined performance report is available in the GitHub Actions Artifacts tab.