如何在pytest parametrize中正确传入并获取fixture?
解决pytest parametrize中正确传入fixture并获取返回值的问题
问题根源
- 直接传入fixture函数对象时,pytest会将函数的字符串表示(如
<function text at 0x160acb280>)当作fixture名称查找,导致找不到对应fixture。 - 传入fixture名称字符串但参数名与fixture名冲突时,parametrize的参数值会覆盖fixture的自动注入,导致测试函数中拿到的是字符串而非fixture返回值。
两种可行解决方法
方法一:修改参数名避免冲突
将parametrize中的参数名改为非fixture名称,传入fixture的名称字符串,再通过request.getfixturevalue()获取fixture返回值:
@pytest.fixture def text(): return "My fixture text for testing.\n" @pytest.mark.parametrize( ("some_boolean_param", "fixture_name"), [ (True, "text"), (False, "text"), ], ) def test_my_function(some_boolean_param, fixture_name, request): fixture_text = request.getfixturevalue(fixture_name) # 此时fixture_text为fixture返回的"My fixture text for testing.\n"
方法二:使用pytest-lazy-fixture插件直接注入
- 先安装插件:
pip install pytest-lazy-fixture
- 在parametrize中使用
pytest.lazy_fixture("fixture_name")传入fixture,测试函数的参数会直接拿到fixture返回值,无需手动调用request:
import pytest @pytest.fixture def text(): return "My fixture text for testing.\n" @pytest.mark.parametrize( ("some_boolean_param", "text"), [ (True, pytest.lazy_fixture("text")), (False, pytest.lazy_fixture("text")), ], ) def test_my_function(some_boolean_param, text): # 这里text直接是fixture的返回值
内容的提问来源于stack exchange,提问作者Nat G
相关产品推荐
相关产品推荐

