跳到主要内容

分片

简介

默认情况下,Playwright 在并行模式下运行测试文件,并力求最大程度地利用您机器上的 CPU 核心。为了实现更高的并行化,您可以进一步扩展 Playwright 测试执行,在多台机器上同时运行测试。我们将这种操作模式称为“分片”。Playwright 中的分片意味着将您的测试拆分成更小的部分,称为“shard(分片)”。每个分片就像一个可以独立运行的单独作业。整个目的是划分您的测试以加速测试运行时间。

当您对测试进行分片时,每个分片都可以独立运行,从而利用可用的 CPU 核心。 这有助于通过同时执行任务来加速测试过程。

在 CI 管道中,每个分片都可以作为单独的作业运行,从而利用 CI 管道中可用的硬件资源(如 CPU 核心)来更快地运行测试。

在多台机器之间分片测试

要对测试套件进行分片,请将 --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。 否则,您可能需要手动组织测试文件以避免不平衡。

合并来自多个分片的报告

在前面的示例中,每个测试分片都有自己的测试报告。 如果您想要一个合并报告,显示来自所有分片的所有测试结果,则可以合并它们。

首先,在 CI 上运行时,将 blob 报告器添加到配置中

playwright.config.ts
export default defineConfig({
testDir: './tests',
reporter: process.env.CI ? 'blob' : 'html',
});

Blob 报告包含有关运行的所有测试及其结果的信息,以及所有测试附件,例如 traces 和屏幕截图差异。 Blob 报告可以合并并转换为任何其他 Playwright 报告。 默认情况下,blob 报告将生成到 blob-report 目录中。

要合并来自多个分片的报告,请将 blob 报告文件放入单个目录中,例如 all-blob-reports。 Blob 报告名称包含分片编号,因此它们不会冲突。

之后,运行 npx playwright merge-reports 命令

npx playwright merge-reports --reporter html ./all-blob-reports

这将在 playwright-report 目录中生成标准 HTML 报告。

GitHub Actions 示例

GitHub Actions 支持使用 在多个作业之间分片测试,通过使用 jobs.<job_id>.strategy.matrix 选项。 matrix 选项将为提供的选项的每种可能组合运行一个单独的作业。

以下示例展示了如何配置一个作业,以便在四台机器上并行运行测试,然后将报告合并为一个报告。 不要忘记将 reporter: process.env.CI ? 'blob' : 'html', 添加到您的 playwright.config.ts 文件中,如上面的示例所示。

  1. 首先,我们在作业配置中添加一个 matrix 选项,其中 shardTotal: [4] 选项包含我们要创建的分片总数,而 shardIndex: [1, 2, 3, 4] 包含分片编号的数组。
  2. 然后,我们使用 --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} 选项运行 Playwright 测试。 这将为每个分片运行我们的测试命令。
  3. 最后,我们将 blob 报告上传到 GitHub Actions Artifacts。 这将使 blob 报告可用于工作流程中的其他作业。
.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:
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
  1. 在所有分片完成后,您可以运行一个单独的作业,该作业将合并报告并生成合并的 HTML 报告。 为了确保执行顺序,我们通过添加 needs: [playwright-tests] 使 merge-reports 作业依赖于我们的分片 playwright-tests 作业。
.github/workflows/playwright.yml
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 Artifacts 选项卡中可用。

image

Merge-reports 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.ts
    export default {
    testDir: 'e2e',
    reporter: [['html', { open: 'never' }]],
    };