用 Claude 测 Claude:一种"用魔法打败魔法"的测试思路
缘起
写 skill 的时候遇到一个问题: 怎么知道 Claude 真的听你的话了?
传统的测试不管用。你没法 unit test 一个 prompt。你只能:
- 跑一次,问它"你理解了吗"
- 期望它回答"我理解了"
- 然后祈祷它真的照做 这太蠢了。
换个思路
与其问 Claude "你懂了没",不如给它一个真实任务,让它做,然后检查它有没有按 skill 说的做。
这就是这套测试框架的核心思想。
两种测试,各有分工
快速单元测试:问它理解了啥
问:你知道 subagent-driven-development 这个 skill 吗?
期望答:知道,它包含 Load Plan、Spec Review、Code Review...
用正则匹配它的回答,看看关键概念都在。
优点 :快,2 分钟跑完 缺点 :只验证"理解",不验证"做"
集成测试:让它真刀真枪干一次
1. 创建一个 Node.js 项目
2. 写一个实现计划(故意埋个坑)
3. 让 Claude 执行这个计划
4. 检查它的行为和产出
具体怎么检查?靠 Claude 自己的"黑匣子"——session 记录。
核心技术:Session 文件
每次 Claude 运行完,会生成一个 .jsonl 文件,记录完整的对话历史:
{"type":"assistant","message":{"toolCalls":[{"name":"Task",...}]}}
{"type":"user","toolUseResult":{"agentId":"task-xxx","usage":{...}}}
从这里面能看到:
- 用了哪些工具(Task、Write、Read、TodoWrite...)
- 调用顺序是什么
- 每个 subagent 用了多少 token 测试脚本就是靠分析这个文件来验证行为。
举个例子
测试 subagent-driven-development 这个 skill,要验证 6 件事:
- 计划只读一次 → 检查 session 里 Read 调用次数
- Subagent 被派遣 → 检查 Task 调用 ≥2 次
- TodoWrite 跟踪 → 检查有 TodoWrite 调用
- Spec Review 优先 → 检查调用顺序
- 自我审查 → 检查 subagent 输出里有没有 self-review 关键词
- 产出正确 → 文件存在 + npm test 通过 最后一条最狠:真的运行 npm test ,看测试过不过。
埋陷阱的艺术
计划里可以故意埋个坑:
## Task 2: Multiply 函数
**要求**:只做乘法,不要加其他功能
如果实施者偷懒,加了个除法函数,spec 审查者应该发现并标记。
测试脚本会检查产出的代码有没有计划外的东西。这里不是 FAIL,是 WARN——因为它在测试 审查者的眼力 。
为什么这个思路可行
传统测试的问题 这个方案怎么解决 无法测试"行为" 直接分析 session 文件 Claude 说得比做的好听 让它做真的,看产出 Prompt 玄学 有数据支撑的验证 改 skill 心里没底 跑一遍集成测试就知道
一点局限
- 集成测试跑一次要 10-30 分钟
- 依赖 Claude Code CLI 本地安装
- Session 文件路径是 macOS 的,不同系统可能不一样 但这些都是可以接受的代价。
总结
与其问 Claude "你懂了没",不如给它一个任务,让它做,然后查它的作业。
Session 文件就是它的作业记录。分析它,就能验证 skill 有没有被正确执行。
用魔法打败魔法。