Pytest:如何将预期值映射到带params参数的fixture实例
解决Pytest中Fixture参数与预期值一一对应的问题
核心问题分析
你之前的尝试生成4个测试用例,是因为dummy_generator fixture的2个参数和parametrize的2个预期值触发了笛卡尔积组合,导致所有可能的配对都被执行。要实现一一对应,需要把输入参数和预期值绑定成一组,避免交叉组合。
方案1:直接绑定参数与预期值(适合简单预期)
把stop值和对应的预期列表配对成元组,作为fixture的params,这样每个元组对应一组测试场景,只会生成2个测试用例:
class TestGenerator: @pytest.fixture(params=[(3, [0, 1, 2]), (4, [0, 1, 2, 3])]) def generator_with_expected(self, request): stop_val, expected_list = request.param # 返回生成器实例和对应的预期值 return SomeGenerator(stop_val), expected_list def test_generator_output(self, generator_with_expected): generator, expected = generator_with_expected assert list(generator) == expected
方案2:预期值单独用Fixture维护(适合冗长/复杂预期)
如果预期数据量大、结构复杂,可以把每个预期值单独写成fixture,再在主fixture里将输入参数和预期fixture绑定,既保持代码整洁,又能实现一一对应:
class TestGenerator: # 单独定义预期值fixture,可在这里处理冗长数据(比如从文件加载、预处理) @pytest.fixture def expected_for_stop_3(self): return [0, 1, 2] @pytest.fixture def expected_for_stop_4(self): return [0, 1, 2, 3] # params里存储(stop值,对应预期fixture的名称) @pytest.fixture(params=[(3, "expected_for_stop_3"), (4, "expected_for_stop_4")]) def generator_and_expected(self, request): stop_val, expected_fixture_name = request.param generator = SomeGenerator(stop_val) # 通过request.getfixturevalue获取指定fixture的内容 expected = request.getfixturevalue(expected_fixture_name) return generator, expected def test_generator_output(self, generator_and_expected): generator, expected = generator_and_expected assert list(generator) == expected
方案3:用Parametrize+Indirect实现配对(进阶用法)
也可以通过parametrize的indirect参数,将输入参数传递给fixture,同时绑定预期值:
class TestGenerator: @pytest.fixture def generator(self, request): # 接收parametrize传递的stop值 return SomeGenerator(request.param) @pytest.fixture def expected_3(self): return [0, 1, 2] @pytest.fixture def expected_4(self): return [0, 1, 2, 3] # indirect=["generator"]表示将stop值传递给generator fixture @pytest.mark.parametrize("generator, expected_fixture", [ (3, "expected_3"), (4, "expected_4") ], indirect=["generator"]) def test_generator_output(self, generator, expected_fixture, request): expected = request.getfixturevalue(expected_fixture) assert list(generator) == expected
这三种方案都能保证每个生成器实例对应唯一的预期值,只会生成2个测试用例,同时满足你对冗长预期值的维护需求。
内容的提问来源于stack exchange,提问作者SHaringT
相关产品推荐
相关产品推荐

