說說在 Python 中如何測試函式

deniro發表於2019-04-20

說說在 Python 中如何測試函式

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。通過斷言方法,我們就可以判定結果是否與期望結果相一致。

執行結果:

說說在 Python 中如何測試函式

2 測試不通過

假設 to_read() 函式需要擴充套件,加入一個 book_type 引數,用於定義該書所歸屬的領域:

def to_read(book_name, book_type):
    '''想讀的書'''
    content = '我想讀《' + book_name + '》咯,'
    content += '它屬於' + book_type + '領域'
    return content

複製程式碼

這時,如果再次執行之前編寫好的單元測試用例,就會丟擲異常:

說說在 Python 中如何測試函式

  • 第一行 FAILED,表示沒有完全通過測試,errors 指出了出錯個數。
  • 測試用例一般會包含多個單元測試,所以我們可以通過 Traceback 找到出錯的單元測試,精確到行數。

發生測試不通過現象時,首先要做的是冷靜,通過 Traceback ,找到問題所在,修改函式或者單元測試程式碼,以符合預期行為。

在這個示例中,我們嘗試修改單元測試程式碼:

def test_read(self):
	'''測試 read 函式'''
	result = to_read('現代藝術150年 : 一個未完成的故事','藝術')
	self.assertEqual(result, '我想讀《現代藝術150年 : 一個未完成的故事》咯,它屬於藝術領域')
複製程式碼

是不是測試通過啦 O(∩_∩)O哈哈~

相關文章