はじめに
今年も、夢色乙女! nikkieです。
pytestのフィクスチャを使う上で気になっていた事項のやり方が分かったので、書き留めます。
目次
pytestのフィクスチャとは
pytestの特徴の1つがフィクスチャ!
フィクスチャは実際のテスト関数の実行に先立って(場合によってはその後に)pytestが実行する関数です。(Kindle版 p.82)
フィクスチャの使いこなしがpytestをうまく使う上でのポイントと感じています。
過去のエントリでも取り上げました。
2番目の記事を機に知ったのですが、フィクスチャどうしを組合せられるんですよね1
pytestのフィクスチャは、引数にある別のフィクスチャを実行できる
import pytest @pytest.fixture() def common(): print("Run common fixture") @pytest.fixture() def awesome(common): print("Run awesome fixture") def test_1_equals_1_using_awesome(awesome): assert 1 == 1
pytestがtest_1_equals_1_using_awesome
を実行するとき、
- commonフィクスチャ実行
- awesomeフィクスチャ実行
- テスト実行
assert 1 == 1
という動きとなっています。
これを利用すると小さいフィクスチャ同士を組み合わせてテストが書けて、私としては大変好みです。
フィクスチャにパラメタを渡す
フィクスチャを使う中で、フィクスチャ中で使う値を外から渡したいと感じ始めました。
このことを指して「パラメタを渡す」と書いています。
これはドキュメントにやり方がありました。
「Using markers to pass data to fixtures」
- Python 3.12.2
- pytest 8.3.2
- pytestが
test_fixt
を実行すると、まずfixt
フィクスチャが実行されます fixt
はrequest
引数を持ちます2request
引数を使って、fixt_data
マーカーの値を取得test_fixt
にはfixt_data(42)
とマーカーが付いているので、fixt
フィクスチャは42
を返します
assert fixt == 42
はassert 42 == 42
なので、パス!🟩
カスタムマーカーの設定
上記のテストはパスしますが、warningが表示されています。
PytestUnknownMarkWarning: Unknown pytest.mark.fixt_data - is this a typo? You can register custom marks to avoid this warning
案内されたドキュメントより https://docs.pytest.org/en/stable/how-to/mark.html#registering-marks
pytest.ini
またはpyproject.toml
を記載します。
今回は後者にしました。
[tool.pytest.ini_options] markers = ["fixt_data"]
これでwarningは出なくなります。
% pytest test_pass_data_fixture.py collected 1 item test_pass_data_fixture.py . [100%] ============================== 1 passed in 0.00s ===============================
sphinx-new-tab-linkで試しました
自作ライブラリ sphinx-new-tab-link のテストで試しました。
このテストはEnd-to-Endで、テスト用のSphinxプロジェクトをいくつも用意し、テストケースごとにビルドしています。
テスト中のビルドをフィクスチャでやるのを試していて、Sphinxプロジェクトの指定にマーカーを使いました。
イメージです
@pytest.fixture def parsed_built_html( ... ): marker = request.node.get_closest_marker("sphinx_build_in_tempdir") # 省略 @pytest.mark.sphinx_build_in_tempdir("external-link-icon") def test_see_external_link_icon(parsed_built_html): # 省略
test-external-link-iconディレクトリを指定しています
テストコードの全体はこちら
終わりに
pytestのフィクスチャにマーカー経由でパラメタを指定する方法を知りました。
フィクスチャの引数には他のフィクスチャが入ってくるので、関数の引数のようなものが使えるのか気になっていたのですが、今回1つの方法を見つけられました!
カスタムマーカーの設定もお忘れなく。
この知識も使って、小さいフィクスチャを組み合わせるテストを引き続き模索していきます。