接手「屎山」遺留代碼怎麼改:先補表徵測試再安全修改提示詞

接手沒有測試、沒人說得清邏輯的老代碼,又必須在上面改需求或修 Bug 時用:讓 AI 先幫你寫「記錄現有行為」的表徵測試,把當前行為鎖住,再在測試保護下做最小修改,避免改一處壞三處。

NNathaniel bigo··原創首發·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"), "新疆"));
}

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~