如何在pytest中实现多fixture间接参数化且不增加测试场景
在Pytest中实现单参数驱动多Fixture的间接参数化
完全可行,但你提供的代码写法存在问题,indirect参数的作用是指定哪些参数需要被当作Fixture间接解析,而非传入Fixture名称。以下是两种符合需求的实现方式:
方式一:显式使用间接参数化
步骤1:定义接受参数的Fixture
每个Fixture通过request.param获取传入的键,返回对应字典值:
import pytest @pytest.fixture def fixture_1(request): data = {"testp1": "fixture1_testp1_val", "testp2": "fixture1_testp2_val"} return data[request.param] @pytest.fixture def fixture_2(request): data = {"testp1": "fixture2_testp1_val", "testp2": "fixture2_testp2_val"} return data[request.param] @pytest.fixture def fixture_3(request): data = {"testp1": "fixture3_testp1_val", "testp2": "fixture3_testp2_val"} return data[request.param]
步骤2:编写参数化测试
将三个Fixture作为参数传递,每组测试参数重复三次(确保所有Fixture使用同一个测试键),并指定indirect=True表示所有参数需间接传给对应Fixture:
@pytest.mark.parametrize( "fixture_1, fixture_2, fixture_3", [("testp1", "testp1", "testp1"), ("testp2", "testp2", "testp2")], indirect=True ) def test_multi_fixture_single_param(fixture_1, fixture_2, fixture_3): # 测试逻辑示例 assert fixture_1.endswith("testp1_val") or fixture_1.endswith("testp2_val") assert fixture_2.endswith("testp1_val") or fixture_2.endswith("testp2_val") assert fixture_3.endswith("testp1_val") or fixture_3.endswith("testp2_val")
运行后会生成2个测试场景,分别对应testp1和testp2,每个场景下三个Fixture都会使用同一个测试键获取值。
方式二:共享参数Fixture(更简洁)
如果觉得重复写测试键冗余,可以定义一个共享参数Fixture,让三个业务Fixture依赖它:
import pytest @pytest.fixture(params=["testp1", "testp2"]) def shared_test_param(request): return request.param @pytest.fixture def fixture_1(shared_test_param): data = {"testp1": "fixture1_testp1_val", "testp2": "fixture1_testp2_val"} return data[shared_test_param] @pytest.fixture def fixture_2(shared_test_param): data = {"testp1": "fixture2_testp1_val", "testp2": "fixture2_testp2_val"} return data[shared_test_param] @pytest.fixture def fixture_3(shared_test_param): data = {"testp1": "fixture3_testp1_val", "testp2": "fixture3_testp2_val"} return data[shared_test_param] def test_shared_param(fixture_1, fixture_2, fixture_3): # 测试逻辑示例 assert "testp1_val" in fixture_1 or "testp2_val" in fixture_1 assert "testp1_val" in fixture_2 or "testp2_val" in fixture_2 assert "testp1_val" in fixture_3 or "testp2_val" in fixture_3
这种方式下,Pytest会自动为shared_test_param的每个参数生成测试场景,三个业务Fixture会自动使用当前场景的测试键,同样满足仅运行2个测试场景的需求。
内容的提问来源于stack exchange,提问作者HexBlunder
相关产品推荐
相关产品推荐

