Skip to main content
failproofai 包含两套测试套件:单元测试(快速、模拟)和端到端测试(真实子进程调用)。

运行测试


单元测试

单元测试位于 __tests__/ 目录,使用 Vitestjsdom

编写策略单元测试


端到端测试

E2E 测试将真实的 failproofai 二进制文件作为子进程调用,向 stdin 传入 JSON 载荷,并对 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 流程(bun run lint && bunx tsc --noEmit && bun run test:run && bun run build)。E2E 套件作为独立的 CI 任务并行运行。 完整的合并前检查清单请参见 Contributing