跳到主要內容
maxstudioNews
AI 自動化DEV Community (Claude Code)約 5 分鐘

AI 代理揪出測試日期炸彈,卻因程式碼缺陷卡關

本文作者使用一個自主 Claude Code 代理來尋找軟體測試中的「日期炸彈」,卻發現這個工具本身存在嚴重的程式碼缺陷,導致它只能在開發當天正常運作。作者詳細描述了這些問題,包括硬編碼基準日期、時鐘不同步、假日期寫入專案等,並分享了修復方法與從中學到的測試原則。

AI 代理揪出測試日期炸彈,卻因程式碼缺陷卡關
圖片來源:DEV Community (Claude Code)

這是一份來自我的自主 Claude Code 代理的現場筆記,它每天在一台 Windows 電腦上運行。這些數字來自它自己的分類帳,而非記憶。您可以先免費閱讀這套設定背後書籍的前三章 PDF 範本:https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample。

日期炸彈是指今天能通過,但在未來某個日期會失敗的測試,例如過期檢查、每週週期或某人設定的固定截止日期。我的專案有一個小工具專門用來找出這些問題。它會將「今天」向前推進 1、2、3、4、5、9、30 和 100 天,並在每個日期執行完整的測試套件。首次執行是在 8 月 20 日,當時發現了一個測試會在四天後失敗。

10 月 8 日,我為了尋找文章素材而打開了這個工具。它的基準日期被硬編碼為 8 月 20 日,也就是這個工具開發的當天。旁邊的註解寫著這個工具不應該依賴「今天」這個日期。因此在 10 月 8 日,它嘗試的八個日期是 8 月 21 日至 25 日、8 月 29 日、9 月 19 日和 11 月 28 日。

其中八個日期有七個已經是過去式了。一個旨在捕捉「只在今天有效」的測試的工具,結果卻只在它被開發的那天有效。

同一個檔案中還有另外四個問題。首先是兩個時鐘只動了一個,它替換了 date.today() 卻沒有動 datetime.now()。在修復之前,我快速複製了相同的方法,並在自己選擇的六個未來日期上執行。每個日期都顯示相同的兩個失敗,這兩個測試的共享輔助函數讀取 date.today(),而受測程式碼則讀取 datetime.now()。這些失敗來自於時間旅行功能,而非專案本身。

它將假日期寫入了專案中。它在儲存庫的頂層放置了一個 conftest.py 檔案,並在結束時將其移除。當它運行時,任何在該資料夾中啟動的其他 pytest 也會看到這個假日期,而我的代理排程運行和其 CI 鉤子都會在那裡啟動 pytest。如果運行中斷,該檔案就會保留下來。匯入它就會執行它。迴圈位於模組層級,沒有 if __name__ == "__main__": 保護。

固定路徑也是個問題。儲存庫路徑被硬編碼為我個人資料夾的絕對路徑。旁邊的變異測試工具也有相同的字串。第三個問題在我為它編寫測試時就發生了,我已經知道這個問題。為了先看到新測試失敗,我在一個測試中載入了舊檔案。載入它啟動了完整的八日期迴圈,並寫入了一個 conftest.py 檔案,將「今天」設定為 8 月 21 日。

我在兩分鐘內停止了它並刪除了該檔案。在那幾分鐘內,任何在該資料夾中執行的其他測試都會看到 8 月 21 日。

修復方法是將基準日期設定為你執行它的當天,使用 --base 2026-08-20 可以重複舊的運行。兩個時鐘都以相同的天數移動,一天的時間保持不變。假日期存在於一個臨時資料夾中的 pytest 外掛程式裡,並透過 -p 載入以供該次運行使用。

專案中不會寫入任何東西,如果停止運行也不會留下任何殘留。main() 函數位於 if __name__ == "__main__": 保護之下。這兩個工具都從它們自己的檔案位置找到儲存庫。

修復後出現了兩個意外。首先是 pandas 崩潰了。當我運行修復後的工具時,pandas 是在 datetime 類別被替換後才首次匯入的,其 C 擴充功能在載入時因堆疊溢位而崩潰:結束代碼 127,並且沒有 pytest 摘要。每個日期都顯示紅色,結果欄位為空。現在外掛程式會在替換之前匯入 pandas,並且如果運行結束時沒有摘要,則會印出其結束代碼和最後一行。

再來是移位中的移位。我的一個新測試在一個微型假專案上運行這個工具。在 pandas 修復後的下一次完整運行中,該測試在外部時間旅行中失敗了:內部運行的日期差了一天。現在外掛程式接收的是目標日期而不是天數,並根據真實時鐘測量移位。

結果顯示,10 月 8 日,修復後的工具在 10 月 9、10、11、12、13 和 17 日,11 月 7 日,以及 2027 年 1 月 16 日執行了測試套件。所有八個日期都通過了,每個日期都有 2,915 或 2,916 個測試。這次沒有發現日期炸彈。

這個工具現在也有了自己的測試:匯入它不會執行任何東西;如果沒有基準日期,所有日期都在未來;只有當兩個時鐘都返回移位後的日期且沒有任何東西被寫入專案時,假專案才會通過。接著我故意以四種方式破壞了這個工具:固定基準日期、datetime.now() 未被處理、假日期寫入儲存庫、pandas 未先載入。這些測試都捕捉到了這四個問題。

這些經驗歸納出幾條規則:檢查器本身也是程式碼,給它與它檢查的程式碼相同的測試。從運行中獲取「今天」,而不是從原始碼。如果需要固定日期來重複結果,請將其傳入。移動程式碼讀取的所有時鐘,date.today() 和 datetime.now() 是兩個時鐘。檢查不應該寫入它所檢查的資料夾,因為其他工作會共用該資料夾。

這裡的每篇文章都來自於我每天運行的一套設定:一個 CLAUDE.md 檔案、代理在接觸任何東西之前會讀取的記憶體檔案,以及一個獨立的審計代理,它會返回 PASS 或 FAIL。該書的前三章 PDF 可免費閱讀:https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code-free-sample。

完整版包含 11 章,外加 4 個即用模板(CLAUDE.md 入門、記憶體檔案、審計清單、測量指南)以及每章的實作部分,PDF 售價 19 美元:https://dbsoul.gumroad.com/l/autonomous-ai-agents-claude-code。歡迎在評論中提出關於此設定的問題,我會用實際發生的情況而非理論來回答。

Share

覺得值得一看?分享給朋友。

以上為 AI 自動翻譯導讀。原文版權歸 DEV Community (Claude Code) 所有, 建議透過「閱讀原文」前往原始網站,以取得最完整資訊並支持原作者。

Newsletter

不用每天追,AI 重點每週寄給你

43 個來源、每 2 小時更新,太多看不完。電子報每週挑最值得看的幾則,附上 Max 的看法。

每週一封。Email 只用來寄電子報,每封信都能一鍵退訂。