在 Python 專案使用 pytest 進行單元測試

測試範例

建立 math_operations.py 檔。

1
2
def add(a, b):
return a + b

建立 test_math_operations.py 檔。

1
2
3
4
5
6
from math_operations import add

def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0

執行測試。

1
pytest test_math_operations.py

參數化測試

參數化測試可以使用不同的參數組合來測試同一個函數。

實作

修改 test_math_operations.py 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pytest

from math_operations import add


@pytest.mark.parametrize(
"a, b, expected",
[
(1, 2, 3),
(-1, 1, 0),
(0, 0, 0),
(100, 200, 300),
],
)
def test_add(a, b, expected):
assert add(a, b) == expected

執行測試。

1
pytest test_math_operations.py

測試例外

可以使用 pytest.raises 來測試異常情況。

實作

修改 math_operations.py 檔。

1
2
3
4
5
6
7
8
def add(a, b):
return a + b


def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b

修改 test_math_operations.py 檔。

1
2
3
4
5
6
7
8
import pytest

from math_operations import divide


def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
divide(1, 0)

執行測試。

1
pytest test_math_operations.py

測試夾具

Pytest 的夾具(fixtures)可以在測試中共享和重用程式碼。

實作

修改 math_operations.py 檔。

1
2
3
4
5
6
7
8
9
10
11
import pytest


@pytest.fixture
def sample_data():
return {"a": 10, "b": 20}


def test_add_with_fixture(sample_data):
result = sample_data["a"] + sample_data["b"]
assert result == 30

執行測試。

1
pytest test_math_operations.py

參考資料