テストケースを書いていると、
値が一部違うだけでその他の部分には変更がないような
ものに出会うことがあると思います。
そんな時は大体テストケースプログラムの中身は
冗長になってしまいますね。
こういった場合に、お手軽に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ケースでおさめることも出来ちゃうと思います。
それだと修正が発生したときに逆に頭を悩ませてしまう事態が起こりかねません。
なのでまとめるとしても、正常系、異常系など、
ある程度目的をグループ化して、行うことがよいのかなと思いました。
それでは!!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!