在Visual Studio 2010中,我有许多单元测试。当我一次使用测试列表运行多个测试时,有时会针对一个或多个测试显示以下错误:
测试正在运行时,代理进程已停止。
决不会同一测试失败,如果我再次尝试运行测试,它将成功。
我在Connect上发现了此错误报告,这似乎是相同的问题,但没有提供解决方案。
有人看到过这种行为吗?我该如何避免呢?
编辑
我仍在遇到此错误,在相同软件/硬件设置下的许多同事也是如此。到目前为止,我已经评估了答案,但是并不能解决问题。我开始为解决这个问题提供悬赏。
在Visual Studio 2010中,我有许多单元测试。当我一次使用测试列表运行多个测试时,有时会针对一个或多个测试显示以下错误:
测试正在运行时,代理进程已停止。
决不会同一测试失败,如果我再次尝试运行测试,它将成功。
我在Connect上发现了此错误报告,这似乎是相同的问题,但没有提供解决方案。
有人看到过这种行为吗?我该如何避免呢?
我仍在遇到此错误,在相同软件/硬件设置下的许多同事也是如此。到目前为止,我已经评估了答案,但是并不能解决问题。我开始为解决这个问题提供悬赏。
Answers:
我刚刚遇到了类似的问题:有些测试失败,并且在不同的测试运行中它们是不同的。我不知道发生这种情况的确切原因,但是当我在一个类中添加了终结器时,它才开始发生。当我禁用终结器时,问题消失了。当我打开finalizer时,问题又回来了。
现在,我不知道该如何克服。
该消息是由与正在执行的测试线程不同的线程上的异常引起的。到目前为止,所有答案都归结为这个简单的解释。在这种情况下,Visual Studio中的一个已知错误是不显示任何明智的信息。
如果正在执行的测试线程以外的线程抛出异常,Visual Studio的测试运行程序将完全阻塞:它被吞没,没有输出,没有机会进行拦截和调试,除了被认为是您单位的烧毁的闷烧烂摊子之外,什么也没有测试。
async void在测试期间调用的方法引发异常时,也会发生这种情况
我遇到了这个问题,事实证明这是我的代码中的一个问题,测试框架无法正确捕获。偶然的重构让我留下了以下代码:
public void GetThingy()
{
this.GetThingy();
}
当然,这是无限递归,并导致了StackOverflowException(我想)。这是令人恐惧的:“测试运行时,代理进程已停止。”
快速代码检查向我显示了问题,现在我的测试运行良好。希望这会有所帮助-可能值得检查代码以查找问题,或者可以将一些内容提取到控制台应用程序中并检查其是否正常工作。
通过查看测试结果文件(/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>
它没有提供有关导致错误的测试的任何信息,但确实向我显示了异常在哪里,这非常有用。
就我而言,解决方案是通过检查“ 输出窗口”解决的。
'QTAgent32.exe'(托管(v4.0.30319)):已加载'C:\ TestResults \ bdewey_XXXXXX072 2011-01-11 17_00_40 \ Out \ MyCode.dll',已加载符号。E,9024,9,2011/01/11,17:00:46.827,XXXXX072 \ QTAgent32.exe,未处理的异常被捕获,通过Watson报告:[异常消息]
就我而言,我有一个FileSystemWatcher,它在一个单独的线程上引发了一个错误。
感谢您发布问题。我只是遇到了这个问题,并找出了您可能会遇到的原因。
可能发生了异步异常
在测试设置期间,我创建一个对象,该对象将线程池中的工作线程排队。如果我足够快地进行调试,那么我的代码就会通过。
如果工作线程启动并在测试设置完成之前出现错误,那么我将无故中止。
如果工作线程在测试开始后开始并且出现错误,那么我得到的结果是:错误-测试运行时代理进程已停止。
重要说明:这是我在多个测试中都使用的组件。如果测试框架遇到太多此类错误,它将中止其余测试。
希望这可以帮助
通过查看Windows事件查看器中的Windows日志 > 应用程序日志条目,我能够确定是什么导致了我的问题。在测试炸毁时查找条目。我有一个类似于以下内容的错误条目:
QTAgent32_40.exe, PID 10432, Thread 2) AgentProcess:CurrentDomain_UnhandledException: IsTerminating : System.NullReferenceException: Object reference not set to an instance of an object.
at XXX.YYY.ZZZ.cs:line 660
at XXX.YYY.AAA.Finalize() in C:\JenkinsSlave\workspace\XXX.YYY.AAA.cs:line 180
实际上,这是从类终结器调用的方法中的空引用异常。