pytest 从函数范围夹具访问参数

pytest access parameters from function scope fixture

假设我有以下代码:

@pytest.mark.parametrize("argument", [1])
def test_func(self, function_context, argument)

而且我有以下功能范围夹具:

@pytest.fixture(scope='function')
def function_context(session_context):
    # .... do something ....

是否可以从 function_context 夹具中访问当前函数参数?

在我的例子中 - 我想从 function_context.

中获取在 parametrize 中传递的值 1

pytest 中的夹具在实际测试 运行 之前实例化,因此在夹具定义阶段应该无法访问测试函数参数。但是,我可以想到两种方法来绕过这个:

1。猴子补丁

您可以 monkeypatch 夹具,即根据使用该夹具的函数的参数临时更改其某些属性。例如:

@pytest.fixture(scope='function')
def function_context(session_context):
    # .... do something ....

@pytest.mark.parametrize("argument", [1])
def test_func(self, function_context, argument, monkeypatch):
    monkeypatch.setattr(function_context, "number", argument) # assuming you want to change the attribute "number" of the function context
    # .... do something ....

虽然你的 fixture 无论如何只对函数的范围有效,但是 monkeypatching 也只对单个 运行 测试有效。

2。参数化夹具而不是测试函数

或者,您也可以选择 parametrize the fixture 本身而不是 test_func。例如:

@pytest.fixture(scope='function', params=[0, 1])
def function_context(session_context, request):
    param = requests.param # now you can use param in the fixture
    # .... do something ...

def test_func(self, function_context):
    # .... do something ...