用 Claude 测 Claude:一种"用魔法打败魔法"的测试思路

11 阅读3分钟

用 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 件事:

  1. 计划只读一次 → 检查 session 里 Read 调用次数
  2. Subagent 被派遣 → 检查 Task 调用 ≥2 次
  3. TodoWrite 跟踪 → 检查有 TodoWrite 调用
  4. Spec Review 优先 → 检查调用顺序
  5. 自我审查 → 检查 subagent 输出里有没有 self-review 关键词
  6. 产出正确 → 文件存在 + npm test 通过 最后一条最狠:真的运行 npm test ,看测试过不过。

埋陷阱的艺术

计划里可以故意埋个坑:

## Task 2: Multiply 函数
**要求**:只做乘法,不要加其他功能

如果实施者偷懒,加了个除法函数,spec 审查者应该发现并标记。

测试脚本会检查产出的代码有没有计划外的东西。这里不是 FAIL,是 WARN——因为它在测试 审查者的眼力 。

为什么这个思路可行

传统测试的问题 这个方案怎么解决 无法测试"行为" 直接分析 session 文件 Claude 说得比做的好听 让它做真的,看产出 Prompt 玄学 有数据支撑的验证 改 skill 心里没底 跑一遍集成测试就知道

一点局限

  • 集成测试跑一次要 10-30 分钟
  • 依赖 Claude Code CLI 本地安装
  • Session 文件路径是 macOS 的,不同系统可能不一样 但这些都是可以接受的代价。

总结

与其问 Claude "你懂了没",不如给它一个任务,让它做,然后查它的作业。

Session 文件就是它的作业记录。分析它,就能验证 skill 有没有被正确执行。

用魔法打败魔法。