Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Py.test:大量测试导致内存使用过度_Python_Pytest - Fatal编程技术网

Python Py.test:大量测试导致内存使用过度

Python Py.test:大量测试导致内存使用过度,python,pytest,Python,Pytest,我使用py.test(Windows 7上的版本2.4)和xDIST来运行一个C++库的数值回归和接口测试,它通过C模块提供Python接口。 随着时间的推移,测试的数量已经增加到2000个左右,但是我们现在遇到了一些内存问题。无论是否使用xdist,运行测试的python进程的内存使用似乎在不断增加 在单进程模式下,我们甚至看到了一些错误分配的问题,而在xdist中,总内存使用量可能会导致操作系统停机(8个进程,每个进程最后使用>1GB) 这是预期的行为吗?或者其他人在使用py.test进行大

我使用py.test(Windows 7上的版本2.4)和xDIST来运行一个C++库的数值回归和接口测试,它通过C模块提供Python接口。 随着时间的推移,测试的数量已经增加到2000个左右,但是我们现在遇到了一些内存问题。无论是否使用xdist,运行测试的python进程的内存使用似乎在不断增加

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

这是预期的行为吗?或者其他人在使用py.test进行大量测试时也遇到了同样的问题?在拆卸(类)中,我可以做些什么来减少内存的使用


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

py.test的内存使用将随着测试数量的增加而增加。每个测试在执行之前都会被收集,对于每个测试运行,测试报告都存储在内存中,对于失败,内存会大得多,因此所有信息都可以在最后报告。因此,在某种程度上,这是意料之中的,也是正常的

然而,我没有确切的数字,也从未对此进行过仔细调查。我们之前确实在一些CI主机上耗尽了内存,但只是给了它们更多的内存来解决问题,而不是进行调查。目前,我们的CI主机有2G的mem,在一次测试运行中运行大约3500个测试,它可能可以运行其中的一半,但可能需要更多的交换。Pypy也是一个能够使用py.test运行大型测试套件的项目,所以这当然是可能的


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

我们也遇到了类似的问题。在我们的例子中,我们运行了大约4600个测试用例。
我们广泛使用pytest装置,并通过稍微不同地确定装置的范围(从“session”到“function”的“class”确定多个装置的范围),设法节省了少量的MB。然而,我们的测试性能有所下降。

在任何测试类/案例实例上是否存储了状态/数据?你能试着找到一个练习“增长”内存行为的小例子吗?问题确实是setUpClass方法中测试类上存储的数据。在tearDownClass方法中使用几个self.x=None类型语句解决了这个问题。感谢您为我指出了正确的方向py.test中还有一个问题导致了这一点:你们中有人在测试运行中收集JUnit XML报告吗?它将所有测试细节都保存在内存中,直到最后将其写下来。。。