如何通过字符串访问pytest fixture?

时间:2014-06-10 12:09:27

标签: python pytest

pytest灯具可以通过将它们作为参数传递来处理其他灯具:

@pytest.fixture(scope='module')
def wrapper_fixture1(fixture1):
    fixture1.do_something()
    return fixture1

现在我有多个不同的灯具fixture1fixture2fixture3不同,但有相似之处(例如名为do_something()的函数),我想申请他们每个人。

但是我没有定义三个新灯具(如示例中所示),而是想要定义一个通用灯具/功能,它可以创建三个灯具,我可以将其传递给测试。我在考虑这样的事情:

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')

这可以通过某种方式完成吗?或者我是否必须为每个原始灯具编写三个包装灯具,一遍又一遍地重复相同的代码?

2 个答案:

答案 0 :(得分:3)

要通过字符串获取灯具,可以在测试功能或其他灯具中使用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

答案 1 :(得分:1)

您可能还想查看用例的pytest_generate_tests()挂钩(http://pytest.org/latest/plugins.html?highlight=generate_tests#_pytest.hookspec.pytest_generate_tests)。