pool
- 类型:
- 默认值:
用于运行测试的线程池的选项。
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-sqlite3、sharp、canvas等)。 - 希望单个测试文件的硬性崩溃被限制在该 worker 内,不影响主进程和其他用例。
控制文件级并行度
pool.maxWorkers 控制同时运行的测试文件数量。当测试会竞争同一个数据库、端口、fixture 目录或其他外部资源时,可以用它限制并行度。
也可以通过 CLI 传入相同配置:
常见取值:
1:让测试文件逐个运行。这等价于 Vitest 的fileParallelism: false和 Jest 的--runInBand。50%:根据可用 CPU 数量按比例控制并行度,适合容量共享的 CI 机器。- 固定数字,如
4:无论机器规模如何,都把资源占用限制在已知安全的范围内。
maxWorkers 控制的是文件级并行度。它不会限制单个测试文件内的 test.concurrent 用例;如需限制这类用例,请使用 maxConcurrency。
保持 worker 预热
默认情况下,Rstest 会按需创建 worker,避免为当前运行用不到的 worker 槽付出启动成本。pool.minWorkers 控制需求下降后保留多少 idle worker。
当 worker 启动成本较高,并且希望重复运行(尤其是 watch 模式)复用已预热的 worker 时,可以设置 minWorkers。如果更关注内存占用,建议保持较低取值。
向 worker 传递 Node.js flags
当 worker 内运行的代码需要特定 Node.js flags(例如自定义 conditions、warnings 或调试参数)时,可以使用 pool.execArgv。
如果要调试单个 worker,可以把 execArgv 和 maxWorkers: 1 组合使用,确保同一时间只有一个测试文件连接到 debugger: