2026年9月3日 星期四

不是AI寫完才測: 用 Red、Green、Refactor 學會可靠的 Python 程式設計

TEST-DRIVEN DEVELOPMENT

不是AI寫完才測:
用 Red、Green、Refactor 學會可靠的 Python 程式設計

先定義成功,再讓程式與AI一起追上來。

生成式AI可以快速寫出Python程式,但「看起來能執行」不等於「真的符合需求」。在大三的Python程式實習中,我們要學習一種更可靠的工作方式:先寫測試,再寫程式,最後整理程式。這就是測試驅動開發(Test-Driven Development,簡稱TDD)。

RED 先寫會失敗的測試
GREEN 用最小修改通過
REFACTOR 整理而不改行為
一句話理解TDD: 不是AI寫完才測,而是測試牽著AI走。先說清楚「成功是什麼」,再要求程式做到。

一、什麼是 Red、Green、Refactor?

1. Red:先寫一個會失敗的測試

Red代表「紅燈」。在還沒有功能程式之前,先把我們期待的結果寫成測試。因為功能尚未完成,測試理應失敗;這正好證明測試真的有在檢查需求。

例如,我們要撰寫一個函式,計算一組成績的平均值。先定義成功條件:輸入[80, 90, 100]時,結果應該是90

RED|先定義成功
def test_average_of_three_scores(): assert average([80, 90, 100]) == 90

此時average()尚未建立,執行測試會失敗。這不是挫折,而是我們明確知道:下一步要完成的是什麼。

2. Green:用最少的程式碼讓測試通過

Green代表「綠燈」。現在才開始寫功能程式,目標是讓剛才的測試通過。此階段不必急著追求最漂亮、最完整的寫法,而是先讓需求正確實現。

GREEN|讓測試通過
def average(scores): return sum(scores) / len(scores)

再執行一次測試,若結果通過,就代表程式至少符合目前定義的基本需求。

3. Refactor:整理程式,但不能改變原本行為

Refactor代表「重構」。當測試已經通過,我們可以安心改善程式的可讀性與可維護性,例如取清楚的名稱、抽出重複程式、補上輸入檢查或撰寫註解。

REFACTOR|程式更清楚、更可靠
def average(scores): """計算成績平均;空串列不允許計算。""" if not scores: raise ValueError("成績不可為空") total_score = sum(scores) student_count = len(scores) return total_score / student_count

重構後,原本的測試仍必須通過。也就是說,程式的內部結構可以變好,但對使用者而言,正確行為不能被改壞。

二、為什麼要先測試,再請AI寫程式?

如果直接對AI說「幫我寫一個平均成績的程式」,AI可能產生看似正確的答案;但它不一定知道您如何處理空白資料、文字輸入、缺考成績或小數點。若先把需求寫成測試,就能把模糊的想法變成可驗證的規格。

直接請AI寫程式 先寫測試,再請AI協作
容易只看程式能不能執行。 先確認程式是否符合明確需求。
需求改變時,不容易知道哪裡受影響。 新增測試即可描述新需求,再修改程式。
AI產生錯誤時,常難以察覺。 測試失敗會立即指出程式尚未達標。
修改後可能不小心破壞舊功能。 所有舊測試都能協助確認原有功能仍正確。

三、用AI進行TDD的實作方式

在Python程式實習中,可以依照下列流程與AI協作:

  1. 先用自己的話寫下需求與成功條件。
  2. 先完成一至兩個測試案例,例如正常資料、空白資料或錯誤輸入。
  3. 把測試與需求交給AI,請它只修改功能程式,直到測試通過。
  4. 請AI解釋每一行程式,而不是只複製答案。
  5. 要求AI協助重構後,再次執行所有測試。
  6. 由自己檢查輸出結果是否符合常識與真實情境。

四、從「平均成績」到真實專題

TDD不只適合成績計算。未來同學處理YouBike資料、感測器資料、社區問卷、智慧農業資料或網站API時,都可以先寫下「資料正確時應得到什麼結果」,再開始撰寫程式。

  • 資料缺少某個欄位時,程式是否能顯示清楚錯誤?
  • 感測器數值超出合理範圍時,是否會產生警示?
  • API沒有回傳資料時,系統是否仍能安全處理?
  • 修改功能後,原本已經成功的功能是否仍能正常運作?
AI讓我們更快寫出程式;
Red、Green、Refactor讓我們更有能力寫出可信任的程式。

國立虎尾科技大學|Python程式實習

沒有留言:

張貼留言