接手「屎山」遗留代码怎么改:先补表征测试再安全修改提示词
接手没有测试、没人说得清逻辑的老代码,又必须在上面改需求或修 Bug 时用:让 AI 先帮你写「记录现有行为」的表征测试,把当前行为锁住,再在测试保护下做最小修改,避免改一处坏三处。
通用大模型 对话模型通用
我要修改一段没有测试的遗留代码。请按「先锁定现有行为,再修改」的方法帮我。 信息: - 语言与测试框架:[如 Java + JUnit 5] - 这次要做的修改:[新需求或要修的 Bug] - 遗留代码(尽量完整,包括它调用的函数): [粘贴代码] - 已知它依赖的外部资源:[数据库、文件、网络、当前时间等] 步骤: 1. 读代码,用通俗的话说明这段代码目前实际做了什么(不是它「应该」做什么)。把看起来像 Bug、但可能有人依赖的行为单独列出来,标注「疑似 Bug,先保留」。 2. 找出「接缝」:哪些依赖(数据库、时间、随机数、静态方法、全局变量)需要替换成可控的假对象才能测试。给出改动最小的方式让它可测,比如把依赖作为参数传入、提取一个接口,并说明这一步本身不改变行为。 3. 写表征测试: - 覆盖主要分支和边界输入(空值、零、负数、超长、特殊字符); - 期望值取自代码当前的真实输出,不是我认为正确的结果;如果需要先运行一次才能知道输出,写成「运行后把实际值填进来」的形式并标注; - 每个测试名说明它锁定的是哪种行为。 4. 在测试保护下完成本次修改:只改必要的部分,说明哪些表征测试的期望值会因为这次修改而变化、为什么,其余测试必须保持通过。 5. 列出后续可以逐步重构的地方,但这次不做。 约束:不要一次性重写整个模块;每一步给出的代码都要能单独编译运行。
高亮处换成你自己的内容:[如 Java + JUnit 5]、[新需求或要修的 Bug]、[粘贴代码]、[数据库、文件、网络、当前时间等]
ChatGPT Plus 充值
已被复制 0 次
使用说明
怎么填变量:[这次要做的修改] 要具体,表征测试的覆盖重点会围绕这次修改涉及的分支展开。依赖的外部资源写全,AI 才能判断哪些地方需要先「开接缝」。
常见坑:
- 最大的误区是「顺手把看起来不对的地方都改掉」。遗留代码里的奇怪行为常常有下游在依赖,这一步只记录、不修改,确认没人依赖后再单独处理。
- AI 推测的期望值不一定是代码真实的输出,尤其涉及浮点数、字符串格式、排序时。模板要求「以实际运行结果为准」,第一次运行时把失败的断言改成实际值即可。
- 为了可测而做的接缝改造本身也有风险,改完先跑一遍原有的手动验证流程。
追问技巧:表征测试跑通后追问「还有哪些输入组合没有覆盖,按风险排序」;准备重构时追问「在不改变这些测试结果的前提下,第一步最安全的重构是什么」。
示例输出
示例,仅供参考(节选:老的运费计算函数直接调用了当前时间)
疑似 Bug,先保留:重量为 0 时返回 12 元(首重运费),而不是 0。可能有业务依赖,先用测试锁住。
接缝:函数内部调用了 LocalDate.now(),改为增加一个带 Clock 参数的重载,原方法调用它并传入系统时钟,行为不变。
java
private final ShippingCalc calc =
new ShippingCalc(Clock.fixed(Instant.parse("2026-03-01T00:00:00Z"), ZoneOffset.UTC));
@Test
void 重量为零时按首重收费_现有行为() {
assertEquals(new BigDecimal("12.00"), calc.fee(BigDecimal.ZERO, "上海"));
}
@Test
void 偏远地区加收_现有行为() {
// 期望值以第一次运行的实际输出为准
assertEquals(new BigDecimal("30.00"), calc.fee(new BigDecimal("2.5"), "新疆"));
}同款作品
用这条提示词做出来的作品;原作者会因此获得积分
还没有同款,来做第一个。


0 条评论
还没有评论,来抢沙发~