接手「屎山」遺留代碼怎麼改:先補表徵測試再安全修改提示詞
接手沒有測試、沒人說得清邏輯的老代碼,又必須在上面改需求或修 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 條評論
還沒有評論,來搶沙發~