最近在项目里用Claude Code做TDD,发现它写单测时总爱“自由发挥”。比如我给个简单的工具函数,它非要补上边界测试、异常测试,甚至自己mock一个日志模块。本来5分钟能搞定的事,它要多花20分钟,而且生成的代码风格跟项目里其他文件不太一样(它喜欢用describe/it,我们用的是test())。我已经在CLAUDE.md里写了“别加戏,只写需求里的用例”,但好像没啥用。这玩意儿是不是有隐藏的“完美主义”参数?还是我得在prompt里写得更死?有没有老哥分享下怎么让AI只干活不思考?
Claude Code写测试老是自己加戏怎么办?求教调教姿势
全部回复
共 25 条哈哈我也遇到过,这货确实有股子“代码洁癖”的劲儿。后来我直接在CLAUDE.md里写明“严格遵循现有test风格,仅添加需求内用例”,再配上一条“禁止引入新依赖或mock未提及模块”的规则,效果立竿见影。不过最狠的一招是,把它的输出丢进CI里跑覆盖率检查,超标的case直接fail,它自己就收敛了。
试试在CLAUDE.md里直接锁死测试框架模板,再配上“只允许修改指定文件”的规则,能省不少事。
试过在CLAUDE.md里直接写“禁止添加需求外的测试代码,只允许覆盖给定输入输出”这种带禁止性的描述,比“别加戏”管用很多,但偶尔还是会抽风。建议你用项目里现成的测试文件当few-shot示例丢给它,让它照着格式抄,比写规则好用。另外它那个describe/it的习惯,多半是训练数据里带过来的,你可以在CLAUDE.md里放一段你们项目的test()风格代码,强制它模仿。
试试在CLAUDE.md里直接写“只允许使用test(),禁止describe/it和额外用例”,它其实很吃这套硬性规则。
这题我熟,之前也被折磨过。后来发现光在CLAUDE.md写“别加戏”没用,得给它立具体规矩,比如“test()命名,只覆盖给定输入,不mock未提及模块”,最好直接扔一个项目里的现有测试文件当few-shot样例,它学得很快。另外试试在命令里加个--strict模式或者把需求拆成单条指令,别给它留自由发挥的空间,我这么调完以后基本指哪打哪了。
这问题太真实了,Claude Code好像默认觉得多写点就是加分项。我试过在CLAUDE.md里加“严格遵循现有测试风格,只写用户明确要求的用例”,效果比单纯说“别加戏”好点,但偶尔还是会犯轴。后来我直接改成每次prompt结尾加一句“如果发现额外测试需求,先列出来等我确认”,它就老实多了,你可以试试。
这题我熟,之前也被折腾得够呛。后来发现光写“别加戏”没用,得把“只写需求里的用例”改成“严格按以下步骤执行,禁止新增任何未明确要求的测试场景”,基本能压住。不过describe/it这个是真没辙,它默认就是这套风格,我后来直接在CLAUDE.md里放了个项目现有测试文件的示例,让它照着抄格式,效果比文字描述好很多。
试试在CLAUDE.md里加个“只写test()风格,禁止describe/it,禁止补用例”的负面清单,比正面要求管用多了。
试试在CLAUDE.md里加上“严格遵循现有测试风格,禁止新增用例类型”,或者直接给它一个现有测试文件当模板。
这玩意儿就是欠调教,你得在prompt里明确“只写我指定的用例,多写一个就重来”,不然它总想证明自己懂测试。
这题我熟,之前也被搞到没脾气。后来发现光靠CLAUDE.md不够,得在命令里直接绑死上下文,比如加上“只补全现有文件里的test(),不新增describe/it,不写需求外的用例”,它会老实很多。另外它那个“完美主义”其实是训练数据里的倾向,你可以试试用--max-turns限制对话轮数,逼它在有限步数内只干正事。不过说实话,有时候它加戏反而能揪出边界bug,看你要效率还是要稳了。
试试在命令里直接加--style参数指定test()格式,另外把“只写一个用例”写进当次prompt比全局配置管用。
同感,这货对“边界”的理解比产品经理还执着,你试试给它限定“只覆盖happy path,其他不用管”。
我试过在CLAUDE.md里加“只写最小可用测试”,结果它照样给你整一堆参数化用例,后来我直接在每个prompt后面补一句“沿用现有测试文件风格,只覆盖主路径”,效果会好点,但偶尔还是会抽风。感觉它系统提示里那层“全面覆盖”的偏好比项目指令优先级高,不如试着把现有测试文件丢给它当few-shot示例,比写规则管用。
换个思路,把边界测试直接写进需求里当验收标准,它就不会自己加了,风格问题用eslint兜底就行。
试试在CLAUDE.md里直接写死“禁止describe/it,只用test(),不写额外用例”,比“别加戏”管用。
试试在CLAUDE.md里加一句“禁止describe/it,只用项目现有风格”,再配上具体例子,比笼统说“别加戏”管用。
给它一个你项目里现成的测试文件当模板,明确说“照着这个写”,约束力比啥prompt都强。
试试在命令里直接怼参数,比如“只写test()格式,用例数不许超仨”,比CLAUDE.md好使。
试试在CLAUDE.md里直接规定“禁止describe/it,禁止补充用例”,再配上项目现有测试文件当few-shot,它就会老实多了。
我试过把“只写需求里的用例”改成“严格复制现有测试风格,不得新增任何测试场景”,效果立竿见影,你可以把这条加进prompt顶层。
这问题太真实了,Claude Code的“过度设计”确实像个默认开启的隐藏buff。我试过在CLAUDE.md里写“严格遵循现有测试风格”,结果它照样给你整出个嵌套describe,气得我直接把项目里的测试框架配置丢进prompt里当上下文,效果比文字描述强点。不过我发现它更吃“负面约束”,比如明确写“禁止添加未要求的测试场景,禁止mock未引用的模块”,比单纯说“别加戏”管用得多。还有个野路子,你给它一个极简的测试模板文件,让它照葫芦画瓢,比让它理解“风格”这俩字靠谱。但说到底,这玩意儿就是在“理解指令”和“追求代码完备性”之间找不到平衡,你越是强调“只干活”,它越觉得你在考验它的专业素养,索性把能想到的边界全给你覆盖了,属于用力过猛型选手。
这题我熟,之前也被整得没脾气。后来我把CLAUDE.md里那条改成了“严格按现有测试文件风格补全,禁止新增测试场景”,然后每次跑测试前加一句“只写缺失断言,其他别碰”,效果好多了。你那个describe/it的问题,直接给它贴一段项目里的测试样例当few-shot,比写规则管用。
这题我熟,之前也被Claude Code的“责任心”搞到头疼。后来发现光写“别加戏”没用,得在CLAUDE.md里直接给负面清单加例子,比如“不需要补边界和异常用例,除非函数签名有throws或参数校验”。另外它喜欢describe/it,大概率是训练数据里这套风格占比太高,你可以在项目根目录放个最小jest配置或者直接贴一段现有测试代码当few-shot,它就会照着抄了。其实它多写那20分钟不算白费,但如果你追求效率,不如在prompt里加一句“只增加覆盖当前变更的最小测试,禁止重构和额外断言”,会老实很多。