Python3 unittest discover执行测试失败与垃圾回收问题咨询
问题根因
你遇到的问题和unittest垃圾回收机制无关,核心原因是你在ModelCreator中使用了类属性data:
- 类属性属于类本身,所有类实例共享,Python进程中同一个模块只会被导入一次,因此
unittest discover批量执行测试时,先执行的test_creator.py测试用例往类属性data中写入了数据,后执行的test_model.py初始化ModelCreator实例时,类属性data已经不是初始空值,因此get_data()不会触发预期的RuntimeError。 - 单独运行测试文件时,每个测试文件会启动独立Python进程,模块会被重新导入,类属性初始为空,因此用例可以正常通过。
解决方案
方案1:修改为实例属性(最推荐,从设计层面解决问题)
如果data不需要在多个ModelCreator实例间共享,直接把类属性改为实例属性即可,修改creator.py中的ModelCreator代码:
from model import Model class ModelCreator: # 移除原类属性定义 def __init__(self): self.data = [] # 改为实例属性,每个实例独立拥有data def add_data(self, dic): self.data.append(Model(**dic)) def get_data(self): if self.data: return self.data else: raise RuntimeError('No data found')
修改后无需调整测试代码,批量执行测试即可正常通过。
方案2:手动清理类属性(如果必须保留类属性设计)
如果业务逻辑需要data作为类属性跨实例共享,只需要在测试用例的tearDown方法中手动清空类属性即可:
在两个测试文件的tearDown方法中新增清空逻辑:
def tearDown(self): ModelCreator.data.clear() # 每次测试结束后清空类属性 return super().tearDown()
方案3:调整测试执行顺序(不推荐,仅临时应急使用)
如果不想修改现有代码,也可以通过指定测试执行顺序,让test_model.py先于test_creator.py执行,但这种方案稳定性差,后续新增测试用例仍可能出现相同问题。
内容的提问来源于stack exchange,提问作者Marco Milanesio
相关产品推荐
相关产品推荐

