为什么Pytest在不同测试用例之间存在状态留存问题?
问题原因
你遇到的状态残留问题和pytest无关,是Python类属性和实例属性的使用错误导致的:
当前你在Dictionary类下直接定义的root = Word("")属于类属性,该属性属于Dictionary类本身,所有由这个类创建的实例都会共用同一个root对象。前面的测试用例调用insert方法修改了root.right的值后,后续所有新建的Dictionary实例访问到的都是被修改过的同一个root,所以才会出现新实例的root.right已经是test的情况。
修复方案
你只需要把root的定义移到Dictionary类的构造方法__init__中,让每个实例创建时都生成自己独立的root对象即可,修改后的Dictionary类代码如下:
#!/usr/bin/env python class Word: def __init__(self, val: str, left=None, right=None): self.val = val self.left = left self.right = right def __repr__(self): return self.val class Dictionary: def __init__(self): # 每个实例单独初始化自己的root,属于实例属性,实例之间互不影响 self.root = Word("") def is_empty(self): return self.root.right is None def insert(self, val: str) -> None: print("here") new_node = Word(val) if self.root.right is None: self.root.right = new_node else: self.root.right.right = new_node return new_node
修改完成后重新运行测试,每个测试用例新建的Dictionary实例都会有自己独立的初始root对象,不会再出现之前测试状态残留的问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

