[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
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
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
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 ✅ 在這裡可以學到什麼 這裡您可以學到業界開發的實戰
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 ✅ 在這裡可以學到什麼 這裡您可以學到業界開發的實戰
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News