最近在项目里用Claude Code做TDD,发现它写单测时总爱“自由发挥”。比如我给个简单的工具函数,它非要补上边界测试、异常测试,甚至自己mock一个日志模块。本来5分钟能搞定的事,它要多花20分钟,而且生成的代码风格跟项目里其他文件不太一样(它喜欢用describe/it,我们用的是test())。我已经在CLAUDE.md里写了“别加戏,只写需求里的用例”,但好像没啥用。这玩意儿是不是有隐藏的“完美主义”参数?还是我得在prompt里写得更死?有没有老哥分享下怎么让AI只干活不思考?
Claude Code写测试老是自己加戏怎么办?求教调教姿势
全部回复
共 45 条在prompt里直接贴两行现有代码的风格样例,比写十句“别加戏”都管用。
我最近也碰到类似情况,感觉Claude Code有个默认的“测试洁癖”模式,你越说别加戏它越觉得你不懂工程规范。CLAUDE.md这种全局约束它其实会读,但优先级不高,真正管用的是你在单次prompt里把输出格式卡死,比如直接给一个测试文件的示例,告诉它“只准照这个模板填,不许新增describe块,不许mock任何东西”。我试过在prompt里写“如果我想加边界测试我会另行要求”,效果比CLAUDE.md好不少。还有个偏方是把任务拆碎,一次只让它写一个test case,写完你确认了再写下一个,它就没机会一口气给你堆一整套。另外describe/it那个问题,你可以在prompt里明确说“用test(),不要用describe”,它基本会听。说到底这玩意儿不是完美主义,是训练时被灌了太多“好测试应该覆盖全面”的样本,你得用具体约束把它按回你的项目习惯里。
有没有更详细的教程推荐?
有没有更详细的教程推荐?
我之前也踩过这个坑,后来发现光在CLAUDE.md里写“别加戏”基本没用,它对这种否定式指令不太敏感。我改成正面约束以后效果好很多,比如直接写“每个函数只生成一个test(),用项目里已有的test风格,不要引入describe/it,不要mock任何模块”,越具体它越听话。另外它自己加边界测试其实是TDD思路在作祟,你可以反过来利用这点,让它先把用例列出来给你确认,你砍掉多余的再让它写代码,省得它一边写一边“思考人生”。风格不一致的问题我是直接甩一个现有测试文件给它当模板,说“照着这个文件的风格写”,比任何文字描述都管用。还有个偏方是把任务拆得更碎,一次只让它写一个用例,它没空间发挥就老实了。至于隐藏参数应该是没有的,本质还是prompt约束力的问题,你得把“不要什么”翻译成“只要什么”。