Pytest の fixture 関数は一度だけしか戻り値を返せないが2023年02月15日 12時36分33秒

Pytest の fixture 関数はテストの準備と後処理に使うための関数。テスト関数の引数として羅列すると、再帰的に fixture 関数を呼んでくれる。

この fixture 関数で若干癖があるのが、これ。fixture 関数は一度しか値を返せない。

% cat test1.py 
import pytest

n = 0

@pytest.fixture()
def number():
    global n
    n += 1
    return n

def test_number(number):
    assert number == 1
    assert number == 2
二度目の number は以下のように 1 のまま。
% pytest test1.py 
============================= test session starts ==============================
platform freebsd12 -- Python 3.8.15, pytest-4.6.11, py-1.9.0, pluggy-0.13.1
collected 1 item                                                               

test.py F                                                                [100%]

=================================== FAILURES ===================================
_________________________________ test_number __________________________________

number = 1

    def test_number(number):
        assert number == 1
>       assert number == 2
E       assert 1 == 2

test.py:13: AssertionError
=========================== 1 failed in 0.06 seconds ===========================

実は、fixture 関数が返せるのは値だけではない。ここで、関数を返すように少し書き換えると、複数回呼び出し、各々で違った値を取り出すことが出来る。

% cat test2.py
import pytest

n = 0

@pytest.fixture()
def number():
    def _number():
        global n
        n += 1
        return n

    return _number

def test_number(number):
    assert number() == 1
    assert number() == 2
今度はテストが成功する。
pytest test.py
============================= test session starts ==============================
platform freebsd12 -- Python 3.8.15, pytest-4.6.11, py-1.9.0, pluggy-0.13.1
collected 1 item                                                               

test.py .                                                                [100%]

=========================== 1 passed in 0.02 seconds ===========================
% 
これは結構頻繁に使われる技法。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2023/02/15/9563034/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。