PythonのPytestでもParameterizedTestをしたかったので、それを調べた時のメモ。ParameterizedTestのメリット等は特に解説しません。
環境
- Python
- 3.8.6
- Pytest
- 5.4.3
ゴール
2021年の各月の末日を求める。求める際にはParameterizedTestを使用する。
使い方
pytestをimportして、@pytest.mark.parametrize
で変数名と変数を指定するだけです。
次の例では、month
とans
変数に値を指定しています。
import pytest # 2021年の1月末日は31日 # 2021年の2月末日は28日 # 2021年の3月末日は31日 @pytest.mark.parametrize('month,ans', [ (1, 31), (2, 28), (3, 31), ]) def test_end_date(month, ans): assert calendar.monthrange(2021, month)[1] == ans
実行結果は、テストケースの数だけ出力されます。今回は1月から3月の3ケースを用意しているので、結果は3ケース出力されます。
pipenv run tests tests/test_months.py ...
エラーメッセージについて
エラーメッセージはエラーになったテストケースごとに出力されます。
import pytest @pytest.mark.parametrize('month,ans', [ (1, 31), (2, 29), # 2021年はうるう年ではないので29は誤り (3, 30), # 3月末日は30日ではないので誤り ]) def test_end_date(month, ans): assert calendar.monthrange(2021, month)[1] == ans
目的通りのエラーが発生します。
pipenv run tests tests/test_months.py .FF # 詳細エラーは記載が長くなるので省略 ================ short test summary info ====================== FAILED tests/test_months.py::test_end_date[2-29] - assert 28 == 29 FAILED tests/test_months.py::test_end_date[3-30] - assert 31 == 30
ソースコード
ブログでは3月までしか書いていませんが、ソースコードは12月までテストしています。
終わりに
Pythonはまだ慣れていませんが、Pytestとは少しずつ仲良くなれてきた気がします。
もしかしたら、もっと優秀なテスト方法があるかもしれませんが、できる範囲から良くしていきたいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
類似
- JavaのParameterizedTest