You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:39:04