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

Ale*_*lex 6 python pytest

pytest固定装置可以通过将其他固定装置作为参数传递来对其他固定装置起作用:

@pytest.fixture(scope='module')
def wrapper_fixture1(fixture1):
    fixture1.do_something()
    return fixture1
Run Code Online (Sandbox Code Playgroud)

现在我有多个不同的装置fixture1,它们fixture2虽然fixture3不同,但具有相似之处(例如名为 的函数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')
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ias 6

要通过字符串获取固定装置,您可以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
Run Code Online (Sandbox Code Playgroud)

  • `request.getfuncargvalue()` 已被弃用,取而代之的是 `request.getfixturevalue()`。尽管这个答案仍然有效。https://docs.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue (7认同)