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
というフック関数を使う方法もあるので、別の機会に記事にしようと思います。