close

pool

  • 类型:
export type RstestPoolType = 'forks' | 'threads';

export type RstestPoolOptions = {
  /** 用于运行测试的线程池 */
  type?: RstestPoolType;
  /** 最大运行的线程池的数量或百分比 */
  maxWorkers?: number | string;
  /** 最小运行的线程池的数量或百分比 */
  minWorkers?: number | string;
  /** 向子进程中的 node 进程传递附加参数。 */
  execArgv?: string[];
};

export type RstestConfig = {
  /** 用于运行测试的线程池 */
  pool?: RstestPoolType | RstestPoolOptions;
};
  • 默认值:
const defaultPool = {
  type: 'forks',
  // maxWorkers/minWorkers 会根据 CPU 数量和运行模式自动计算
};

用于运行测试的线程池的选项。

Pool 类型

Rstest 支持两种 pool 类型,它们共享同一套 scheduler、RPC 和结果聚合逻辑,差异仅在于 worker 的创建方式。

forks

每个测试文件运行在通过 child_process.fork 启动的独立 Node.js 子进程中。每个 worker 拥有独立的 V8 heap,因此进程级状态(process.chdir、signal handler、env 修改、native module 绑定)不会在文件之间泄漏。

threads

每个测试文件运行在通过 node:worker_threads 创建的 worker thread 中。Worker 与主进程共享 V8 heap 和 stdio。

如何选择 pool 类型

forks 是默认值,多数现有测试代码都依赖按文件维度的进程隔离。如果不确定要不要切换,建议先继续使用 forks

下列情况可以考虑切换到 threads

  • 测试以小型用例为主、单文件耗时短,worker 启动开销在总时间中占比明显 — worker_threads 启动比 child_process.fork 快约 10×,watch 模式 rerun 体感几乎秒回。
  • 并行运行时机器内存吃紧或观察到 OOM — threads 共享主进程的 V8 heap,多个 worker 不会各占一份 V8 实例。
  • 测试代码本身不修改 cwd / 环境变量 / signal handler,也不依赖按文件重置的进程级状态。

下列情况建议继续使用 forks

  • 测试里会修改 process.chdir、环境变量、signal handler 等进程级状态,并依赖按文件之间互相隔离。
  • 项目依赖按进程初始化的 native module(如 better-sqlite3sharpcanvas 等)。
  • 希望单个测试文件的硬性崩溃被限制在该 worker 内,不影响主进程和其他用例。

控制文件级并行度

pool.maxWorkers 控制同时运行的测试文件数量。当测试会竞争同一个数据库、端口、fixture 目录或其他外部资源时,可以用它限制并行度。

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

export default defineConfig({
  pool: {
    maxWorkers: 1,
  },
});

也可以通过 CLI 传入相同配置:

npx rstest --pool.maxWorkers 1

常见取值:

  • 1:让测试文件逐个运行。这等价于 Vitest 的 fileParallelism: false 和 Jest 的 --runInBand
  • 50%:根据可用 CPU 数量按比例控制并行度,适合容量共享的 CI 机器。
  • 固定数字,如 4:无论机器规模如何,都把资源占用限制在已知安全的范围内。

maxWorkers 控制的是文件级并行度。它不会限制单个测试文件内的 test.concurrent 用例;如需限制这类用例,请使用 maxConcurrency

保持 worker 预热

默认情况下,Rstest 会按需创建 worker,避免为当前运行用不到的 worker 槽付出启动成本。pool.minWorkers 控制需求下降后保留多少 idle worker。

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

export default defineConfig({
  pool: {
    maxWorkers: 4,
    minWorkers: 1,
  },
});

当 worker 启动成本较高,并且希望重复运行(尤其是 watch 模式)复用已预热的 worker 时,可以设置 minWorkers。如果更关注内存占用,建议保持较低取值。

向 worker 传递 Node.js flags

当 worker 内运行的代码需要特定 Node.js flags(例如自定义 conditions、warnings 或调试参数)时,可以使用 pool.execArgv

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

export default defineConfig({
  pool: {
    execArgv: ['--conditions=development'],
  },
});

如果要调试单个 worker,可以把 execArgvmaxWorkers: 1 组合使用,确保同一时间只有一个测试文件连接到 debugger:

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

export default defineConfig({
  pool: {
    maxWorkers: 1,
    execArgv: ['--inspect-brk'],
  },
});