きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pytestでコマンドオプションからパラメータを渡す

Pytestでコマンドのオプションからパラメータを渡すことができないか調べたときのメモ。似た記事はたくさんありますので、詳しいことは参考情報を見てください。

環境

  • Python
    • 3.8.10
  • pytest
    • 6.2.4

ゴール

Pytestのコマンドオプションからパラメータを渡し、テストコード上で値を取得する。

pytest -s 
# デフォルト値のITがテストクラスに渡される

pytest -s --env=IT
# ITがテストクラスに渡される

pytest -s --env=ST
# STがテストクラスに渡される

要約

  • デフォルトではパラメータを受け取れるようなオプションは存在しない
  • conftest.pyでコマンドラインからオプションとパラメータを受け取れるようにする
  • pytest.fixtureでテストメソッドにパラメータを渡す

    対応

    オプションとパラメータを受け取る準備をする

デフォルトでは、Pytestでオプションとパラメータを自由に受け取れるようなものはありません(pytest --vars=hogeのように、すぐに使える--varsオプションはありません)。

conftest.pyでパラメータを受け取れるようにする必要があります。

conftest.pyにメソッドのpytest_addoption(parser)を作成します。パラメータのparser#addoptionでオプション名等を指定します。

※ このparserはoptparseargparseのどちらかだと思いますが、調べ方がわかりません。Pytestで調べても出てこないので、参考程度に見ると勉強になります。

def pytest_addoption(parser):
    parser.addoption('--env', # オプション名
                    default='IT' # デフォルト値
                    )

オプションからパラメータを受け取る

conftest.pypytest.fixtureを付与したメソッドを追加します。このメソッドではrequestを受け取ります。

パラメータのrequestからrequest.config#getoptionを使用します。getoptionにオプション名を指定して、パラメータを取得します。

@pytest.fixture
def env(request):
    return request.config.getoption("--env")

テストメソッドにパラメータを渡す

テストメソッドにfixtureを付与したメソッド名と同名のパラメータを付与します。自動でマッピングして、パラメータに渡されます。

def test_env(env):
    print(env)

結果確認

pytest -s
# ITが出力される(デフォルト値)

pytest -s --env=IT
# ITが出力される

pytest -s --env=ST
# STが出力される

備考

正直、Pytestでコマンドラインでオプションを渡すと処理が非常に面倒です。MacやLinuxであれば、環境変数に指定する方法も簡単なので、そちらを使用したほうが良いかもしれません。

なお、Windowsはこの書き方での環境変数の設定ができないので、注意です。

import os

def test_(env):
    print(os.environ.get('ENV'))
# コマンドの手前に指定すると環境変数に設定できる
ENV=IT pytest -s 
# ITが出力される

ENV=ST pytest -s 
# STが出力される

ソースコード

終わりに

Pytestの理解が浅いので、参考情報を読んでも時間がかかってしまったので自分でブログに残しておきます。

正直、だいたい環境変数でなんとかできるケースしか出会っていないので、Windows環境以外はあんまり頑張る必要はないでしょう。

参考情報