问题:
最近我开始在我的一个项目中面临一个问题,该项目包含大约650个单元测试。
当我立刻运行所有这些时,接近单元测试运行结束时的一些测试开始失败,使用System.OutOfMemoryException
。
当我再次重新运行失败的测试时,它们会通过。
分析:
我在运行测试时查看了任务管理器,看到vstest.executionengine.x86.exe
总是增加,直到它达到1330 MB的内存。然后测试开始因内存不足异常而失败。
当然我确定我的一些类可能有内存泄漏,但我测试的类中有90%没有可能导致内存泄漏的代码。
我的许多测试类都没有任何TestInitialize
或TestCleanup
方法,因为我的类的创建是直接在TestMethod
测试中完成的,因为那些被测试的类没有实现IDiposable
(因为没有可能导致泄漏的代码) 。
问题:
现在我不确定我可能做错了什么。但我想知道即使在测试类的所有测试都运行后,测试对象如何保留在内存中?
有没有人经历过这个或者可以指出我应该/可以做些什么来解决或找到问题?
谢谢!
从测试项目中引用dotMemory Unit框架,并将以下代码添加到OOM发生之前(或接近OOM的某个地方)最后运行的测试中。
dotMemoryApi.GetSnapshot();
dotMemoryApi.SaveCollectedData();
然后使用dotMemory探查器打开此快照,看看是什么浪费了内存。另外看看大对象堆,它可能会出现碎片问题。
我们遇到了类似的问题:结果是,当我们使用TFS和Visual Studio测试代理部署和运行功能测试任务在CI服务器上运行测试时,构建是通过Release(而不是Debug)完成的,testrunner似乎没有收集每次测试后的记忆。我们在testcleanup上添加了手动清理和手动GC收集,而不是内存不足异常~1.5GB内存使用量,我们现在保持300MB内存使用率。