初めに
以前、TavernでStageごとの設定を使い分ける方法のような記事を書きましたが、今はより使い勝手が良さそうな方法で行っていますので、紹介します
結論
runを使っています
以前検討しましたが、パス区切りを/ではなく.で行っていたため、エラーになっていました
ディレクトリ構成
現在のところ下のような構造で運用しています
(まだ開発段階ですのでdev関連のみとなります)
tests
├── __init__.py
├── helper
│ ├── dev_data.py
│ ├── utility.py
│ └── validation.py
├── test_XXXX_api.tavern.yaml
└── test_XXXX_api_dev.py
実行方法
下のようにpythonスクリプトを実行します
python3 tests/test_XXXX_api_dev.py dev
testファイルの内容
test_XXXX_api_dev.pyは下のようになりました
パラメータで読み込むデータ定義ファイルを切り分けています
テスト結果の判定処理でも使うため、パラメータもextra_cfgに含めています
runのパラメータについては、上記のマニュアルページにも記載されていますが、githubのソースファイルが参考になりました
from tavern.core import run
import sys
stage = sys.argv[1]
tavern_file = "tests/test_XXXX_api.tavern.yaml"
if stage == "dev":
import helper.dev_data as data
elif stage == "stg":
pass
elif stage == "prd":
pass
else:
ValueError(f"Invalid stage: {stage}")
extra_cfg = {
"variables": {
"xxxx": data.xxxx,
"yyyy": data.yyyy,
"zzzz": data.zzzz,
"stage": stage,
}
}
success = run(tavern_file,
tavern_global_cfg=extra_cfg,
tavern_strict=False,
pytest_args=["-s"])
他のファイルの内容
蛇足ですが、dev_data.pyも
xxxx = "XXXXX"
yyyy = "YYYY"
zzzz = "ZZZZ"
validation.pyの一部
def response(response, stage: str):
if stage == "dev":
import tests.helper.dev_data as base
もう少しリファクタリングできないかな...
テストデータを変更する際には、dev_data.pyとtest_XXXX_api_dev.pyの両方を触ることになりますが、
test_XXXX_api_dev.pyにテストデータも集約すると、validation.pyからtest_XXXX_api_dev.pyの参照が循環参照でエラーになったため、断念しました
終わりに
TavernでStageごとの設定を使い分ける方法だと、shellファイルの中で何をやっているのか分からないため、一抹の不安がありましたが、この方法だとデータの定義、テストの実行、テストそのものとそれぞれのファイルの役割が明示的になり、テストのメンテナンス性とテストの実行の敷居が下がり、継続的なテストファイルのメンテナンスに繋げられそうです
同じ悩みを持つ何方かのお役に立つと嬉しく思います