きり丸の技術日記

技術検証したり、資格等をここに残していきます。

PythonのPytestでParameterizedTestをする

PythonのPytestでもParameterizedTestをしたかったので、それを調べた時のメモ。ParameterizedTestのメリット等は特に解説しません。

環境

  • Python
    • 3.8.6
  • Pytest
    • 5.4.3

ゴール

2021年の各月の末日を求める。求める際にはParameterizedTestを使用する。

使い方

pytestをimportして、@pytest.mark.parametrizeで変数名と変数を指定するだけです。

次の例では、monthans変数に値を指定しています。

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でのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

類似