最近在项目里用Claude Code做TDD,发现它写单测时总爱“自由发挥”。比如我给个简单的工具函数,它非要补上边界测试、异常测试,甚至自己mock一个日志模块。本来5分钟能搞定的事,它要多花20分钟,而且生成的代码风格跟项目里其他文件不太一样(它喜欢用describe/it,我们用的是test())。我已经在CLAUDE.md里写了“别加戏,只写需求里的用例”,但好像没啥用。这玩意儿是不是有隐藏的“完美主义”参数?还是我得在prompt里写得更死?有没有老哥分享下怎么让AI只干活不思考?
Claude Code写测试老是自己加戏怎么办?求教调教姿势
全部回复
共 32 条这问题我太有同感了,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可能是因为训练数据里这种风格占比高,你可以在项目里放一个最小测试文件的示例,让它照着抄格式,比文字描述管用得多。
试试在CLAUDE.md里直接给个测试模板,再写死“严格复制该风格,禁止新增用例”,比纯文字约束管用。
这情况我也遇到过,后来把单测拆成独立task,prompt里明说“只写给定输入输出”,基本就老实了。
这题我熟,之前也被折腾得够呛。后来我干脆在CLAUDE.md里直接写死了“测试风格:test()函数,禁止describe/it,禁止补用例”,然后每次在prompt末尾加一句“严格照抄现有测试文件里的格式”,基本能按住它。不过它偶尔还是会偷偷加个边界值,我现在都直接当代码review了,多出来的就手动删,反正比跟它掰扯省时间。
这问题我也踩过坑,后来发现光在CLAUDE.md里写“别加戏”没用,它还是会按训练时的习惯来。我现在的做法是直接在命令里带具体约束,比如“只写test()风格,不加边界和异常用例”,效果比全局配置强。另外你可以试试给它一个项目里现成的测试文件当参考模板,它模仿起来会老实很多。至于风格统一,建议把eslint或prettier的规则直接贴进prompt里,比口头要求管用。
这问题太真实了,我试过好多次,感觉它那个“完美主义”不是参数问题,是训练数据里大量开源项目都是全量测试,模型默认这就是“好的完成”。CLAUDE.md那条其实它读了,但更像是“参考”,不是“铁律”,你得在具体任务里把边界封死,比如直接写“只允许一个test函数,覆盖正常输入即可,禁止负例和mock”。
还有个骚操作是给它看你们项目的现有测试文件,让它照着“抄作业”,风格就能对齐。另外别让它一口气跑完,拆成“先写一个用例,停下等我确认”,它就没机会加戏了。
不过我也怀疑是不是你给的函数本身太简单,它觉得不秀一下技术体现不出价值?换个复杂点的需求它可能就专注了。反正我现在是pipeline里直接sed把describe替换成test,物理防御最省心。
我也遇到过这毛病,后来发现光在CLAUDE.md里写没用,得在每次prompt里把约束说死。我的做法是直接贴一段项目里现有的测试当模板,然后加一句“照着这个风格写,只覆盖我列出的case,别加任何额外断言或mock”。另外把describe/it这种偏好明确禁止掉,它其实挺听话的,就是默认想表现。实在不行就分两步,先让它列用例你确认,再让它写代码。
我也遇到过这毛病,后来发现光在CLAUDE.md里写没用,得在每次prompt里把约束说死。比如直接写“只用test(),不加describe,不mock任何东西,边界用例我来指定”,它才老实点。还有个偏方是给它一个项目里已有的测试文件当模板,说“照这个风格写”,比干说管用。实在不行就分两步,先让它列用例你筛一遍,再让它按筛完的写,能省不少返工。
我也遇到过这毛病,后来发现光在CLAUDE.md里说“别加戏”不够,它该加还是加。我的经验是把约束写进具体prompt里,比如“只测这个函数的输入输出,禁止mock任何外部依赖,测试框架用test()”,越具体越管用。还有个偏方是给它一个现成的测试文件当模板,说“照这个风格写”,它模仿能力挺强的,比抽象指令好使。