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 ...
假设我有以下代码:
@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 ...