如何将参数化test_conf传入包含setup/teardown的Pytest fixture
实现方案
你可以通过Pytest内置的requestfixture获取当前测试用例的参数化值,不需要大幅调整现有代码,以下是两种常用实现方式:
方式1:最小改动,直接读取测试用例入参(推荐)
你已经给测试函数通过@pytest.mark.parametrize传入了test_conf参数,只需要修改fixture1的定义,直接从测试上下文读取该参数即可:
import pytest # 你的fixture1修改后代码 @pytest.fixture def fixture1(request): # 从当前测试用例的入参中获取对应的test_conf配置,若读取失败可替换为 request.getfixturevalue("test_conf") current_test_conf = request.funcargs["test_conf"] # 这里写你的setup逻辑,可以直接用current_test_conf print(f"初始化配置:{current_test_conf}") # 可按需返回初始化结果给测试函数使用 yield current_test_conf # 这里写你的teardown逻辑 print(f"清理配置:{current_test_conf}") # 你原有的参数化和测试函数代码完全不用修改 @pytest.mark.parametrize("test_conf", conf_files()) def test_performance_scenario_1(fixture1, test_conf): # 你的测试逻辑,可直接使用fixture1返回的初始化结果和test_conf pass
注意:fixture1必须保持默认的
function级别作用域,更高的作用域(如class/module/session)初始化时测试用例参数尚未绑定,无法读取到test_conf的值。
方式2:通过indirect参数绑定fixture和参数化列表
如果你希望参数化值直接注入fixture,不需要在测试函数中重复声明,可使用@pytest.mark.parametrize的indirect参数:
import pytest @pytest.fixture def fixture1(request): # 直接通过request.param拿到参数化列表的对应值 current_test_conf = request.param # setup逻辑 yield current_test_conf # teardown逻辑 # 把fixture1作为参数化的第一个参数,指定indirect=True即可把配置列表传递给fixture @pytest.mark.parametrize("fixture1", conf_files(), indirect=True) def test_performance_scenario_1(fixture1): # 测试函数直接用fixture1返回的配置/初始化结果即可 pass
如果你的测试函数同时需要单独拿到test_conf变量,可调整参数化写法:
@pytest.mark.parametrize("fixture1, test_conf", [(c, c) for c in conf_files()], indirect=["fixture1"]) def test_performance_scenario_1(fixture1, test_conf): # 两个参数都可以正常使用 pass
内容的提问来源于stack exchange,提问作者Jeffrey S.
相关产品推荐
相关产品推荐

