Python 標準庫中的 unittest 模組,提供了程式碼測試功能 。我們可以通過單元測試來驗證所定義的函式是否符合預期。 一個函式一般會定義一組的單元測試(也叫做測試用例), 通過這些測試用例來判斷該函式在各種邊界條件下,函式的行為是否符合預期 。大型專案中要做到全覆蓋測試比較困難,所以在最初階段,只會針對程式碼的重要行為來編寫測試用例。 而後,在專案的發展過程中,再逐步完善測試用例。
1 第一個單元測試
假設有這樣的一個函式,它會返回格式化後的待讀資訊:
def to_read(book_name):
'''想讀的書'''
return '我想讀《' + book_name + '》咯'
複製程式碼
現在建立一個單元測試:
import unittest
from book_function import to_read
class BookTestCase(unittest.TestCase):
'''測試 book_function.py'''
def test_read(self):
'''測試 read 函式'''
result = to_read('現代藝術150年 : 一個未完成的故事')
self.assertEqual(result, '我想讀《現代藝術150年 : 一個未完成的故事》咯')
if __name__ == '__main__':
unittest.main()
複製程式碼
- 單元測試類必須繼承自 unittest.TestCase 類, 這樣 Python 才會執行我們編寫的測試邏輯。
- 在此,使用了 unittest 類的斷言方法 assertEqual。通過斷言方法,我們就可以判定結果是否與期望結果相一致。
執行結果:
2 測試不通過
假設 to_read() 函式需要擴充套件,加入一個 book_type 引數,用於定義該書所歸屬的領域:
def to_read(book_name, book_type):
'''想讀的書'''
content = '我想讀《' + book_name + '》咯,'
content += '它屬於' + book_type + '領域'
return content
複製程式碼
這時,如果再次執行之前編寫好的單元測試用例,就會丟擲異常:
- 第一行 FAILED,表示沒有完全通過測試,errors 指出了出錯個數。
- 測試用例一般會包含多個單元測試,所以我們可以通過 Traceback 找到出錯的單元測試,精確到行數。
發生測試不通過現象時,首先要做的是冷靜,通過 Traceback ,找到問題所在,修改函式或者單元測試程式碼,以符合預期行為。
在這個示例中,我們嘗試修改單元測試程式碼:
def test_read(self):
'''測試 read 函式'''
result = to_read('現代藝術150年 : 一個未完成的故事','藝術')
self.assertEqual(result, '我想讀《現代藝術150年 : 一個未完成的故事》咯,它屬於藝術領域')
複製程式碼
是不是測試通過啦 O(∩_∩)O哈哈~