为何pytest.fixture未为每个测试创建新对象?如何确保实例隔离?
问题原因与解决方法
你的问题不是pytest没生成新实例,而是Foo类的x是类属性,所有实例共享同一个列表。
看你的代码,x = []定义在Foo类的顶层,属于类属性——不管创建多少个Foo实例,它们的x指向的都是同一个列表对象。所以test_1里给foo.x添加元素后,test_2里的新Foo实例访问的还是这个被修改过的列表。
解决方法:把x改成实例属性
在Foo类的__init__方法里初始化x,让每个实例拥有独立的列表:
import pytest class Foo: def __init__(self): self.x = [] # 改为实例属性,每个实例初始化时都会创建新列表 @pytest.fixture(scope="function") def foo(): foo = Foo() return foo def test_1(foo): foo.x.append(1) assert foo.x == [1] def test_2(foo): assert len(foo.x) == 0
修改后,每个Foo实例都会拥有自己的x列表,pytest每次调用fixture生成新实例时,x都是空列表,两个测试就不会互相干扰了。
内容的提问来源于stack exchange,提问作者d3nigma
相关产品推荐
相关产品推荐

