带参数的 pytest 夹具

Vin*_*nce 3 python fixtures pytest

似乎可以将参数传递给装置:

将参数传递给固定功能

然而,在实现这个最小的示例时,我收到一个错误。

import pytest

@pytest.fixture
def my_fixture(v):
    print("fixture in")
    yield v+1
    print("fixture out")

@pytest.mark.parametrize("my_fixture",[1], indirect=True)
def test_myfixture(my_fixture):
    print(my_fixture)
Run Code Online (Sandbox Code Playgroud)

@pytest.fixture def my_fixture(v):未找到 E 固定装置“v”

上面的代码有什么问题吗?

(python 3.8.10,pytest-6.2.5)

Kal*_*ert 7

简要阐述 Vince 的答案:一般来说,灯具函数的参数被解释为在定义灯具之前加载的其他灯具的名称。这就是为什么您收到错误消息fixture 'v' not found: pytest 认为您想要my_fixture依赖另一个名为v但不存在的固定装置。

这个request论证是这个一般规则的一个例外。它不涉及另一个固定装置。相反,它指示 pytest 为固定装置提供对对象的访问权限request,该对象包含有关当前正在运行的测试的信息,例如正在测试哪些参数(通过request.param)、测试具有哪些标记(通过request.node.get_closest_marker())等。

因此,要利用间接参数化,您的装置需要 (i) 接受参数request并 (ii) 对 执行某些操作request.param。有关更多信息,请参阅文档中的相关页面:


Vin*_*nce 5

这有效:

@pytest.fixture
def my_fixture(request):
    print("fixture in")
    yield request.param+1 # difference here !
    print("fixture out")

@pytest.mark.parametrize("my_fixture",[1], indirect=True)
def test_myfixture(my_fixture):
    print(my_fixture)


Run Code Online (Sandbox Code Playgroud)