使用 Claude 與屬性測試尋找 Bug
Anthropic 開發了一款 AI agent,能夠透過自主推論程式碼的一般屬性並應用屬性測試 (PBT),高效地在大型軟體專案中識別 Bug。藉由使用類似模糊測試 (fuzz testing) 的技術,該 agent 發現了包括 NumPy、SciPy 和 Pandas 在內的知名 Python 套件中的 Bug。
屬性測試 vs. 範例測試
屬性測試專注於驗證程式碼的一般不變量 (invariant) 或屬性是否在廣泛的輸入範圍內保持成立,而非驗證特定的、手動定義的範例。
- 範例測試 (Example-based tests): 開發者定義一個特定的輸入 (例如
[2, 10, 5, 4]) 並驗證輸出是否符合預期結果 (例如[2, 4, 5, 10])。這種方法通常會錯過開發者未能預見到的邊緣情況 (edge cases)。 - 屬性測試 (Property-based tests): 開發者指定一個一般屬性 (例如「JSON 反序列化是序列化的逆過程」) 以及輸入範圍。接著,框架會自動生成大量有效的輸入,以搜尋是否會出現破壞該屬性的反例 (counterexample)。
Anthropic 的 agent 透過閱讀型別註解 (type annotations)、文件字串 (docstrings)、函式名稱和註解來推論這些屬性,然後使用 Hypothesis 函式庫來編寫測試。
屬性測試 Agent 的工作流程
該 agent 是以自定義 Claude Code 指令的形式實現的。它接受一個目標——例如 Python 檔案、模組或特定函式——並遵循五個步驟的迭代過程:
- 分析 (Analysis): 閱讀程式碼和文件以理解目標及其與程式碼庫的關係。
- 提案 (Proposal): 基於分析提出屬性。
- 實作 (Implementation): 使用 Hypothesis 編寫屬性測試。
- 反思 (Reflection): 執行測試並評估結果。如果測試失敗,agent 會判斷是發現了真正的 Bug,還是測試本身需要調整。如果測試成功,agent 會評估該測試是否具有代表性或是有意義的。
- 報告 (Reporting): 如果對 Bug 的有效性有信心,agent 會生成格式化的 Bug 報告。
為了管理長程推理,該 agent 使用了待辦事項清單 (to-do list)。研究人員指出,與 Sonnet 4 相比,Opus 4.1 和 Sonnet 4.5 的自我反思能力有顯著提升。
真實世界性能與驗證
研究人員在超過 100 個熱門的 PyPI 套件上測試了該 agent。評估分為兩個階段:
階段 1:初步評估 (Opus 4.1)
在 Claude Opus 4.1 生成的 984 份 Bug 報告中,對 50 份報告進行人工審查發現,56% 為有效的 Bug,32% 為有效且可報告的 Bug。為了提高精準度,團隊開發了一套 15 分制的評分標準來對 Bug 進行排名。應用此標準時,得分最高的報告中有 86% 是有效的,81% 是有效且可報告的。
階段 2:精細化評估 (Sonnet 4.5)
團隊使用 Sonnet 4.5 多次在幾個關鍵套件上運行 agent,並採用了更先進的評估 agent 來檢查正確性與嚴重性,最後再由人類專家進行審查。
個案研究:已識別的 Bug
該 agent 發現的幾個 Bug 已在主要函式庫中被回報並修復了:
- NumPy: Agent 發現
numpy.random.wald有時會回傳負數,違反了 Wald 分佈的屬性。修復方法涉及處理災難性抵消 (catastrophic cancellation) 以建立更具數值穩定性的公式,將相對誤差降低了近十個數量級。 - aws-lambda-powertools: Agent 發現
slice_dictionary()會重複回傳第一個區塊,因為迭代器沒有增加。這是透過測試「切片與重建字典應回傳原始字典」這一屬性來識別的。 - cloudformation-cli-java-plugin: Agent 發現
item_hash()對所有列表都會產生相同的雜湊值,因為它使用了會回傳None的原地 (in-place).sort()方法。這是透過測試「不同輸入應產生不同雜湊值」來捕捉到的。 - tokenizers: Agent 發現
EncodingVisualizer.calculate_label_colors()中缺少一個右括號,導致產生無效的 HSL CSS,這是透過將輸出與 HSL 色碼的正規表示式進行比對來測試的。
python-dateutil 中關於儒略曆 (Julian calendar) 的一個回報問題被維護者標記為無效,這突顯了一個限制:agent 難以處理包含維護者才能定義的細微或隱含假設的程式碼。
未來方向
Anthropic 將 Agentic PBT 視為人工測試的重要補充,特別是隨著 LLM 在從上下文推論屬性方面的能力提升。研究人員建議,下一步的邏輯步驟是自動生成修補程式 (patches)。如果正確性屬性可以被完整地指定,修正 Bug 就會變得更簡單,這使得 LLM 可能能夠為維護者審查而提出高品質的修補程式。
Sources
相關
- Dispatch
- Dispatch
- Dispatch
- 專案
- Dispatch