程式測試是「檢查」:以不同輸入執行程式,核對輸出是否符合規格,目標是盡早發現錯誤。
除錯是「修正」:在已知有錯的情況下,追蹤程式在某一行/某一步出現偏差的原因,並修改程式使其回到正確軌道。
- 測試回答:結果是否正確?
- 除錯回答:錯在哪裡?為甚麼會錯?如何改?
本課根據香港中學文憑考試(DSE)資訊及通訊科技科課程中「程式測試與除錯」及選修單元「演算法與程式編寫」的要求, 協助你掌握:程式測試的目的與方法、常見錯誤類型、測試數據設計與驗證、除錯技巧與工具,以及比較不同解決方案/演算法的準則。
本節重點在於分清「程式測試」與「除錯」的角色,以及理解它們如何配合,逐步提升程式的正確性與可靠性。
重點摘要
程式測試是「檢查」:以不同輸入執行程式,核對輸出是否符合規格,目標是盡早發現錯誤。
除錯是「修正」:在已知有錯的情況下,追蹤程式在某一行/某一步出現偏差的原因,並修改程式使其回到正確軌道。
在考試或作業中,建議把測試寫成「測試個案」形式,清楚列出:
| 元素 | 內容 | 作用 |
|---|---|---|
| 輸入(測試數據) | 例如:50 | 指定測試條件 |
| 預期輸出 | 例如:及格 | 用規格推算的正確結果 |
| 實際輸出 | 程式執行後得到的結果 | 用來判斷是否通過 |
只寫「我試過幾個數」通常不夠;要寫到「為甚麼選這些數(例如邊界值)」。
程式測試:使用預先設計的測試數據執行程式,並把實際輸出與預期輸出作比較,以檢查程式是否符合要求並發現錯誤。
除錯:根據測試結果,追蹤程式的執行流程,找出錯誤成因並修改程式;通常需要重複「發現錯誤 → 分析 → 修改 → 再測試」。
作答提示: 「程式測試是使用預先設計的測試數據執行程式,並比較實際輸出與預期輸出,以檢查結果是否正確及揭示錯誤; 除錯是追蹤程式的執行流程並修改程式,以找出及更正錯誤。」
程式錯誤有下列錯誤類型:
重點摘要
處理方法:根據報錯行號,先檢查該行及其上一行的語法(例如缺少符號常在上一行)。
預防方法:加入輸入驗證(例如檢查範圍、格式)及適當的條件判斷。
邏輯錯誤通常不會「報錯」,只能靠測試發現結果不對。常見來源包括:
處理方法:使用追蹤表逐步寫出變量值,或在關鍵位置輸出變量以檢查流程。
以下例子會在小測之中再次練習。
例 1:語法錯誤
目的:輸出 5 次「你好」。
問題:for 行尾漏了冒號,Python 會報 SyntaxError。
例 2:運行時錯誤
目的:輸出清單中的某個元素。
問題:合法索引只有 0、1、2;numbers[3] 會觸發 IndexError。
例 3:邏輯錯誤
目的:計算 1 + 2 + … + 10。
問題:每次只加 2,而不是加 i;程式能執行完畢,但結果錯誤。
每題會先交代程式「原本想做到的效果」,再提供一段含錯誤的 Python 程式碼,請判斷屬於哪一類錯誤。
本節重點在於:如何設計有代表性的測試數據,以及如何在程式中加入數據驗證,避免不合理輸入引致錯誤或不正確輸出。
重點摘要
若輸入範圍是 0–100,邊界值通常包括:
邊界值最容易暴露「> / >=」等條件錯誤或循環次數多/少一次的問題。
把輸入按性質分成幾組「等價類別」,每組選一個代表值測試即可。例如:
最常見做法是在處理前先檢查,若無效就輸出錯誤訊息或要求重新輸入。例如:
重點是:無效數據不應直接進入主計算流程。
建議把測試記錄成表格,最少包含:測試輸入、預期輸出、實際輸出、是否通過、備註。
這樣做能清楚展示你有系統地測試,亦方便日後回歸測試。
例子:輸入一個分數(0–100),輸出「及格/不及格/錯誤」:
幾個可能的測試個案:
本節整理常用的除錯方法。重點不是「猜」,而是以有系統的方式追蹤程式狀態,逐步收窄問題範圍。
重點摘要
有效除錯的第一步是把問題描述清楚:哪一組輸入會出錯?出現了甚麼不合理輸出或錯誤訊息?
把程式逐行「手算」一次,並記錄每一步的變量值,有助發現條件判斷或循環更新是否正確。
在考試中,追蹤表往往比長篇文字更清楚。
在關鍵位置加入輸出語句,查看變量是否如預期更新,例如:
斷點可令程式在指定行暫停,配合逐步執行功能,可逐行觀察變量、呼叫流程及分支走向。
除了看「結果」,更要看「過程」:程式是按哪一條路徑執行?變量在每一步如何變化?
在沒有除錯工具時,追蹤表+輸出變量就是最實用的追蹤方法。
當程式由多個子程式組成,且部分子程式尚未完成時,可以先用存根回傳固定結果,測試整體流程是否正常。
例子:計算 1 + 2 + 3:
可以畫追蹤表,逐行寫出 i 及 sum 的值,從而檢查循環更新是否正確。
Python 出錯時通常會顯示一段錯誤回溯,例如:
閱讀時可由下而上看:最後一行是錯誤類型;上方會顯示出錯行號與呼叫順序。
比較解決同一問題的不同程式或演算法,常見比較角度包括:
重點摘要
在不做精確計算下,可用循環結構估算:
比較題常見答案:指出某版本用多一個清單/字典換取更少重複計算。
可用以下句式:
問題:計算 1 + 2 + … + n。
做法一:循環相加
需要重複加 n 次。
做法二:使用公式
只需固定數量的運算步驟,通常更有效率。
下面的小測包含 40 題。每題會提供兩段 Python 程式碼(版本一/版本二),請你選擇最合適的比較說法。
執行 Python 程式並修正錯誤。每條題目會:
技術說明:所有題目文字及程式碼都放在 ../data/dch6/debug-python-40.json, 由 python.js 與 challenge-exercises.js 統一載入。
重點摘要
每題通常會提供(由題庫檔案載入):
題庫欄位對照(方便理解畫面資料來源): purpose(目的)、 starterCode(起始程式碼)、 hints(提示)、 fixedCode(參考答案)、 explanation(講解)、 equals(預期輸出/判斷標準),以及 errorType(錯誤類型)與 difficulty(難度)。
這種設計的目的,是讓你以「先嘗試、再反思」方式建立除錯能力,而不是只背答案。
處理方向:先用輸入驗證把不合理情況排除,再處理核心邏輯。
處理方法:畫追蹤表,或在關鍵位置輸出變量值以核對流程。
如畫面長期停留在此,請檢查是否已成功載入 python.js 及 challenge-exercises.js。
技術說明:這 40 題會沿用與 ACH4 相同的 Python 引擎。 challenge-exercises.js 會根據 ../data/dch6/debug-python-40.json 產生每一題的卡片, 再由 python.js 自動為每個 textarea.code-editor 加上行號、執行按鈕及「重設程式」功能。