1
0

More than 1 year has passed since last update.

TavernでStageごとにテスト対象を使い分ける方法

Posted at

初めに

以前、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のソースファイルが参考になりました

test_XXXX_api_dev.py
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も

dev_data.py
xxxx = "XXXXX"
yyyy = "YYYY"
zzzz = "ZZZZ"

validation.pyの一部

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ファイルの中で何をやっているのか分からないため、一抹の不安がありましたが、この方法だとデータの定義、テストの実行、テストそのものとそれぞれのファイルの役割が明示的になり、テストのメンテナンス性とテストの実行の敷居が下がり、継続的なテストファイルのメンテナンスに繋げられそうです

同じ悩みを持つ何方かのお役に立つと嬉しく思います

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0