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はoptparseかargparseのどちらかだと思いますが、調べ方がわかりません。Pytestで調べても出てこないので、参考程度に見ると勉強になります。
def pytest_addoption(parser): parser.addoption('--env', # オプション名 default='IT' # デフォルト値 )
オプションからパラメータを受け取る
conftest.py
にpytest.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が出力される
ソースコード
- playwright-practice/conftest.py at 9e2d7c52b9d306fd0ae13f75e16ab1bc0d4650b3 · hirotoKirimaru/playwright-practice · GitHub
- playwright-practice/test_2.py at main · hirotoKirimaru/playwright-practice · GitHub
終わりに
Pytestの理解が浅いので、参考情報を読んでも時間がかかってしまったので自分でブログに残しておきます。
正直、だいたい環境変数でなんとかできるケースしか出会っていないので、Windows環境以外はあんまり頑張る必要はないでしょう。