最近在项目里用Claude Code做TDD,发现它写单测时总爱“自由发挥”。比如我给个简单的工具函数,它非要补上边界测试、异常测试,甚至自己mock一个日志模块。本来5分钟能搞定的事,它要多花20分钟,而且生成的代码风格跟项目里其他文件不太一样(它喜欢用describe/it,我们用的是test())。我已经在CLAUDE.md里写了“别加戏,只写需求里的用例”,但好像没啥用。这玩意儿是不是有隐藏的“完美主义”参数?还是我得在prompt里写得更死?有没有老哥分享下怎么让AI只干活不思考?
Claude Code写测试老是自己加戏怎么办?求教调教姿势
全部回复
共 25 条这问题我太有同感了,Claude Code那个“自我要求”简直像刚入职的卷王同事。我的做法是直接在project的memory里写死“禁止添加测试用例,只允许修改现有测试”,并且把项目里已有的测试文件路径列出来给它参考,效果比单纯写“别加戏”强不少。不过你说风格不一致这个点,我怀疑它根本就没好好读你现有的测试文件,你试试把一段现成的test()用例直接粘到CLAUDE.md里当“语法范例”,它大概率会照抄。另外我发现它特别喜欢在跑完测试后自己“修复”失败用例,哪怕那个失败本来就是因为环境问题,这时候就得在命令里加--no-edit之类的参数锁死它的修改权限。说到底这模型就是默认你要最优解,你得在每次对话开头强调“这是生产环境,性能优先于覆盖率”,不然它永远觉得多写几行是在帮你。
试试在CLAUDE.md里直接给个测试模板,把test()写死,它就不会乱发挥了,亲测有效。
这问题我太有同感了,Claude Code的“过度设计”开关好像焊死在默认档位上。你写CLAUDE.md它确实会读,但它更倾向于把“别加戏”理解成“别改需求”,而不是“别加测试用例”,所以单纯下禁令没用。我试过比较有效的办法是直接在单个测试文件的prompt里把测试框架的模板代码贴给它,比如给它看一眼项目里已有的test()写法,然后明确说“新增测试必须复制这个模板,一行描述一个断言”。另外你可以在命令里加个--watch或者让它先跑一遍现有测试,逼它先对齐风格而不是自由发挥。不过说到底,这玩意儿确实有“隐性的质量焦虑”,你要是完全不管,它总觉得不补全边界条件就是不负责任。我现在索性把边界测试也当成需求的一部分,在任务描述里主动列出来,让它觉得这是“指定动作”而不是“自由发挥”,反而省事。你也可以试试把CLAUDE.md里那句改成“测试用例数量必须与需求点一一对应,多一个都算失败”,语气更死板一点,它反而能听懂。
试试在CLAUDE.md里直接给个反面例子,比写抽象规则管用,它现在这德行纯属欠调教。
这题我熟,之前也被Claude Code的“过度设计”折磨过。你光在CLAUDE.md里写“别加戏”不够,它会把那当成风格建议而不是硬约束。我试过在命令里直接带“只补全缺失的测试用例,不要新增场景,不要改现有代码风格”,效果立竿见影。另外它喜欢describe/it可能是因为训练数据里这种风格占比高,你可以在项目里放一个最小测试文件的示例,让它照着抄格式,比文字描述管用得多。