所有入門單元免費開放 · 課程內容持續更新中

讓 Agent 寫測試、跑測試

Agent 說「完成了」,你怎麼知道是真的?測試就是答案。這堂課教你用 pytest 讓 Agent 有自我檢查的能力,並學會「先寫測試、再寫程式」的合作方式。

第 6.5 堂約 15 分鐘

第一單元的「驗證五關」裡,第 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 特別重要

回饋循環:Agent 修改程式後執行 pytest,有測試失敗就讀錯誤訊息再改,全部通過才回報給你。沒有測試時 Agent 只能說應該可以了,有測試時它能證明這些情況都對

上一堂我們在 CLAUDE.md 寫了一條規則:「每次修改後執行 pytest,全部通過才算完成」。這條規則讓 Agent 擁有了自我檢查的能力:

  • 它改了程式,跑測試,發現有一個失敗。
  • 它讀錯誤訊息,找到原因,再改。
  • 直到全部通過,才回報給你。

這就是第一堂說的 Agent 工作循環,而測試是讓這個循環「看得見對錯」的眼睛。

請 Agent 幫你寫測試

不用自己從頭寫,可以請 Claude Code 幫忙。重點是要它列出測試情況讓你先看:

請 Agent 規劃測試

請幫 expense.py 的 monthly_total 函式規劃 pytest 測試。

先不要寫程式碼,請用表格列出你打算測試的情況:輸入是什麼、預期結果是什麼、為什麼要測這個。請包含一般情況和邊界情況(例如空資料、跨月份、日期格式異常)。

我確認之後你再寫成測試檔,並執行 pytest 給我看結果。

這個步驟裡,你的工作是檢查每一個預期結果。例如它列出「金額是負數(退款)時應該從總額扣掉」,這是你的業務規則,只有你能決定對不對。

進階:先寫測試,再寫程式

更穩的合作方式,是先寫測試、再寫程式,這個做法稱為 TDD(Test-Driven Development,測試驅動開發)。和 Agent 一起做時,流程是這樣:

TDD 四步:你和 Agent 一起寫測試並審查預期結果;Agent 確認測試會失敗;Agent 只改程式直到通過;你審查程式碼並想新情況

為什麼第 2 步要先「確認會失敗」?因為如果功能還沒寫,測試卻通過了,代表這個測試根本沒在檢查任何東西。看到它從紅變綠,你才能相信它。

假設你要幫記帳程式加「預算提醒」功能:

用 TDD 和 Agent 加新功能

我要新增一個函式 over_budget(records, month, budget),當月總花費大於預算時回傳 True,否則回傳 False。

請照以下步驟進行,每一步完成後停下來讓我確認:

  1. 先在 tests/test_budget.py 寫測試,包含:剛好等於預算、超過一元、沒有紀錄。
  2. 執行 pytest,確認這些測試失敗(因為函式還不存在)。
  3. 實作函式,只能修改 expense.py,不可修改測試,直到全部通過。

注意第 1 步的「剛好等於預算」:這時要回傳 True 還是 False?這種邊界問題,寫測試時就會被迫想清楚。這正是先寫測試的好處:它逼你把需求講精確。

測試通過不等於完成

測試只能檢查你想到要測的情況。全部通過代表「這些情況都對」,不代表「所有情況都對」。

所以審查時,除了看測試結果,也要問自己:還有什麼情況沒測到?想到了,就加一個測試。這也是下一堂審查 Agent 成果的重點之一。

行動練習
  1. 在你的記帳或匯率專案裡,請 Claude Code 為一個現有函式規劃測試,先列成表格。
  2. 逐一確認預期結果,至少修改或新增一個情況。
  3. 請它寫成 pytest 測試並執行。
  4. 挑一個小新功能,用上面的 TDD 提示詞完成:先看到測試失敗,再看到它通過。
  5. 打開測試檔,確認 Agent 在第 3 步沒有動過它。

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。