初めに
冷静に考えると当然だけど、他のUnitテストフレームワークには無い要素なので記事化しました。
フィクスチャは引数配置の順番に実行される
今回例題とするコードはこんなものになります。
フィクスチャは引数配置順に実行されます。
そのためフィクスチャを利用するテストtestFixture
の引数をinit_strs, add_b
の順に並べるとフローチャート通りに実行されテストが通ります。
import pytest
strs: list[str] = ["A"]
@pytest.fixture
def init_strs():
strs.clear()
@pytest.fixture
def add_b():
strs.append("B")
def testFixture(init_strs, add_b):
assert strs == ["B"]
しかしadd_b, init_strs
の順に並べるとテストが通らなくなります。
フィクスチャの実行順が逆になり、先に文字列リストに「B」を入れて中身が空になります。
def testFixture(add_b, init_strs):
assert strs == ["B"]
================================================================================================== FAILURES ==================================================================================================
________________________________________________________________________________________________ testFixture _________________________________________________________________________________________________
add_b = None, init_strs = None
def testFixture(add_b, init_strs):
> assert strs == ["B"]
E AssertionError: assert [] == ['B']
E Right contains one more item: 'B'
E Use -v to get more diff
test_main.py:18: AssertionError
------------------------------------------------------------------------------------------- Captured stdout setup --------------------------------------------------------------------------------------------
['A', 'B']
[]
========================================================================================== short test summary info ===========================================================================================
FAILED test_main.py::testFixture - AssertionError: assert [] == ['B']
============================================================================================= 1 failed in 0.09s ==============================================================================================
最後に
他のUnitテストフレームワークではモック関数をテスト関数内で任意実行するのに対して、Pytestは引数配置順で自動実行されるため仕事で戸惑いました。