python - 测试 : excessive memory usage with large number of tests

标签 python pytest

我将 py.test(2.4 版,在 Windows 7 上)与 xdist 结合使用,为通过 C 模块提供 Python 接口(interface)的 C++ 库运行大量数值回归和接口(interface)测试。

随着时间的推移,测试数量已增加到约 2,000 个,但我们现在遇到了一些内存问题。无论是否使用 xdist,运行测试的 python 进程的内存使用量似乎都在不断增加。

在单进程模式下,我们甚至看到了一些严重的分配错误问题,而使用 xdist 时,总内存使用量可能会导致操作系统崩溃(8 个进程,每个进程最后使用 >1GB)。

这是预期的行为吗?或者其他人在使用 py.test 进行大量测试时是否遇到过同样的问题?我可以在 tearDown(Class) 中做些什么来随着时间的推移减少内存使用量吗?

目前我不能排除问题存在于 C/C++ 代码内部某处的可能性,但是当通过 py.test 之外的 Python 接口(interface)使用该代码运行一些长时间运行的程序时,我确实看到了相对恒定的内存随着时间的推移使用。当使用 nose 而不是 py.test 时,我也没有看到任何过多的内存使用(我们使用 py.test 因为我们需要 junit-xml 报告来处理多个进程)

最佳答案

py.test的内存占用会随着测试次数的增加而增长。每个测试在执行之前都会被收集起来,并且对于每个测试运行,都会将测试报告存储在内存中,如果出现故障,内存会大得多,因此所有信息都可以在最后报告。因此,在某种程度上,这是意料之中的,也是正常的。

但是我没有确切的数字,也从未仔细调查过这个问题。我们之前确实在一些 CI 主机上用完了内存,但只是给了他们更多的内存来解决它而不是调查。目前我们的 CI 主机有 2G 的内存,并在一次测试运行中运行大约 3500 个测试,它可能会在一半的情况下工作,但可能涉及更多的交换。 Pypy 也是一个设法使用 py.test 运行大型测试套件的项目,因此这当然是可能的。

如果您怀疑 C 代码泄漏内存,我建议构建一个(小的)测试脚本,它只测试扩展模块 API(有或没有 py.test)并在无限循环中调用它,同时在每次循环后收集内存统计信息.几次循环后,内存不应再增加。

关于python - 测试 : excessive memory usage with large number of tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20900380/

相关文章:

python - Python if 语句中赋值

python - @gen.coroutine 未在带有 Tornado 的 python 中定义

python - 当一个测试用例针对多个环境运行时,我们如何使其仅针对一个环境 xfail?

python - 为什么我的测试通过时却出现了相互矛盾的断言?

Python - 数字旋转

python - 如何使用 tokenize 注释器和 pycorenlp(Stanford CoreNLP 的 Python 包装器)执行文本的单词标记,而不使用 ssplit?

Python socket.close() 在脚本退出之前不起作用

ruby - Rspec 限制方法的重用

python - 属性错误 : 'ExceptionInfo' object has no attribute 'traceback' when using pytest to assert exceptions

python - 如何在日志上使用 freezegun