nikkie-ftnextの日記

イベントレポートや読書メモを発信

pytestのマーカーを使って、フィクスチャにパラメタを渡す

はじめに

今年も、夢色乙女! 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を実行するとき、

  1. commonフィクスチャ実行
  2. awesomeフィクスチャ実行
  3. テスト実行 assert 1 == 1

という動きとなっています。
これを利用すると小さいフィクスチャ同士を組み合わせてテストが書けて、私としては大変好みです。

フィクスチャにパラメタを渡す

フィクスチャを使う中で、フィクスチャ中で使う値を外から渡したいと感じ始めました。
このことを指して「パラメタを渡す」と書いています。

これはドキュメントにやり方がありました。
Using markers to pass data to fixtures

  • pytestがtest_fixtを実行すると、まずfixtフィクスチャが実行されます
  • fixtrequest引数を持ちます2
    • request引数を使って、fixt_dataマーカーの値を取得
    • test_fixtにはfixt_data(42)とマーカーが付いているので、fixtフィクスチャは42を返します
  • assert fixt == 42assert 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つの方法を見つけられました!
カスタムマーカーの設定もお忘れなく。

この知識も使って、小さいフィクスチャを組み合わせるテストを引き続き模索していきます。