Pythonのpytestでパラメータ化を試してみる

はじめに

この記事では、「Pythonのpytestでパラメータ化を行う方法」について書いています。

パラメータ化とは何か

テストを書いている時、一つの条件だけでなく複数の値で確認したい場合もあるかと思います。(数値処理の関数ならマイナスの値やプラスの値、ゼロや大きい値など)

しかし、一つの関数のためだけにたくさんのテスト関数を作るのも面倒ですし可読性も悪くなってしまいます。

そういったテストを簡単に行えるようにした仕組がパラメータ化と呼ばれているものです。

引数と期待する結果を組にしたものを用意し、それをテスト関数に渡すことで複数の条件で結果をテストすることができるようになります。

実際に試してみる

では簡単なテストでpytestでパラメータ化を試してみましょう

Note

試した際の環境は以下の通りです。

まず、パラメータ化を試すためのコードは以下の通りです。

import pytest

def add_two(num):
    return num + 2

@pytest.mark.parametrize(
    "x, expected",
    [
        (1, 3),
        (2, 3),
        (3, 5)
    ],
)

def test_add_two(x, expected):
    assert expected == add_two(x)

ポイントとしては

  • @pytest.mark.parametrizeでテストに使用するパラメータを記述します
  • テスト関数(ここではtest_add_two)の引数に、@pytest.mark.parametrizeで記述したパラメータを指定します。

このコードに対してpytestを実行してみると以下のような出力が得られます。

plugins: anyio-3.6.1
collected 3 items

test_add.py .F.                                                                                                  [100%]

====================================================== FAILURES =======================================================
_________________________________________________ test_addition[2-3] __________________________________________________

x = 2, expected = 3

    @pytest.mark.parametrize(
        "x, expected",
        [
            (1, 3),
            (2, 3),
            (3, 5)
        ],
    )

    def test_add_two(x, expected):
>       assert expected == add_two(x)
E       assert 3 == 4
E        +  where 4 = add_two(2)

test_add.py:16: AssertionError
=============================================== short test summary info ===============================================
FAILED test_add.py::test_add_two[2-3] - assert 3 == 4
============================================= 1 failed, 2 passed in 0.20s =============================================

パラメータで記述した3組全てでテストが実行されたようです。

ちなみに、実は1組のパラメータをわざと失敗するようにしていましたが、それが正しく失敗と検知されています。

おわりに

Pythonのpytestでパラメータ化を行う方法」について解説しました。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

https://rinatz.github.io/python-book/ch08-02-pytest/

https://qiita.com/gyu-don/items/33ac89b85b6df86962d9