如何在class级pytest fixture下隔离test_b与test_c测试用例
解决方案
要在保持fixture的class级作用域同时,让每个测试拿到初始状态的a_list快照,你可以通过分层fixture实现:用class级fixture存储原始数据,再用function级fixture每次返回原始数据的副本,这样既保留了class级fixture的特性,又能隔离测试间的状态影响。
具体代码修改如下:
import pytest @pytest.fixture(scope="class") def original_a_list(self): # 保持class级作用域,仅初始化一次原始数据 return ['a'] @pytest.fixture(scope="function") def a_list(original_a_list): # 每次测试返回原始列表的副本,实现状态隔离 return original_a_list.copy() # 或者用 original_a_list[:] 切片复制 def test_b(self, a_list): a_list.append('b') assert a_list == ['a','b'] def test_c(self, a_list): # 此时a_list是原始状态的副本,断言会通过 assert a_list == ['a']
原理说明
original_a_list作为class级fixture,只会在测试类初始化时创建一次,确保原始数据的一致性。a_list是function级fixture,每次测试执行前都会从original_a_list复制一份新的列表,所以test_b对列表的修改只会作用于自己的副本,不会影响test_c的初始状态。
如果你的列表包含嵌套的可变对象(比如列表里有字典),需要用copy.deepcopy()来实现深拷贝,避免嵌套对象的状态共享:
import copy @pytest.fixture(scope="function") def a_list(original_a_list): return copy.deepcopy(original_a_list)
内容的提问来源于stack exchange,提问作者Liuzhou Zhuo
相关产品推荐
相关产品推荐

