🐷

pytest による parametrize テスト (パラメータの動的生成)

2022/06/25に公開

pytest による parametrize テスト (パラメータの動的生成)

固定値による parametrizeテスト

あらかじめ決められたパラメータに対して parametrizeテストを行う場合、単に @pytest.mark.parametrize (parametrizetrの間に e がないのが正しいです) をつけて引数指定をすればいい。固定値の場合、検索すれば例が見つかる。

参考:

https://docs.pytest.org/en/6.2.x/parametrize.html#pytest-mark-parametrize

動的生成した parametrizeテスト

動的に生成 (正確には関数で生成) して parametrizeテストしたい場合、関数側で値を yield で返す。

テスト名を指定する必要がない場合

テスト名を指定する必要がない場合、パラメータをそのまま yield する。

  1. @pytest.mark.parametrize で指定するパラメータに関数 ( ここでは、dynamic_params1()) を渡す。
  2. その関数の中で、使用したいパラメータを 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 する。

  1. @pytest.mark.parametrize で指定するパラメータに関数 ( ここでは、dynamic_params2()) を渡す。
  2. その関数の中で、使用したいパラメータを pytest.param で包んで yield すればいい。
  3. この際、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 Valuespytest.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