在两个不同的灯具上运行相同的测试

Cod*_*ice 9 python fixtures pytest

我有一个测试,目前使用这样的单个夹具运行:

@pytest.fixture()
def foo():
    return 'foo'


def test_something(foo):
    # assert something about foo
Run Code Online (Sandbox Code Playgroud)

现在我正在创建一个稍微不同的夹具,比方说

@pytest.fixture
def bar():
    return 'bar'
Run Code Online (Sandbox Code Playgroud)

我需要对第二个夹具重复完全相同的测试.如果不复制/粘贴测试并更改参数名称,我该怎么做?

Ser*_*yev 6

除了生成测试之外,您还可以对任何数量的动态应用的子夹具进行“夹具方式”。为此,定义要用作参数的实际灯具:

@pytest.fixture
def arg(request):
    return request.getfuncargvalue(request.param)
Run Code Online (Sandbox Code Playgroud)

使用间接参数化定义测试(参数名称arg和灯具名称arg必须匹配):

@pytest.mark.parametrize('arg', ['foo', 'bar'], indirect=True)
def test_me(arg):
    print(arg)
Run Code Online (Sandbox Code Playgroud)

我们还定义我们引用的那些固定装置:

@pytest.fixture
def foo():
    return 'foo'

@pytest.fixture
def bar():
    return 'bar'
Run Code Online (Sandbox Code Playgroud)

观察参数化和识别这些测试的效果如何:

$ pytest test_me.py -s -v -ra
collected 2 items                                                                                

test_me.py::test_me[foo] foo
PASSED
test_me.py::test_me[bar] bar
PASSED
Run Code Online (Sandbox Code Playgroud)

  • `getfuncargvalue` 已弃用。有没有一种“现代”的方法来做到这一点? (2认同)
  • 获取夹具值() (2认同)
  • 从 [pytest 5.1.0 发行说明](https://docs.pytest.org/en/6.2.x/changelog.html#removals),使用 [`getfixturevalue`](https://docs.pytest.org/ en/6.2.x/reference.html#pytest.FixtureRequest.getfixturevalue) 代替。 (2认同)