更新 - 看起来Resharper运行测试可能会出现某种内存泄漏。不确定它是我的代码还是Resharper。有关如何诊断运行测试是否存在内存泄漏的任何建议?
我有两个C#测试项目,一个用于我的数据层,另一个用于我的webservice层,这更像是一个完整的集成测试。数据层项目的基本格式如下
10个测试类,每个测试一个我的存储库类
每个测试类都有它的类初始化,使用Entity Framework Code First删除和重新创建数据库,填充基本用户数据,创建表等。因此在整个数据层中执行10次测试项目运行。我知道DB非常重,但是在类之间保持测试数据隔离的最佳方法
每个测试类中的每个单元测试方法然后填充所需的其余数据,并在每个测试结束时删除数据。每次运行测试时都会导致大量重复数据加载/删除,但这是在每次测试开始时确保新数据的最简洁方法,或者我发现测试会相互干扰很多< / p>
Web服务层执行相同操作,但它会在每次测试之间删除并重新创建数据库。我无法回想起为什么我这样做,但肯定有一个原因。每个测试还创建一个WCF服务代理,以调用本地实例化的WCF客户端。
无论哪种方式,我都希望这不会导致任何未清理的资源,但我似乎在某处有内存泄漏。
昨天运行测试一天后,visual studio的内存使用量达到1Gb,而且我现在大部分时间都不得不重启一次,否则最终会变得太慢。
我还发现,如果我将数据和网络的整个测试套件(250次测试)一起运行,一旦进入最后的40-50次测试,测试全部失败
Unit Test Adapter threw exception:
Failed to write to an IPC Port: The pipe is being closed.
.
-- Exception doesn't have a stack trace --
此时我必须关闭Visual Studio并重新打开它。
所以有些奇怪的事情正在发生。任何人都可以建议我可以解决这个问题吗?我应该能够运行250次测试而不会从内存不足中掉落
更新:这是例外 - 可能与resharper有关吗?
(JetBrains.ReSharper.TaskRunner.CLR4.exe, PID 7744, Thread 14) UnitTestAdapter.Run: unexpected error: execution thread for test 'DeleteVenueMenuCalendarRecurringItem' got exception while run was being aborted: System.Runtime.Remoting.RemotingException: Failed to write to an IPC Port: The pipe is being closed.
Server stack trace:
at System.Runtime.Remoting.Channels.Ipc.IpcPort.Write(Byte[] data, Int32 offset, Int32 size)
at System.Runtime.Remoting.Channels.Ipc.PipeStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.Runtime.Remoting.Channels.ChunkedMemoryStream.WriteTo(Stream stream)
at System.Runtime.Remoting.Channels.StreamHelper.CopyStream(Stream source, Stream target)
at System.Runtime.Remoting.Channels.Ipc.IpcClientHandler.SendRequest(IMessage msg, ITransportHeaders headers, Stream contentStream)
at System.Runtime.Remoting.Channels.Ipc.IpcClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at JetBrains.ReSharper.TaskRunnerFramework.IRemoteTaskChannel.TaskOutput(String runId, RemoteTask remoteTask, String text, TaskOutputType outputType)
at JetBrains.ReSharper.TaskRunnerFramework.TaskRunnerProxy.TaskOutput(RemoteTask remoteTask, String text, TaskOutputType outputType)
at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
Exception rethrown at [1]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at JetBrains.ReSharper.TaskRunnerFramework.IRemoteTaskServer.TaskOutput(RemoteTask remoteTask, String text, TaskOutputType outputType)
at JetBrains.ReSharper.TaskRunnerFramework.ThreadProxyTaskServer.<>c__DisplayClass10.<TaskOutput>b__f()
at JetBrains.ReSharper.TaskRunnerFramework.ThreadProxyTaskServer.<>c__DisplayClass1c.<Execute>b__1b(Object state)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at JetBrains.ReSharper.TaskRunnerFramework.ThreadProxyTaskServer.Execute(ExecutionDelegate task)
at JetBrains.ReSharper.TaskRunnerFramework.ThreadProxyTaskServer.TaskOutput(RemoteTask remoteTask, String text, TaskOutputType outputType)
at JetBrains.ReSharper.TaskRunnerFramework.ClientControllerServerWrapper.TaskOutput(RemoteTask remoteTask, String text, TaskOutputType outputType)
at JetBrains.ReSharper.UnitTestRunner.MSTest.ResultSink.AddResult(TestMessage testMessage)
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter.Run(ITestElement testElement, ITestContext testContext, Boolean
答案 0 :(得分:0)
重建数据库有多重,你是怎么做到的?如果你总是将它创建为相同的stat,我建议使用另一种设置数据库的方法,你可以使用快照并在每次测试运行之前重置它。或者,您应该使测试能够独立于数据库的状态在数据库上运行。
为什么VS会崩溃? 我不知道。我不认为整形器工具有泄漏 - 但这只是猜测。在运行测试时,您是否总能得到相同的结果?你有没有在另一台机器上试过它?
对我而言,这听起来像是在运行集成测试而不是单元测试。因此,本地计算机上的VS可能不是正确的工具。我建议使用持续集成(CI)服务来解决它。