[Python教學] 中級:檢測與除錯

更新 發佈閱讀 9 分鐘

在這篇文章中,我們將介紹如何在 Python 中進行除錯與測試。初學者可以利用 print() 進行簡單除錯,進階則可以學習 logging 模組進行更詳細的記錄,並利用 unittestpytest 等單元測試工具進行自動化測試,以確保程式的穩定性。


1 使用 print() 進行簡單除錯

print() 是初學者最常使用的除錯工具。在程式碼執行過程中,可以用 print() 將變數值、運行步驟、函式回傳值等輸出,以便追蹤程式的執行狀況。

範例

def divide(a, b):
print("a:", a) # 印出變數 a 的值
print("b:", b) # 印出變數 b 的值
result = a / b
print("result:", result) # 印出結果
return result

divide(10, 2)

執行上述程式時,可以看到每一步驟的計算值。這樣的方式適合快速了解程式的執行情況,尤其在問題發生的地方插入 print() 即可檢查變數。

需要注意的是,使用 print() 有局限性,尤其在大規模程式中,太多的 print() 會造成混亂。此外,print() 無法記錄到文件中,無法長期保存記錄。


2 使用 logging 模組進行進階除錯

logging 是 Python 內建的記錄工具,提供比 print() 更高級的功能,適合於需要長期保存記錄的場景。透過 logging,可以將錯誤、重要信息寫入文件,便於後續分析。

2.1 基本使用

import logging

logging.basicConfig(level=logging.DEBUG) # 設定日誌等級為 DEBUG

def divide(a, b):
logging.debug(f"a: {a}, b: {b}")
try:
result = a / b
logging.info(f"Result: {result}")
except ZeroDivisionError:
logging.error("Division by zero!")
result = None
return result

divide(10, 2)
divide(10, 0)
  • logging.debug():記錄詳細資訊,常用於除錯。
  • logging.info():記錄一般資訊,常用於程式正常運行時的信息。
  • logging.warning():警告信息,用於非致命性錯誤或重要事件。
  • logging.error():錯誤信息,用於程序中出現的錯誤。
  • logging.critical():致命性錯誤,用於無法運行的狀況。

2.2 將記錄寫入文件

可以將日誌記錄到文件中,方便日後查看。

logging.basicConfig(filename='app.log', level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')

def divide(a, b):
logging.debug(f"a: {a}, b: {b}")
try:
result = a / b
logging.info(f"Result: {result}")
except ZeroDivisionError:
logging.error("Division by zero!")
result = None
return result

divide(10, 2)
divide(10, 0)

此時,所有日誌會被寫入 app.log 文件中。format 參數可以控制日誌的格式,例如加上日期、時間、日誌等級等。


3 使用 unittest 模組進行單元測試

單元測試是測試程序中的最小單位,例如函式或方法。unittest 是 Python 內建的單元測試框架,可以快速檢測函式是否如預期運作。

3.1 基本使用

import unittest

def add(a, b):
return a + b

class TestAddFunction(unittest.TestCase):
def test_add_positive(self):
self.assertEqual(add(1, 2), 3) # 測試正整數相加
def test_add_negative(self):
self.assertEqual(add(-1, -1), -2) # 測試負整數相加
def test_add_zero(self):
self.assertEqual(add(0, 5), 5) # 測試包含零的相加

if __name__ == '__main__':
unittest.main()

每個測試方法以 test_ 開頭。assertEqual() 用於檢查實際結果是否與預期結果相符。

3.2 常用的 unittest 斷言方法

  • assertEqual(a, b):檢查 a == b
  • assertNotEqual(a, b):檢查 a != b
  • assertTrue(x):檢查 x is True
  • assertFalse(x):檢查 x is False
  • assertRaises(exception, func, *args, **kwds):檢查執行 func 是否拋出指定異常

4 使用 pytest 進行單元測試

pytest 是一個強大且靈活的 Python 測試框架,提供簡潔的測試語法,並且支持多種測試需求。

4.1 安裝 pytest

pip install pytest

4.2 使用 pytest 進行測試

unittest 相比,pytest 不需要將測試函式寫在類別內,直接定義測試函式即可。

def add(a, b):
return a + b

def test_add_positive():
assert add(1, 2) == 3 # 測試正整數相加

def test_add_negative():
assert add(-1, -1) == -2 # 測試負整數相加

def test_add_zero():
assert add(0, 5) == 5 # 測試包含零的相加

執行 pytest

pytest

pytest 會自動執行所有以 test_ 開頭的函式,並報告測試結果。

4.3 pytest 的進階功能

pytest 提供更多進階功能,例如參數化測試和自定義測試配置:

參數化測試:可以測試同一個函式的多組參數。

import pytest

@pytest.mark.parametrize("a, b, expected",
[
(1, 2, 3),
(-1, -1, -2),
(0, 5, 5),
])

def test_add(a, b, expected):
assert add(a, b) == expected

使用 @pytest.mark.parametrize 可以指定多組測試數據,並自動測試每一組數據的結果。


總結

這篇文章詳細介紹了 Python 中的除錯和測試方法。初學者可以使用 print() 進行基本除錯,而 logging 則適合用於記錄並長期保存運行信息。當進入專案開發階段時,建議使用 unittestpytest 進行單元測試,以確保程式的穩定性和可靠性。透過這些方法,可以在開發過程中更快、更有效地發現並解決問題,提升程式碼的品質。


留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
12會員
163內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
了解常見的錯誤消息將幫助您更有效的調試程式碼,本章將介紹 JavaScript 錯誤處理機制 (Error Handling),學習如何有效地偵測、處理與預防錯誤,提高程式的穩定性與可維護性。
Thumbnail
了解常見的錯誤消息將幫助您更有效的調試程式碼,本章將介紹 JavaScript 錯誤處理機制 (Error Handling),學習如何有效地偵測、處理與預防錯誤,提高程式的穩定性與可維護性。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
本文介紹了學習Python後,如何將日常自然語言翻譯成程式碼。並運用所學知識解決實際問題。這些練習不僅鞏固了學習者的程式設計能力,還提升解決問題的思維能力。適合所有想要進一步瞭解程式設計邏輯的Python初學者閱讀。
Thumbnail
本文介紹了學習Python後,如何將日常自然語言翻譯成程式碼。並運用所學知識解決實際問題。這些練習不僅鞏固了學習者的程式設計能力,還提升解決問題的思維能力。適合所有想要進一步瞭解程式設計邏輯的Python初學者閱讀。
Thumbnail
本文介紹如何在Windows命令行及VS Code中確認Python版本,並提供編寫第一個Python程式的步驟。重點在於註解的使用方式及其對程式可讀性的重要性。此外,還簡單介紹了turtle繪圖模組的應用,透過範例繪製佩佩豬,為Python學習者提供實用的參考與指導。
Thumbnail
本文介紹如何在Windows命令行及VS Code中確認Python版本,並提供編寫第一個Python程式的步驟。重點在於註解的使用方式及其對程式可讀性的重要性。此外,還簡單介紹了turtle繪圖模組的應用,透過範例繪製佩佩豬,為Python學習者提供實用的參考與指導。
Thumbnail
歡迎來到我們的「🏫 Python 先修班」系列, 這裡面涵蓋了我們入門Python的技巧與教學, 以下是我們為您整理的閱讀順序, 也非常感謝您的支持, 期望透過簡單易懂的知識分享, 讓我們快速入門Python這門語言, 與業界正式接軌。 【🔒 Python 先修班】我應該怎麼開始學Pytho
Thumbnail
歡迎來到我們的「🏫 Python 先修班」系列, 這裡面涵蓋了我們入門Python的技巧與教學, 以下是我們為您整理的閱讀順序, 也非常感謝您的支持, 期望透過簡單易懂的知識分享, 讓我們快速入門Python這門語言, 與業界正式接軌。 【🔒 Python 先修班】我應該怎麼開始學Pytho
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News