单元测试的临时对象池?

2024-05-17 02:54:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个复杂的项目运行一个大型单元测试库。 这个项目有一些不适合大量测试的东西:

  1. 使对象在测试之间不被释放的缓存(记忆化)
  2. 模块级的单例复杂对象,在使用时可能会收集数据

我对每个测试(或者至少每个测试套件)都有自己的“python对象池”并且能够在测试之后释放它感兴趣。你知道吗

类似于python垃圾收集器问题的解决方法。你知道吗

我想象一个python自包含的临时可丢弃的解释器,可以在我调用免费翻译()“确保不会泄漏。你知道吗

对于这一点,我发现一个困难的解决方案是每次我需要一个运行测试的可消耗的解释器时,都使用Nose或通过子进程实现它。因此,每个测试都会变成“fork\u and\u run(conditions)”,并且不会泄漏原始进程中的内存。你知道吗

也看到了鼻子每个测试一个进程,并运行测试顺序-虽然人们提到它有时冻结中途-少乐趣。。你知道吗

有更简单的解决办法吗?你知道吗

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

p.p.S.公司 我们的PROD代码还为每项工作创建了一个新的流程,这是非常舒服的,因为我们不必纠结于“永远生存”和其他可怕的故事。你知道吗


Tags: 模块数据项目对象记忆内存代码套件
1条回答
网友
1楼 · 发布于 2024-05-17 02:54:05

TL;博士 我尝试的模块重新加载技巧在本地工作,在使用不同python版本的机器上使用时失败。。。(?!) 你知道吗

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

首先我写了一个循环系统模块dict并重新加载(循环两次)我的代码的所有模块。这是一个惊人的工作-所有引用都被正确地释放了,但它似乎不能用于生产/严肃的代码中,原因有很多:

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

相关问题 更多 >