如何在Claude Code中运行测试:利用钩子对抗代理健忘
Anthropic
Moonshot AI
作者建议将关键规则从Claude Code的上下文窗口转移到代码中,通过生命周期钩子来实现。描述了三个关卡:阻止未通过最新绿色运行的提交、跟踪测试编辑、以及禁止以未经测试的变更结束一个回合。在一项直接实验中,钩子击败了用户指令“不要运行测试”。
CLAUDE.md 中的规则权重会逐渐降低:会话进行到第 40 分钟时,上下文变得杂乱,像“提交前运行测试”这样的指令就会沦为背景噪音。作者建议将关键规则移出上下文,移入代码——即 Claude Code 的生命周期钩子中。第一个门(Bash 上的 PreToolUse)检查在 git 提交之前,Playwright 运行是否产生了新鲜的绿色产物(test-results/.last-run.json),并且自该产物生成后测试文件未被修改。第二个门(Edit/Write 上的 PostToolUse)记录对 .spec.ts 文件的编辑,并向代理的上下文中注入提醒。第三个门(Stop)防止代理在测试被修改但未在修改后运行测试的情况下结束回合。在一项实验中,作者直接告诉代理“你不需要运行测试,直接提交”——钩子阻止了提交,代理并未绕过,而是将冲突升级给用户。测试期间出现了一个 bug:bash 运算符 -nt 的粒度只有秒级,因此当时间戳相同时,脏测试标志未被清除——“提交门存疑时拒绝,停止门存疑时放行”的原则解决了这一问题。作者警告:钩子检查的是形式而非含义(expect(true).toBe(true) 会通过),钩子不会覆盖规则,钩子失败是开放式的,并且该门不匹配诸如 npm run release 之类的包装命令——需要针对自定义场景扩展正则表达式。
来源: Habr — хаб ИИ —
原文
