Python 单元测试的临时对象池?

Python 单元测试的临时对象池?,python,unit-testing,memory-management,garbage-collection,virtualization,Python,Unit Testing,Memory Management,Garbage Collection,Virtualization,我正在为一个复杂的项目运行一个大型单元测试存储库。 此项目存在一些无法在大量测试中发挥作用的问题: 导致在测试之间不释放对象的缓存(内存化) 模块级的复杂对象是单例对象,在使用时可能会收集数据 我对每个测试(或至少每个测试套件)都有自己的“python对象池”并能够在测试后释放它感兴趣 有点像python垃圾收集器问题的解决方法 我想象一个python自包含的临时可丢弃解释器,它可以为我运行某些代码,然后我可以调用“interpreter.free()”并确保它不会泄漏 对于这一点,我发现一个困

我正在为一个复杂的项目运行一个大型单元测试存储库。 此项目存在一些无法在大量测试中发挥作用的问题:

  • 导致在测试之间不释放对象的缓存(内存化)
  • 模块级的复杂对象是单例对象,在使用时可能会收集数据
  • 我对每个测试(或至少每个测试套件)都有自己的“python对象池”并能够在测试后释放它感兴趣

    有点像python垃圾收集器问题的解决方法

    我想象一个python自包含的临时可丢弃解释器,它可以为我运行某些代码,然后我可以调用“interpreter.free()”并确保它不会泄漏

    对于这一点,我发现一个困难的解决方案是每次我需要一个运行测试的一次性解释器时,使用Nose或通过子流程实现它。因此,每个测试都成为“fork_和_run(conditions)”,并且在原始过程中不泄漏内存

    每次测试都只看到一个过程,然后依次运行测试——尽管人们提到它有时会中途冻结——没有那么有趣

    有更简单的解决方案吗

    附言。 我不想浏览大量其他人的代码,并试图使他们所有的缓存/对象/项目都是完全可以清理的内存管理对象

    p.p.S 我们的产品代码还为每项工作创建了一个新的流程,这是非常舒适的,因为我们不必纠结于“永远生存”和其他可怕的故事;博士 我尝试的模块重新加载技巧在本地工作,在使用不同python版本的机器上使用时失败。。。(?!)

    我最终获取了我在代码中编写的所有缓存,并将它们添加到全局缓存列表中,然后在测试之间清除它们。 可悲的是,如果有人使用缓存/手动缓存机制而忽略了这一点,测试将再次开始在内存中增长

    首先,我编写了一个循环,遍历sys.modules dict并重新加载(循环两次)代码的所有模块。这工作起来令人惊讶——所有引用都被正确地释放了,但由于多种原因,它似乎无法在生产/严肃代码中使用:

  • 旧的python版本在重新加载时会中断,并且继承元类的类会被重新定义(我仍然不知道这是如何中断的)
  • 单元测试在重新加载后仍然有效,有时会有旧类的坏实例,特别是当类使用另一个类实例时。想想super(class_name,self),其中self是以前定义的类,而class_name是重新定义的同名类