VS 2010 Test Runner错误“测试运行时代理进程已停止。”

时间:2010-05-11 10:53:11

标签: visual-studio-2010 visual-studio unit-testing mstest

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

  

代理程序进程停止了   测试正在进行中。

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

我发现这个bug report on Connect,这似乎是同样的问题,但它没有提供解决方案。

还有其他人看过这种行为吗?我怎么能避免呢?

修改

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

19 个答案:

答案 0 :(得分:84)

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

如果执行测试线程以外的线程抛出异常,Visual Studio的测试运行程序会完全窒息:它被吞没并且没有输出,没有机会拦截和调试,除了被烧毁的闷烧混乱之外什么也没有是你的单元测试。

答案 1 :(得分:41)

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

现在我不知道如何克服这个问题。

答案 2 :(得分:16)

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

public void GetThingy()
{
    this.GetThingy();
}

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

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

答案 3 :(得分: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>

这并未提供有关哪个测试导致错误的任何信息,但它确实显示了异常的位置,这非常有用。

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

我遇到了同样的问题并在删除时解决了

Environment.Exit(0);

所以我很确定,当您的测试或测试方法导致执行进程终止时,会发生此错误。

答案 6 :(得分:2)

感谢您发布问题。我刚遇到这个问题并找出了你可能遇到的原因。

  

异步异常可能有   发生

在我的测试设置期间,我创建了一个对象,该对象将线程池中的工作线程排队。如果我运行调试足够快,我的代码就会通过。

如果工作线程开始并且在测试设置完成之前出错,那么我得到了没有任何推理的Aborted结果。

如果工作线程开始并且在测试开始后出现错误,那么我得到一个结果:错误 - 在测试运行时代理进程已停止。

需要注意的重要事项:这是我在几个测试中使用的组件。如果测试框架遇到太多这些错误,则会中止其余的测试。

希望这有帮助

答案 7 :(得分:2)

在我的情况下,通过检查输出窗口来解决问题。

  

'QTAgent32.exe'(托管   (v4.0.30319)):已加载   “C:\ TestResults \ bdewey_XXXXXX072   2011-01-11   17_00_40 \输出\ MyCode.dll”,   符号已加载。 E,9024,9,   2011/01 / 17,17:00:46.827,   XXXXX072 \ QTAgent32.exe,未处理   异常捕获,报告通过   沃森:[例外消息]

在我的情况下,我有一个FileSystemWatcher在一个单独的线程上抛出错误。

答案 8 :(得分:2)

要找出引发异常的位置,请单击超链接&#34;测试运行错误&#34;在“测试结果”窗口中的感叹号图标旁边。打开带有堆栈跟踪的窗口。

这有助于追踪错误!

答案 9 :(得分:2)

我将try / catch块添加到我的测试中涉及的任何类中定义的descructor~ClassName(){}中。这解决了我的问题。

~MyClass()
{
    try
    {
        // Some Code
    }
    catch (Exception e)
    {
        // Log the exception so it's not totally hidden
        // Console.WriteLine(e.ToString());
    }
}

答案 10 :(得分:1)

我遇到了同样的问题,它是由非托管资源的终结器引起的(文件编写器由于某种原因没有正确处理)。

将终结器代码包装在吞下异常的try-catch中后,问题就消失了。我不建议吞下这样的例外情况,所以显然首先要找出异常发生的原因是明智的。

答案 11 :(得分:1)

我在奇怪的场合发生过这种情况,而罪魁祸首几乎总是被线程化。

奇怪的是,所有测试都可以在开发机器上正常运行,然后在构建服务器上随机失败。

仔细观察后发现虽然测试列表是在开发框中列出的,但也有异常被抛出。异常被抛在一个单独的线程上,并没有被误认为是错误。

针对测试跟踪记录了异常详细信息,因此我们能够确定需要修改的代码/测试。

希望这有助于某人。

答案 12 :(得分:0)

对于遇到这个旧问题并想从线程中抛出什么的人,这里有个提示。使用Task.Run(而不是Thread.Start)可以更可靠地报告子线程异常。简而言之,代替这个:

Thread t = new Thread(FunctionThatThrows);
t.Start();
t.Join();

执行此操作:

Task t = Task.Run(() => FunctionThatThrows());
t.Wait();

错误日志应该更加有用。

答案 13 :(得分:0)

通过查看 Windows事件查看器中的 Windows日志> 应用程序日志条目,我能够确定导致问题的原因。在测试炸毁时查找条目。我有一个类似于以下内容的 Error 条目:

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

在类终结器调用的方法中,这确实是一个空引用异常。

答案 14 :(得分:0)

由于此错误可能有许多不同的原因,我想为此线程的完整性添加另一个错误。

如果 all 您的测试正在按OP所述中止,则原因可能是错误的项目配置。在我的例子中,目标框架设置为.NET Framework 3.5。通过项目属性页面(选项卡应用程序)将其设置为更高版本解决了该问题。

答案 15 :(得分:0)

问题也可以由TestClass的构造函数中的异常或Stackoverflow触发。

答案 16 :(得分:0)

我遇到了类似的问题,其中测试在TestInitialize中失败,并且还从我的另一个项目中运行来自ddl的代码。我得到了如上所述的错误消息,如果我尝试调试测试,测试就会中止,没有任何异常细节。

我怀疑问题可能是我的其他项目中的dll来自Visual Studio 2012项目而我正在VS2010项目中运行我的测试,和/或可能来自2个项目的UnitTestFramwork dll版本不匹配

答案 17 :(得分:0)

此错误也是由我为Finalizer引起的。
Finalizer正在调用一些没有被嘲笑的数据库代码。花了一段时间才找到它,因为它不是我写的一个类,并且对它的引用深深埋没了几个类。

答案 18 :(得分:0)

在我的情况下,我有一些WCF服务的单元测试。这个WCF服务启动了2个计时器 那些计时器造成了副作用   - &GT;我默认禁用这些计时器,一切都很好!

顺便说一句:我使用WCFMock伪造WCF服务,所以我围绕我的WCF服务进行了“真正的”单元测试