pytest类级参数化时connector fixture未按预期重建求助
解决pytest类参数化时Fixture未随参数重建的问题
问题场景
测试类通过@pytest.mark.parametrize('ports', [0, 2], scope="class")做类级参数化,期望每个ports实例对应一个全新的connector(TCP连接),但当前connector fixture为class scope,导致所有ports实例复用同一个连接实例。
核心原因
connector fixture未关联ports参数,且class scope的fixture默认仅在测试类初始化时创建一次,不会随类的参数化实例迭代重建。
解决方案
方法1:让connector fixture依赖测试类的ports参数
修改conftest.py中的connector fixture,使其依赖ports参数,并根据ports创建对应连接:
@pytest.fixture(scope="class") def connector(request, ports): # 根据当前ports创建对应TCP连接 tcp_client = create_tcp_connection(port=ports) # 替换为实际创建连接的逻辑 yield tcp_client # 清理连接 tcp_client.disconnect() tcp_client.destroy()
测试类保留原参数化配置即可:
@pytest.mark.parametrize('ports', [0, 2], scope="class") class TestDevice: # ... 原有测试方法不变
方法2:改用fixture参数化ports
如果更倾向于用fixture管理ports参数,可在conftest.py中定义参数化的ports fixture,同时让connector依赖它:
# conftest.py @pytest.fixture(params=[0, 2], scope='class') def ports(request): return request.param @pytest.fixture(scope="class") def connector(request, ports): tcp_client = create_tcp_connection(port=ports) yield tcp_client tcp_client.disconnect()
测试类无需再添加@pytest.mark.parametrize,直接在测试方法中使用ports fixture:
class TestDevice: device_info = load_device_info('device_model')['device'] def test_power_on(self, switcher, ports): # ... 测试逻辑 @pytest.mark.parametrize('inputs', device_info['inputs']) def test_init_inputs(self, inputs, connector, ports): # ... 测试逻辑 @pytest.mark.parametrize("samplerate", [samplerate for samplerate in SampleRate]) def test_run_device_tests(self, samplerate, ports): # ... 测试逻辑
原理说明
当fixture依赖参数化的fixture(或测试类的参数化参数)时,pytest会为每个参数组合生成独立的fixture实例。由于connector和ports的scope均为class,每个ports参数对应的测试类实例会触发创建一个专属的connector,实现参数化实例与fixture的一一对应。
内容的提问来源于stack exchange,提问作者Harvey Fretwell
相关产品推荐
相关产品推荐

