これがまさに必要なものかどうかはわかりませんが、フィクスチャの代わりに関数を使用して、フィクスチャでこれらを組み合わせることができます。
import pytest
class Parser: # dummy parser for testing
def __init__(self, name):
self.name = name
def parse(self, text):
return f'{self.name}({text})'
class ParserFactory: # do not recreate existing parsers
parsers = {}
@classmethod
def instance(cls, name):
if name not in cls.parsers:
cls.parsers[name] = Parser(name)
return cls.parsers[name]
def parser_a():
return ParserFactory.instance("parser_a")
def parser_b():
return ParserFactory.instance("parser_b")
def short_text():
return "Lorem ipsum"
def long_text():
return "If I only knew how to bake cookies I could make everyone happy."
@pytest.fixture(params=[long_text, short_text])
def text(request):
yield request.param
@pytest.fixture(params=[parser_a, parser_b])
def parser(request):
yield request.param
@pytest.fixture
def doc(parser, text):
yield parser().parse(text())
def test_doc(doc):
print(doc)
結果の pytest 出力は次のとおりです。
============================= test session starts =============================
...
collecting ... collected 4 items
test_combine_fixt.py::test_doc[parser_a-long_text] PASSED [ 25%]parser_a(If I only knew how to bake cookies I could make everyone happy.)
test_combine_fixt.py::test_doc[parser_a-short_text] PASSED [ 50%]parser_a(Lorem ipsum)
test_combine_fixt.py::test_doc[parser_b-long_text] PASSED [ 75%]parser_b(If I only knew how to bake cookies I could make everyone happy.)
test_combine_fixt.py::test_doc[parser_b-short_text] PASSED [100%]parser_b(Lorem ipsum)
============================== 4 passed in 0.05s ==============================
更新:
例としてコメントで説明されているように、パーサーのシングルトン ファクトリを追加しました。
注:pytest.lazy_fixture
@hoefling の提案に従って
使用しようとしました。これは機能し、パーサーとテキストをフィクスチャから直接渡すことができますが、各パーサーが 1 回だけインスタンス化されるように (まだ) 機能させることはできませんでした。参考までに、使用する場合の変更されたコードは次のpytest.lazy_fixture
とおりです。
@pytest.fixture
def parser_a():
return Parser("parser_a")
@pytest.fixture
def parser_b():
return Parser("parser_b")
@pytest.fixture
def short_text():
return "Lorem ipsum"
@pytest.fixture
def long_text():
return "If I only knew how to bake cookies I could make everyone happy."
@pytest.fixture(params=[pytest.lazy_fixture('long_text'),
pytest.lazy_fixture('short_text')])
def text(request):
yield request.param
@pytest.fixture(params=[pytest.lazy_fixture('parser_a'),
pytest.lazy_fixture('parser_b')])
def parser(request):
yield request.param
@pytest.fixture
def doc(parser, text):
yield parser.parse(text)
def test_doc(doc):
print(doc)