在 Python 中有內建 unittest 這個單元測試的套件,本篇就會使用這個套件做單元測試的示範。
在上一篇 Python 專案結構 範例中就有建立一個 test 資料夾,我們通常會將測試的內容寫在 test 資料夾內,整個專案結構如下:
檔案名稱必須要是 test_ 開頭,通常後面會加上要被測試的檔案名稱,例如 test_calculator.py 。我們直接看測試範例:
重點: 建立一個類別,此類別要繼承 unittest.TestCase ,通常會把此類別使用 Test 開頭或結尾。而測試類別中可以有很多方法,但是都必須以 test_ 開頭。
上面看到的 self.assertEqual 方法是 unittest 中用來驗證結果有沒有符合預期的方法,除了 assertEqual 外,在官方文件中說明有以下這幾種:
和這幾種:
如果發現測試數量是 0 的話,很可能就是沒有在 test 資料夾中加入 __init__.py 檔案,此檔案可以不用任何內容。
執行一個 python 檔案的測試:
執行一個 python 檔案中的一個類別的測試:
執行一個 python 檔案中的一個類別中的一個方法的測試:
參考資料:
Python.docs - unittest — Unit testing framework
在上一篇 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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com