Python 如何通过字符串访问pytest夹具?

Python 如何通过字符串访问pytest夹具?,python,pytest,Python,Pytest,pytestfixture可以在其他fixture上工作,方法是将它们作为参数传入: @pytest.fixture(scope='module') def wrapper_fixture1(fixture1): fixture1.do_something() return fixture1 现在我有多个不同的fixturefixture1、fixture2和fixture3,它们虽然不同,但有相似之处(例如,一个名为do_something())的函数,我希望将其应用于每一个

pytest
fixture可以在其他fixture上工作,方法是将它们作为参数传入:

@pytest.fixture(scope='module')
def wrapper_fixture1(fixture1):
    fixture1.do_something()
    return fixture1
现在我有多个不同的fixture
fixture1
fixture2
fixture3
,它们虽然不同,但有相似之处(例如,一个名为
do_something()
)的函数,我希望将其应用于每一个fixture

但是,我不想定义三个新装置(如示例中所示),而是想定义一个通用装置/函数,创建三个我可以传递到测试的装置。我在想这样的事情:

def fixture_factory():
    for index in range(3):
        fixture = pytest.get_fixture('fixture%d'%(index+1))
        fixture.do_something()
        pytest.set_fixture('wrapper_fixture%d'%(index+1), fixture, scope='module')

这能以某种方式做到吗?或者我必须为每个原始装置编写三个包装装置,一遍又一遍地重复相同的代码吗

要通过字符串获取fixture,可以在测试函数或其他fixture中使用
request.getfuncargvalue()

您可以尝试以下方法:

import pytest

@pytest.fixture
def fixture1():
    return "I'm fixture 1"

@pytest.fixture(scope='module')
def fixture2():
    return "I'm fixture 2"

@pytest.fixture(params=[1, 2])
def all_fixtures(request):
    your_fixture = request.getfuncargvalue("fixture{}".format(request.param))
    # here you can call your_fixture.do_something()
    your_fixture += " with something"
    return your_fixture

def test_all(all_fixtures):
    assert 0, all_fixtures

您可能还需要查看用例的
pytest\u generate\u tests()
hook()。

注意
request.getfuncargvalue()
确实有效,但如果可以,最好不要使用它。它阻止py.test知道哪些测试需要哪些装置,这些装置可能会产生微妙的影响,并引入一些参数化/集合异常。
request.getfuncargvalue()
被弃用,取而代之的是
request.getfixturevalue()
。尽管这个答案仍然有效。