VS 2010 Test Runner错误"测试运行时代理进程已停止."

dri*_*iis 99 unit-testing mstest visual-studio-2010 visual-studio

在Visual Studio 2010中,我有许多单元测试.当我使用测试列表一次运行多个测试时,我有时会在一个或多个测试中发现以下错误:

在测试运行时,代理程序进程已停止.

从来没有相同的测试失败,如果我再次尝试运行测试,它就会成功.

在Connect上发现了这个错误报告,这似乎是同样的问题,但它没有提供解决方案.

有没有人见过这种行为?我怎么能避免呢?

编辑

我仍然遇到这个错误,我的许多同事也在使用相同的软件/硬件设置.到目前为止,我已经评估了答案,但他们没有解决问题.我正在为这个问题找到解决方案.

maf*_*afu 87

此消息是由与执行测试线程不同的线程上异常引起的.到目前为止,所有答案归结为这个简单的解释.Visual Studio中的一个已知错误是在这种情况下不显示任何合理的信息.

如果执行测试线程之外的线程抛出异常,Visual Studio的测试运行器会完全窒息:它被吞没并且没有输出,没有机会进行拦截和调试,除了被烧毁的闷烧混乱之外什么都不应该是你的单位测试.

  • 对我来说同样的事情,除了堆栈溢出,与Java相比,它在C#中难以追踪... (4认同)

sat*_*org 41

我刚刚经历过类似的问题:一些测试失败,并且它们在不同的测试运行中有所不同.我不确切地知道它发生的原因,但是当我在我的一个类中添加一个终结器时,它就开始出现了.当我禁用终结器时 - 问题就消失了.当我打开终结器时 - 问题又回来了.

现在我不知道如何克服这一点.

  • 谢谢 - 这个答案引导我找到解决方案.我只有几种类型的终结器,果然,删除它们也消除了问题.经过进一步调查,我在一个终结器中发现了一个微妙的错误,只有在构造函数中抛出异常时才会发生错误,并且终结器会尝试完成一个未完全构造的对象.结论:如果在类型的终结器中发生异常,并且终结器在所有测试完成之前运行,Visual Studio将给出我面临的错误; 没有任何进一步的解释,并在随机测试. (16认同)
  • 我的代码中没有终结器/析构函数... ~MyClass()并得到相同的错误.使用Resharper运行测试都是绿色的 (6认同)
  • 终结器中未捕获异常的问题是后台任务中未捕获异常的特殊情况,可以通过某些测试启动或调度(可能是隐式),即使测试已完成也可以继续执行. (6认同)

Sim*_*ele 16

我遇到了这个问题,结果证明我的代码中的一个问题是测试框架无法正常捕获.一点意外的重构给我留下了这段代码:

public void GetThingy()
{
    this.GetThingy();
}
Run Code Online (Sandbox Code Playgroud)

这当然是无限递归,并导致StackOverflowException(我猜).这引起了可怕的:"代理程序在测试运行时停止了."

快速代码检查向我展示了问题,我的测试现在运行正常.希望这有帮助 - 可能值得检查代码寻找问题,或者可能在控制台应用程序中提取一些并检查它是否正常工作.

  • +1,因为这是此问题的许多有效答案之一.我的一个类的sstatic方法中的SO异常导致了这个问题. (6认同)
  • +1,我也见过这个.调试测试(在VS 11中)很快发现问题. (6认同)
  • 这不是问题(我知道因为它是不同的测试,每次失败),但感谢您抽出时间回答. (3认同)

Den*_*ore 8

通过查看测试结果文件(/TestResults/*.trx),我能够找到问题的根源.它提供了后台线程中发生的异常的完整详细信息,并且一旦我解决了该异常,停了......"错误消失了.

在我的情况下,我无意中在我的单元测试中启动了GUI,最终导致抛出System.ComponentModel.InvalidAsynchronousStateException.

所以我的.trx文件包含:

   <RunInfo computerName="DT-1202" outcome="Error" timestamp="2013-07-29T13:52:11.2647907-04:00">
    <Text>One of the background threads threw exception: 
System.ComponentModel.InvalidAsynchronousStateException: An error occurred invoking the method.  The destination thread no longer exists.
at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
...
</Text>
  </RunInfo>
Run Code Online (Sandbox Code Playgroud)

这没有提供关于什么测试导致错误的任何信息,但它确实显示了异常的位置,这非常有用.


Mik*_*ray 5

此消息通常在测试进程崩溃时生成,并且可能在后台线程发生未处理的异常,发生堆栈溢出或显式调用Process.GetCurrentProcess().Kill()或发生时发生Environment.Exit.另一个可能的原因是非托管代码中的访问冲突.

没有人提到过的事情是事件日志中可能还有其他信息.通常,您不会获得有关测试在结果中崩溃的原因的大量信息,但是如果后台线程上出现未处理的异常,则测试框架会将详细信息写入具有源VSTTExecution的应用程序事件日志.如果没有信息写入事件日志,则可能是上面列出的其他原因之一.