程式測試與除錯

本課根據香港中學文憑考試(DSE)資訊及通訊科技科課程中「程式測試與除錯」及選修單元「演算法與程式編寫」的要求, 協助你掌握:程式測試的目的與方法、常見錯誤類型、測試數據設計與驗證、除錯技巧與工具,以及比較不同解決方案/演算法的準則。

6.1 測試與除錯概觀

本節重點在於分清「程式測試」與「除錯」的角色,以及理解它們如何配合,逐步提升程式的正確性與可靠性。

重點摘要

  • 理解:測試 ≠ 除錯;測試用來比對輸出,除錯用來追蹤原因並修正。
  • 掌握:由規格 → 測試個案 → 執行 → 記錄 → 修正 → 再測試的完整流程。
  • 作答技巧:答案要寫到「測試數據」「預期輸出」「實際輸出」「邊界情況」等關鍵字。

程式測試的定義

程式測試:使用預先設計的測試數據執行程式,並把實際輸出預期輸出作比較,以檢查程式是否符合要求並發現錯誤。

除錯的定義

除錯:根據測試結果,追蹤程式的執行流程,找出錯誤成因並修改程式;通常需要重複「發現錯誤 → 分析 → 修改 → 再測試」。

互動:分辨「測試」或「除錯」
請按「下一題」開始。每題會描述一個行動,請判斷它屬於「程式測試」還是「除錯」。

作答提示: 「程式測試是使用預先設計的測試數據執行程式,並比較實際輸出與預期輸出,以檢查結果是否正確及揭示錯誤; 除錯是追蹤程式的執行流程並修改程式,以找出及更正錯誤。」

6.2 程式錯誤類型

程式錯誤有下列錯誤類型:

重點摘要

  • 快速判斷:不能執行 → 多為語法錯誤;執行途中崩潰 → 多為運行時錯誤;能跑完但結果錯 → 多為邏輯錯誤。
  • 閱讀錯誤訊息:留意錯誤類型與行號,配合追蹤變量更容易定位問題。
  • 把程式拆成小步驟(分段測試),更容易找出問題位置。
  • 先處理「會令程式停機」的語法/運行時錯誤,再處理邏輯錯誤。
  • 修正後要做回歸測試:重新測試之前成功的個案,確保沒有引入新錯誤。

例子:三種常見錯誤

以下例子會在小測之中再次練習。

例 1:語法錯誤

for i in range(5) print("你好")

目的:輸出 5 次「你好」。
問題:for 行尾漏了冒號,Python 會報 SyntaxError

例 2:運行時錯誤

numbers = [3, 5, 9] print(numbers[3])

目的:輸出清單中的某個元素。
問題:合法索引只有 0、1、2;numbers[3] 會觸發 IndexError

例 3:邏輯錯誤

total = 0 for i in range(1, 11): total = total + 2 print(total)

目的:計算 1 + 2 + … + 10。
問題:每次只加 2,而不是加 i;程式能執行完畢,但結果錯誤。

小測 1:看 Python 程式碼,判斷錯誤類型

每題會先交代程式「原本想做到的效果」,再提供一段含錯誤的 Python 程式碼,請判斷屬於哪一類錯誤。

互動:判斷錯誤類型(語法/運行時/邏輯)
請按「下一題」開始。請留意:題目會先說明目的,再顯示含錯誤的程式碼。

6.3 測試數據設計與數據驗證

本節重點在於:如何設計有代表性的測試數據,以及如何在程式中加入數據驗證,避免不合理輸入引致錯誤或不正確輸出。

重點摘要

  • 設計測試數據不是「隨便試幾個」,而是要有系統地覆蓋正常值、邊界值與無效輸入。
  • 數據驗證的目的:在程式處理前先把不合理輸入擋走,避免出錯或產生不可靠結果。
  • 要點:每個測試個案都要寫出「輸入」「預期輸出」及其屬於哪一類測試數據。

常見測試數據類型

例子:輸入一個分數(0–100),輸出「及格/不及格/錯誤」:

mark = int(input("分數(0-100):")) if mark < 0 or mark > 100: print("錯誤") elif mark >= 50: print("及格") else: print("不及格")

幾個可能的測試個案:

  • 75 → 及格(正常數據)
  • 50 → 及格(邊界數據)
  • 0 → 不及格(邊界數據)
  • -5 → 錯誤(無效數據)
  • 123 → 錯誤(無效數據)
互動:測試數據類型練習
請按「下一題」開始。每題會描述一組輸入或一份數據來源,請判斷它屬於:正常數據/邊界數據/無效數據。

6.4 除錯:手動方法與除錯工具

本節整理常用的除錯方法。重點不是「猜」,而是以有系統的方式追蹤程式狀態,逐步收窄問題範圍。

重點摘要

  • 先重現錯誤,再定位;定位時以追蹤表或輸出變量縮小範圍。
  • 一次只改一個地方,改完要回歸測試,避免引入新問題。
  • 善用斷點/逐步執行,比「盲改」更有效率。

空運行/追蹤表

例子:計算 1 + 2 + 3:

sum = 0 i = 1 while i <= 3: sum = sum + i i = i + 1 print(sum)

可以畫追蹤表,逐行寫出 isum 的值,從而檢查循環更新是否正確。

閱讀錯誤訊息

Python 出錯時通常會顯示一段錯誤回溯,例如:

ZeroDivisionError: division by zero

閱讀時可由下而上看:最後一行是錯誤類型;上方會顯示出錯行號與呼叫順序。

6.5 比較不同解決方案/演算法

比較解決同一問題的不同程式或演算法,常見比較角度包括:

重點摘要

  • 比較效率時,優先觀察循環結構:是否有巢狀循環?是否重複做相同步驟?
  • 比較可讀性時,留意:變量命名、模組化、是否有重複代碼、是否容易改規格。
  • 書面答案要「有理由」:指出哪一段設計令它較快/較省記憶體/較易維護。

下面的小測包含 40 題。每題會提供兩段 Python 程式碼(版本一/版本二),請你選擇最合適的比較說法。

互動:40 題演算法比較(版本一與版本二)
請按「下一題」開始。每題會顯示兩段程式碼,然後你用 A / B / C / D 去形容兩個版本的關係。

A. 版本一較有效率(需要較少運算步驟)。

B. 版本二較有效率(需要較少運算步驟)。

C. 兩個版本效率差不多,但版本一較易閱讀/較易維護。

D. 兩個版本效率差不多,但版本二較易閱讀/較易維護。

6.6 40 題 Python 除錯挑戰(語法/運行時/邏輯錯誤)

執行 Python 程式修正錯誤。每條題目會:

技術說明:所有題目文字及程式碼都放在 ../data/dch6/debug-python-40.json, 由 python.jschallenge-exercises.js 統一載入。

重點摘要

  • 建議流程:先理解目的 → 預測輸出 → 執行 → 讀錯誤訊息 → 修正 → 再測試。
  • 善用提示與參考答案:先自己嘗試,再對照差異,理解「為甚麼要改」。
  • 完成後加測:用邊界/無效輸入再試,確認真正修正而非碰巧通過。

載入中…

如畫面長期停留在此,請檢查是否已成功載入 python.jschallenge-exercises.js

技術說明:這 40 題會沿用與 ACH4 相同的 Python 引擎。 challenge-exercises.js 會根據 ../data/dch6/debug-python-40.json 產生每一題的卡片, 再由 python.js 自動為每個 textarea.code-editor 加上行號、執行按鈕及「重設程式」功能。