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

更新於 2024/11/14閱讀時間約 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 進行單元測試,以確保程式的穩定性和可靠性。透過這些方法,可以在開發過程中更快、更有效地發現並解決問題,提升程式碼的品質。


歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
Python 的物件導向程式設計 (Object-Oriented Programming, OOP) 是其最強大和靈活的特性之一。通過 OOP 的思想,我們可以組織、抽象並簡化程式碼結構,以達到更好的可維護性和可擴展性。
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
Python 是一門功能強大且簡潔的程式語言,內建了多種資料結構來幫助開發者處理各種不同的需求。今天,我們將介紹五種常見的資料結構:字串、清單、元組、集合和字典,並學習它們的使用方式。
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
Python 的物件導向程式設計 (Object-Oriented Programming, OOP) 是其最強大和靈活的特性之一。通過 OOP 的思想,我們可以組織、抽象並簡化程式碼結構,以達到更好的可維護性和可擴展性。
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
Python 是一門功能強大且簡潔的程式語言,內建了多種資料結構來幫助開發者處理各種不同的需求。今天,我們將介紹五種常見的資料結構:字串、清單、元組、集合和字典,並學習它們的使用方式。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
本文介紹Python程式設計中處理異常的try, except, else, finally語句,並提供程式範例來更深刻理解使用方法。
Thumbnail
IDE 升級後出現了一樣的錯誤,手上程式碼沒有 pylint black-format 檢查上不了 gitlab,我又點開了那個很小很小的 x 符號,裡面 logs 提示的解決方式是升級..
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
本文介紹Python程式設計中處理異常的try, except, else, finally語句,並提供程式範例來更深刻理解使用方法。
Thumbnail
IDE 升級後出現了一樣的錯誤,手上程式碼沒有 pylint black-format 檢查上不了 gitlab,我又點開了那個很小很小的 x 符號,裡面 logs 提示的解決方式是升級..