跳转到主要内容
failproofai 包含两套测试套件:单元测试(快速、使用 mock)和端到端测试(真实子进程调用)。

运行测试


单元测试

单元测试位于 __tests__/ 目录下,使用 Vitest 并配合 jsdom 运行。

编写策略单元测试


端到端测试

E2E 测试将真实的 failproofai 二进制文件作为子进程调用,将 JSON 载荷通过 stdin 传入,并对 stdout 输出和退出码进行断言。这覆盖了 Claude Code 使用的完整集成路径。

配置

E2E 测试直接从仓库源码运行二进制文件。在首次运行前,需要构建自定义 hook 文件在导入 'failproofai' 时所使用的 CJS 包:
然后运行测试:
每当修改公共 hook API(src/hooks/custom-hooks-registry.tssrc/hooks/policy-helpers.tssrc/hooks/policy-types.ts)时,需要重新构建 dist/

E2E 测试结构

使用 E2E 辅助工具

FixtureEnv —— 每个测试的隔离环境:
createFixtureEnv() 会自动注册 afterEach 清理逻辑。 runHook —— 调用二进制文件:
Payloads —— 预置载荷工厂函数:

编写 E2E 测试

E2E 响应结构

Vitest 配置

E2E 测试使用 vitest.config.e2e.mts,配置如下:
  • environment: "node" —— 不需要浏览器全局变量
  • pool: "forks" —— 真正的进程隔离(测试会启动子进程)
  • testTimeout: 20_000 —— 每个测试超时 20 秒(含二进制启动 + hook 求值时间)
使用 forks 池非常重要:基于线程的 worker 会共享 globalThis,可能干扰启动子进程的测试。基于进程的 forks 可避免此问题。

CI

在合并代码前,必须通过完整的 CI 流程(bun run lint && bunx tsc --noEmit && bun run test:run && bun run build)。E2E 测试套件作为独立的 CI 任务并行运行。 完整的合并前检查清单请参阅 Contributing