🐷
pytest による parametrize テスト (パラメータの動的生成)
pytest による parametrize テスト (パラメータの動的生成)
固定値による parametrizeテスト
あらかじめ決められたパラメータに対して parametrizeテストを行う場合、単に @pytest.mark.parametrize
(parametrize
のt
とr
の間に e
がないのが正しいです) をつけて引数指定をすればいい。固定値の場合、検索すれば例が見つかる。
参考:
動的生成した parametrizeテスト
動的に生成 (正確には関数で生成) して parametrizeテストしたい場合、関数側で値を yield で返す。
テスト名を指定する必要がない場合
テスト名を指定する必要がない場合、パラメータをそのまま yield する。
-
@pytest.mark.parametrize
で指定するパラメータに関数 ( ここでは、dynamic_params1()
) を渡す。 - その関数の中で、使用したいパラメータを yield で返す。
import pytest
def dynamic_params1():
for i in range(3):
for j in ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]:
yield i, j
@pytest.mark.parametrize("i, j, ", dynamic_params1())
def test_dynamic_params1(i, j):
print(i, j)
テスト名を指定したい場合
テスト名を指定したい場合pytest.param
で包んで yield する。
-
@pytest.mark.parametrize
で指定するパラメータに関数 ( ここでは、dynamic_params2()
) を渡す。 - その関数の中で、使用したいパラメータを
pytest.param
で包んで yield すればいい。 - この際、
id
を明示的に指定することでテスト名を制御することができる。
import pytest
def dynamic_params2():
for i in range(3):
for j in ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]:
yield pytest.param(i, j, id=f"{i}-{j}-hogehoge")
@pytest.mark.parametrize("i, j, ", dynamic_params2())
def test_dynamic_params2(i, j):
print(i, j)
情報元
英語
Python Testing With Pytest: Simple, Rapid, Effective, and Scalable
(2nd Edition)の 16 章の Parametrizing with Dynamic Values
に pytest.param
の説明がある。
注意: 購入する場合は、初版と第2版を間違えないように。
日本語版
テストをスキップしたい場合
pytest.param はコンストラクタで引数に marks をとることができる。
pytest.mark.skipif を指定することでテストをスキップする理由とともに指定条件でテストをスキップできる。
def dynamic_params2():
for i in range(3):
for j in ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]:
yield pytest.param(i, j, id=f"{i}-{j}-hoge", marks=pytest.mark.skipif(i % 2 ==0, reason="even"))
@pytest.mark.parametrize("i, j, ", dynamic_params2())
def test_dynamic_params2(i, j):
print(i, j)
Discussion