close

CI

Rstest 在 CI 中使用的 CLI 与本地相同。主要区别是,CI 应该通过 rstest 以 run mode 执行测试,然后上传其他工具需要读取的报告。

基础工作流

在 CI 中使用 rstest,这样进程会在一次测试完成后退出。如果项目已经有 test 脚本,可以让 CI 继续调用该脚本,并让脚本执行 rstest

package.json
{
  "scripts": {
    "test": "rstest"
  }
}

一个最小的 GitHub Actions 工作流会安装依赖、恢复包管理器缓存,并运行测试脚本:

.github/workflows/test.yml
name: Test

on:
  push:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v4
        with:
          version: 11

      - uses: actions/setup-node@v4
        with:
          node-version: 22.12.0
          cache: pnpm

      - run: pnpm install --frozen-lockfile
      - run: pnpm test

当 Rstest 检测到 GitHub Actions 且没有手动配置 reporter 时,会自动启用 github-actions reporter。失败断言会转换成 GitHub 注释,并在 workflow summary 中追加 Markdown 摘要。更多 reporter 细节请查看 reporters

其他 CI 系统也可以使用相同命令。关键是先运行 pnpm install --frozen-lockfile,再运行 pnpm rstest 或你的 package script。

添加覆盖率

覆盖率收集默认关闭。启用 --coverage 前,需要先安装你想使用的 provider:

pnpm add @rstest/coverage-istanbul -D
pnpm rstest --coverage

如果 CI 需要保留 HTML 报告,或把覆盖率数据传给其他服务,可以上传生成的 coverage/ 目录:

- run: pnpm rstest --coverage --coverage.reportOnFailure

- uses: actions/upload-artifact@v4
  if: always()
  with:
    name: coverage
    path: coverage

当失败运行中的报告也有调试价值时,可以使用 if: always()。可用的 provider、reporter、阈值和输出路径请查看 coverage

CI 中的 browser mode

Browser Mode 会在真实浏览器中运行测试,因此 CI 需要同时安装 Rstest 浏览器包和浏览器二进制文件。在项目中安装 @rstest/browser,然后安装配置中使用的 Playwright 浏览器。

pnpm add @rstest/browser playwright -D
pnpm exec playwright install --with-deps chromium

在 CI 中,browser.headless 默认值为 true,所以浏览器会以无界面模式运行。GitHub Actions 工作流通常会在运行测试前添加浏览器安装步骤:

jobs:
  browser-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with:
          version: 11
      - uses: actions/setup-node@v4
        with:
          node-version: 22.12.0
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm exec playwright install --with-deps chromium
      - run: pnpm rstest --browser

如果使用 firefoxwebkit 测试,需要安装与 browser.browser 选择一致的浏览器。完整配置方式请查看 Browser Mode 快速开始browser 配置

使用分片拆分测试

当完整测试套件已经稳定,但单台 CI 机器运行太慢时,可以使用 --shard <index>/<count>。每个分片会运行不同的测试文件子集。要在后续合并结果和覆盖率,需要让每个分片都使用 blob reporter,上传 blob 文件,然后在后续 job 中合并。

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        shard: [1, 2, 3]
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with:
          version: 11
      - uses: actions/setup-node@v4
        with:
          node-version: 22.12.0
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm rstest --shard ${{ matrix.shard }}/3 --reporters=blob --coverage
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: rstest-blob-${{ matrix.shard }}
          path: .rstest-reports
          include-hidden-files: true

  merge-reports:
    runs-on: ubuntu-latest
    needs: test
    if: always()
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with:
          version: 11
      - uses: actions/setup-node@v4
        with:
          node-version: 22.12.0
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - uses: actions/download-artifact@v4
        with:
          pattern: rstest-blob-*
          path: .rstest-reports
          merge-multiple: true
      - run: pnpm rstest merge-reports --coverage --cleanup

每个分片会写入 .rstest-reports/blob-{index}-{count}.json。合并 job 会把这些文件收集到同一个 .rstest-reports/ 目录,然后 rstest merge-reports 会基于统一结果运行已配置的 reporter,并合并覆盖率数据。更多细节请查看 shardrstest merge-reports

发布机器可读报告

除了终端输出,CI 工具通常还需要结构化报告文件。当你需要 XML、JSON、Markdown 或 blob 输出时,可以添加 reporter:

rstest.config.ts
import { defineConfig } from '@rstest/core';

export default defineConfig({
  reporters: [
    'default',
    ['junit', { outputPath: './reports/junit.xml' }],
    ['json', { outputPath: './reports/rstest.json' }],
  ],
});

然后上传报告目录:

- run: pnpm rstest

- uses: actions/upload-artifact@v4
  if: always()
  with:
    name: rstest-reports
    path: reports

junit 适合 CI 测试结果集成,json 适合自定义工具,md 适合 Markdown 摘要,github-actions 适合 GitHub 注释,blob 适合分片报告合并。完整列表和选项请查看 reporters

缓存依赖

建议先从包管理器缓存开始,因为它安全,通常也能带来最明显的 CI 优化。在 GitHub Actions 中,actions/setup-node 配合 cache: pnpm 会基于 lockfile 恢复 pnpm store。

推荐检查清单

  • 使用 Node.js ^20.19.0>=22.12.0,以匹配 Rstest 支持的运行时范围。
  • 在 CI 中运行 rstest,可以直接运行,也可以通过 package script 运行。
  • 仅在 workflow 需要对应功能时安装 coverage 和 browser 包。
  • 如果 coverage、JUnit、JSON 或 blob artifact 有助于排查失败,使用 if: always() 上传。
  • 在单机 workflow 稳定后,再添加 sharding。
  • 保持 Browser Mode 的浏览器安装与 Rstest 配置中选择的浏览器一致。