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