让 AI 修 Bug 前先写失败测试:一套更可靠的 AI 编程修复流程
用 AI 修 Bug 最常见的问题是:它改了代码,解释得头头是道,但你并不确定问题是否真的解决了。更可靠的做法是:先让 AI 写一个能复现 Bug 的失败测试,确认它确实失败,再让 AI 修改代码直到测试通过,最后跑全量测试确认没有引入新问题。
为什么先写测试
- 验证理解:AI 能写出复现测试,说明它理解了问题;写不出来,往往说明问题描述还不够清楚
- 防止假修复:没有测试时,AI 可能只是绕开了症状,比如加了一个空值判断把错误吞掉
- 防止回归:这个测试会留在代码库里,以后有人改动相关代码时能及时发现
完整流程
第 1 步:描述症状,不急着要修复
现象:调用 calculate_discount 时,购物车里同时有满减券和折扣券,总价变成了负数。
复现输入:……
期望结果:……
实际结果:……
请先不要修改业务代码。阅读相关文件后,告诉我你认为可能的原因,以及你打算如何写一个测试来复现它。
先让 AI 说出思路,你可以在它动手前纠正方向。
第 2 步:写失败测试并运行
请在 tests/ 下为这个问题添加一个测试用例,测试名清楚描述场景。
写完后运行这个测试,确认它失败,并把失败输出贴给我。
如果测试意外通过了,说明复现条件不对,回到第 1 步补充信息。这一步本身就能帮你发现「问题其实在别处」。
第 3 步:最小修改让测试通过
现在修改业务代码让这个测试通过。要求:
- 只做解决该问题所需的最小改动
- 不要修改测试本身的断言
- 改完运行该测试和相关模块的全部测试
「不要修改测试断言」这一条很重要,否则 AI 可能通过放宽测试来「让它通过」。
第 4 步:审查改动
- 看 diff:改动范围是否超出预期?有没有顺手重构了不相关的代码?
- 看根因:修复是在数据产生的地方,还是只在显示前做了截断?
- 看边界:再让 AI 补充两三个边界用例,例如只有一种券、券金额等于总价
第 5 步:提交时写清楚
提交说明里写上 Bug 现象、根因和新增的测试名,方便日后排查。
什么情况下不适用
- 难以自动化测试的问题,例如纯视觉样式问题,可以改用截图对比或手动检查清单
- 生产环境偶发、无法稳定复现的问题,先补充日志收集信息,再回到这个流程
常见坑
- 让 AI 同时写测试和修代码,它可能写出一个为当前实现量身定制、并不能真正复现问题的测试
- 没有实际运行测试就相信 AI 说「测试已通过」
- 一次修多个 Bug,测试和改动混在一起难以审查