Python 單元測試 示範

在 Python 中有內建 unittest 這個單元測試的套件,本篇就會使用這個套件做單元測試的示範。

在上一篇 Python 專案結構 範例中就有建立一個 test 資料夾,我們通常會將測試的內容寫在 test 資料夾內,整個專案結構如下:
	
my-project
|-- src/
|   `-- __init__.py
|-- test/
|   `-- __init__.py
|-- main.py
`-- requirements.txt
	
假設我們現在建立了 calculator.py 檔案:
    
def add(x: int, y: int) -> int:
    return x + y


def subtract(x, y):
    return x - y
    

檔案名稱必須要是 test_ 開頭,通常後面會加上要被測試的檔案名稱,例如 test_calculator.py 。我們直接看測試範例:
    
import unittest

from src.calculator import add, subtract


class TestCalculator(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 1), 2)
        self.assertEqual(add(2, 2), 4)

    def test_subtract(self):
        self.assertEqual(subtract(1, 1), 0)
        self.assertEqual(subtract(1, -1), 2)
    

重點: 建立一個類別,此類別要繼承 unittest.TestCase ,通常會把此類別使用 Test 開頭或結尾。而測試類別中可以有很多方法,但是都必須以 test_ 開頭。

上面看到的 self.assertEqual 方法是 unittest 中用來驗證結果有沒有符合預期的方法,除了 assertEqual 外,在官方文件中說明有以下這幾種:

這幾種

執行測試

目前專案結構如下:
	
my-project
|-- src/
|   |-- calculator.py
|   `-- __init__.py
|-- test/
|   |-- test_calculator.py
|   `-- __init__.py
|-- main.py
`-- requirements.txt
	
這個時候就可以在專案的根目錄直接執行下面的指令,來執行所有的測試
    
python -m unittest
    

如果發現測試數量是 0 的話,很可能就是沒有在 test 資料夾中加入 __init__.py 檔案,此檔案可以不用任何內容。

執行一個 python 檔案的測試:
    
python -m unittest test.test_calculator
    

執行一個 python 檔案中的一個類別的測試:
    
python -m unittest test.test_calculator.TestCalculator
    

執行一個 python 檔案中的一個類別中的一個方法的測試:
    
python -m unittest test.test_calculator.TestCalculator.test_add
    

測試前執行和測試後執行

可以定義 setUpClass 和 tearDownClass 方法(大小寫要一樣)用來在測試前和測試後執行程式碼,需要標記 @classmethod
    
import unittest

from src.calculator import add, subtract


class TestCalculator(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('setupClass')

    @classmethod
    def tearDownClass(cls):
        print('teardownClass')

    def test_add(self):
        self.assertEqual(add(1, 1), 2)
        self.assertEqual(add(2, 2), 4)

    def test_subtract(self):
        self.assertEqual(subtract(1, 1), 0)
        self.assertEqual(subtract(1, -1), 2)
    



參考資料:
Python.docs - unittest — Unit testing framework

留言