在Visual Studio 2010中,我有许多单元测试。当我使用测试列表一次运行多个测试时,我有时会在一个或多个测试中发现以下错误:
代理程序进程停止了 测试正在进行中。
从来没有相同的测试失败,如果我再次尝试运行测试,它就会成功。
我发现这个bug report on Connect,这似乎是同样的问题,但它没有提供解决方案。
还有其他人看过这种行为吗?我怎么能避免呢?
我仍然遇到这个错误,同样的软件/硬件设置的许多同事也是如此。到目前为止,我已经评估了答案,但他们没有解决问题。我正在为这个问题找到解决方案。
答案 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服务进行了“真正的”单元测试