Pytestで、テストをパラメータ化してみた

pytestでは、テストにパラメータを追加することで、何種類かの引数を使って同じテストを繰り返し実行できます。

今回は、ここで書いたコードを少し修正して、パラメタライズドテストを書いてみました。

テスト対象コードを用意する

ここではstatus["capacity"] == "Available":のときにCapacity availableを返していましたが、 status["capacity"]の種類を増やして、Few left, Limited availability, Availableの3種類の時にCapacity availableを返すようにします。

    def check_capacity(self):
        status = self.get_status()
        if status["capacity"] == "Full":
            return "No capacity"
        elif status["capacity"] in ["Few left", "Limited availability", "Available"]:
            return "Capacity available"
        else:
            return "Status check failed"

pytestを書いてみる

How to parametrize fixtures and test functions — pytest documentation を参考に、テストをパラメータ化してみます。

class TestAPIClient:

    @pytest.fixture(autouse=True)
    def setup(self, mocker):
        self.client = APIClient("http://test")
        self.mock_get_status = mocker.patch.object(
            self.client, "get_status", autospec=True
        )

    @pytest.mark.parametrize("capacity", ["Few left", "Limited availability", "Available"])
    def test_check_capacity_available(self, capacity):
        self.mock_get_status.return_value = {"capacity": capacity}
        assert self.client.check_capacity() == "Capacity available"

テストの定義にパラメータを追加し、@pytest.mark.parametrize()マーカーの第一引数にパラメータの名前を文字列で、第二引数にテストケースのリストを指定します。

実行結果

> pytest .\test_main.py -k test_check_capacity_available
====================================================== test session starts ======================================================= 
platform win32 -- Python 3.11.0, pytest-8.0.0, pluggy-1.4.0 -- C:\Users\kei-c\fastApiProject\oop_test\venv\Scripts\python.exe      
cachedir: .pytest_cache
rootdir: C:\Users\kei-c\fastApiProject\oop_test
plugins: anyio-4.2.0, mock-3.12.0
collected 5 items / 2 deselected / 3 selected                                                                                      

test_main.py::TestAPIClient::test_check_capacity_available[Few left] PASSED                                                 [ 33%] 
test_main.py::TestAPIClient::test_check_capacity_available[Limited availability] PASSED                                     [ 66%] 
test_main.py::TestAPIClient::test_check_capacity_available[Available] PASSED                                                [100%] 

================================================ 3 passed, 2 deselected in 1.09s ================================================= 

3つのテストが別のテストとして報告されます。 今回の関数のパラメータ化以外にも、フィクスチャのパラメータ化やpytest_generate_testsというフック関数を使う方法もあるので、別の機会に記事にしようと思います。

参考

テスト駆動Python 第2版(Brian Okken 株式会社クイープ 株式会社クイープ 安井 力)|翔泳社の本