サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【python】【pytest】1つのコードで複数のケースをテストする

テストケースを書いていると、

値が一部違うだけでその他の部分には変更がないような

ものに出会うことがあると思います。

 

 

そんな時は大体テストケースプログラムの中身は

冗長になってしまいますね。

 

 

こういった場合に、お手軽に1コード で複数のケースを

消化させる仕組みがpytestにあって、感激したので紹介したいと思います。

 

 

 

 

 

 

pytest.mark.parametrizeを使用する

pytest.mark.parametrizeデコレータを使用することで、実現可能です。

以下サンプルです。

def concat(param1: str, param2: str) -> str:
    return param1 + '-' + param2

------------------------------------------------------------------------------------

@pytest.mark.parametrize(
    'param1,param2,expected',   # テストに渡すfixtureとなる
    # ↓ケース分、配列で渡してあげる
    [('test1, 'test2', 'test1-test2'),
      ('test3, 'test4', 'test3-test4')]
)
def test_concat(self, param1, param2, expected) -> None:

    assert concat(param1, param2) == expected

 

上記例だと、2ケース実行されることになります。

param1 = ‘test1’、param2 = ‘test2’で結果が’test1-test2’となるケース

param1 = ‘test3’、param2 = ‘test4’で結果が’test3-test4’となるケース

ですね。

 

値を変更したいものと、期待値はセットで

今回のサンプルだと変更したい値の内容によって、期待する値が変わりますので、

そういった場合には変更する値とともに、その場合に期待する値も一緒に渡してあげるのが

良いと思います。

 

 

どんな値がきても結果が同じであれば、期待値に関しては渡してあげる必要はありません。

 

 

 

 

 

まとめ

今回紹介したやり方であれば、

例えば、リクエストのvalidationチェックを1ケースでまとめたりと、

様々なことが可能になると思います。

 

 

実際やってみて、気をつけた方がいいなと思ったのは、

渡す値が何を想定したケースなのか、などケースが多くなれば、

値だけみてもテスト内容がわかりませんので、そこは適宜コメントなどした方がいいなと。

 

 

また、やろうと思えば何でもかんでも1ケースでおさめることも出来ちゃうと思います。

それだと修正が発生したときに逆に頭を悩ませてしまう事態が起こりかねません。

 

 

なのでまとめるとしても、正常系、異常系など、

ある程度目的をグループ化して、行うことがよいのかなと思いました。

 

 

それでは!!

 

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了