AI 重构遗留代码前,先锁定现有行为
文章介绍用特征测试记录遗留代码的实际输出,包括历史缺陷与隐含规则,以检查 AI 重构是否改变行为。实践涉及 Python、pytest、syrupy 和 mutmut,强调没有可靠规格时先建立行为基线。
原文暂未完整获取,基于公开信息的快读
让 AI 重构遗留代码,最难确认的往往是:代码变整齐之后,那些没人记得的业务规则还在不在。dev.to 的一篇文章分享了做法:先用特征测试记录旧代码的实际行为,再让 AI 小步修改,通过前后对比检查回归。现有节选已展示测试流程,但原文后半部分尚不完整。
目前能确认什么
作者使用 Python、pytest、syrupy 和 mutmut,为遗留代码建立行为基线。特征测试(characterization tests)记录代码「现在怎么做」,包括历史缺陷;按规格编写的常规测试则检查代码「应该怎么做」。
节选中的运费函数包含地区附加费、取整、会员折扣和免邮条件。作者组合边界输入,用 syrupy 保存结果快照,也记录异常类型。重构后重新运行,检查结果是否一致。空字符串、None 等输入也被纳入,防止 AI 添加校验时意外改变行为。
作者还用变异测试(mutation testing)修改运算符、常量等,检查测试能否发现差异。覆盖率只能说明代码被执行过,不能单独证明断言足够有效。
我的判断
这套方法最有价值的地方,是把「看起来没改逻辑」变成可以重复执行的检查。
对缺少可靠规格的模块,程序员可以先要求 AI 提取函数、替换常量,每次只改一小步,再比较快照。出现差异时,也更容易定位是哪次修改改变了行为。
但快照匹配只覆盖已选输入,不能证明所有场景都等价;旧缺陷被保留下来,也不代表它合理。修复缺陷应单独明确预期,不能靠更新快照悄悄放行。
节选中的部分变异测试示例与输入组合仍需运行核验,不能直接当作已验证结论。对于时间、随机数或外部服务造成的不稳定输出,现有内容也没有交代处理方式,这会影响该方法能否用于真实项目。