讓 Agent 寫測試、跑測試
Agent 說「完成了」,你怎麼知道是真的?測試就是答案。這堂課教你用 pytest 讓 Agent 有自我檢查的能力,並學會「先寫測試、再寫程式」的合作方式。
第一單元的「驗證五關」裡,第 2 到第 4 關都要你親自執行:跑得起來嗎、結果對嗎、邊界情況呢。那時候每改一次程式,你就得手動再試一遍。
用 Agent 之後,修改的速度變快很多,手動測試很快就跟不上了。這時候你需要一個能自動重複檢查的方法,這就是測試。
測試是什麼?
測試是一段「檢查程式對不對」的程式。你事先寫好「輸入什麼,應該得到什麼」,之後只要一個指令,就能一次檢查所有情況。
Python 最常用的測試工具是 pytest。來看記帳程式的例子。假設有一個計算某月總花費的函式:
# expense.py
def monthly_total(records: list[dict], month: str) -> int:
"""計算指定月份(格式 YYYY-MM)的總花費。"""
return sum(r["amount"] for r in records if r["date"].startswith(month))
對應的測試可以這樣寫:
# tests/test_expense.py
from expense import monthly_total
RECORDS = [
{"date": "2026-11-03", "category": "午餐", "amount": 120},
{"date": "2026-11-04", "category": "交通", "amount": 30},
{"date": "2026-10-31", "category": "午餐", "amount": 95},
]
def test_只加總指定月份():
assert monthly_total(RECORDS, "2026-11") == 150
def test_沒有紀錄的月份回傳零():
assert monthly_total(RECORDS, "2026-12") == 0
def test_空清單回傳零():
assert monthly_total([], "2026-11") == 0
每個以 test_ 開頭的函式就是一個測試,assert 的意思是「我斷定這件事成立」。在專案資料夾執行:
pytest
全部通過會顯示綠色的 passed,有錯就會清楚告訴你哪個測試、預期什麼、實際得到什麼。
為什麼測試對 Agent 特別重要
上一堂我們在 CLAUDE.md 寫了一條規則:「每次修改後執行 pytest,全部通過才算完成」。這條規則讓 Agent 擁有了自我檢查的能力:
- 它改了程式,跑測試,發現有一個失敗。
- 它讀錯誤訊息,找到原因,再改。
- 直到全部通過,才回報給你。
這就是第一堂說的 Agent 工作循環,而測試是讓這個循環「看得見對錯」的眼睛。
請 Agent 幫你寫測試
不用自己從頭寫,可以請 Claude Code 幫忙。重點是要它列出測試情況讓你先看:
請幫 expense.py 的 monthly_total 函式規劃 pytest 測試。
先不要寫程式碼,請用表格列出你打算測試的情況:輸入是什麼、預期結果是什麼、為什麼要測這個。請包含一般情況和邊界情況(例如空資料、跨月份、日期格式異常)。
我確認之後你再寫成測試檔,並執行 pytest 給我看結果。
這個步驟裡,你的工作是檢查每一個預期結果。例如它列出「金額是負數(退款)時應該從總額扣掉」,這是你的業務規則,只有你能決定對不對。
進階:先寫測試,再寫程式
更穩的合作方式,是先寫測試、再寫程式,這個做法稱為 TDD(Test-Driven Development,測試驅動開發)。和 Agent 一起做時,流程是這樣:
為什麼第 2 步要先「確認會失敗」?因為如果功能還沒寫,測試卻通過了,代表這個測試根本沒在檢查任何東西。看到它從紅變綠,你才能相信它。
假設你要幫記帳程式加「預算提醒」功能:
我要新增一個函式 over_budget(records, month, budget),當月總花費大於預算時回傳 True,否則回傳 False。
請照以下步驟進行,每一步完成後停下來讓我確認:
- 先在
tests/test_budget.py寫測試,包含:剛好等於預算、超過一元、沒有紀錄。 - 執行
pytest,確認這些測試失敗(因為函式還不存在)。 - 實作函式,只能修改
expense.py,不可修改測試,直到全部通過。
注意第 1 步的「剛好等於預算」:這時要回傳 True 還是 False?這種邊界問題,寫測試時就會被迫想清楚。這正是先寫測試的好處:它逼你把需求講精確。
測試通過不等於完成
測試只能檢查你想到要測的情況。全部通過代表「這些情況都對」,不代表「所有情況都對」。
所以審查時,除了看測試結果,也要問自己:還有什麼情況沒測到?想到了,就加一個測試。這也是下一堂審查 Agent 成果的重點之一。
- 在你的記帳或匯率專案裡,請 Claude Code 為一個現有函式規劃測試,先列成表格。
- 逐一確認預期結果,至少修改或新增一個情況。
- 請它寫成 pytest 測試並執行。
- 挑一個小新功能,用上面的 TDD 提示詞完成:先看到測試失敗,再看到它通過。
- 打開測試檔,確認 Agent 在第 3 步沒有動過它。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。