VS 2010 Test Runner 错误“测试运行时代理进程已停止。”
Posted
技术标签:
【中文标题】VS 2010 Test Runner 错误“测试运行时代理进程已停止。”【英文标题】:VS 2010 Test Runner error "The agent process was stopped while the test was running." 【发布时间】:2011-02-18 02:17:49 【问题描述】:在 Visual Studio 2010 中,我有许多单元测试。当我使用测试列表一次运行多个测试时,有时我会针对一项或多项测试收到以下错误:
代理进程在 测试正在运行。
失败的不是同一个测试,如果我再次尝试运行测试,它就会成功。
我发现了这个bug report on Connect,这似乎是同样的问题,但它没有提供解决方案。
有没有其他人看到过这种行为?我该如何避免呢?
编辑
我仍然遇到这个错误,我的许多同事也在使用相同的软件/硬件设置。到目前为止,我已经评估了答案,但它们并没有解决问题。我开始悬赏解决这个问题。
【问题讨论】:
我得到了同样的结果。我正在研究它,但到目前为止还没有解决方案 有这方面的消息吗?同样的问题... @Peter,请参阅我在接受答案下方的评论。这是我的解决方案,但我不知道你的问题是否类似。 我的行为与未捕获的异常相同。当我在构建服务器上运行 Visual Studio 并获得一个 Assert-Window 时,我可以看到异常。由于断言窗口,测试无法继续。 【参考方案1】:此消息是由与正在执行的测试线程不同的线程上的异常引起的。到目前为止,所有答案都归结为这个简单的解释。在这种情况下,不显示任何有意义的信息是 Visual Studio 中的一个已知错误。
如果执行测试线程以外的线程抛出异常,Visual Studio 的测试运行程序会完全窒息:它被吞没,没有输出,没有机会拦截和调试,除了本应烧毁的闷烧的烂摊子外什么都没有做你的单元测试。
【讨论】:
同样的事情也发生在我身上——我的测试产生了一个单独的线程,它出现了异常。在线程中捕获异常至少可以让我打印它并知道发生了什么。但是请注意不要将 Assert.Fail() 放在线程的 catch 块中 - 这会引发一个单独的异常,让您回到开始的位置。 对我来说也是一样,除了堆栈溢出,与 java 相比,在 C# 中更难追踪... 确实,当我开始使用 Thread 对象并调用 Abort() 来阻止它们时,我注意到发生了这种情况。 当测试期间调用的async void
方法抛出异常时也会发生这种情况
请注意,trx 可能包含错误信息,您可以通过在文本编辑器中打开它或在 Visual Studio 中单击 Test run error 超链接来查看它测试结果窗口。【参考方案2】:
我刚刚遇到了类似的问题:一些测试失败,并且在不同的测试运行中它们是不同的。我不知道它发生的确切原因,但是当我向我的一个类添加终结器时它开始发生。当我禁用终结器时 - 问题消失了。当我打开终结器时 - 问题又回来了。
现在我不知道如何克服这个问题。
【讨论】:
谢谢 - 这个答案让我找到了解决方案。我只有几种类型的终结器,果然,删除它们也解决了问题。经过进一步调查,我在一个终结器中发现了一个微妙的错误,该错误仅在构造函数中引发异常并且终结器尝试终结未完全构造的对象时发生。结论:如果一个类型的终结器中发生异常,并且终结器在所有测试完成之前运行,Visual Studio 将给出我所面临的错误;没有任何进一步的解释,并且在随机测试中。 我的代码中没有终结器/析构函数... ~MyClass() 并得到相同的错误。使用 Resharper 运行测试都是绿色的 终结器中未捕获异常的问题是后台任务中未捕获异常的一种特殊情况,可以通过某些测试启动或调度(可能是隐式),即使测试已经完成也可以继续执行。 和 Peter 一样,Resharper 测试运行器给了我所有的绿色。 VS 2010 测试运行器在带有析构函数的类上失败。 我不小心在我的 Dispose() 方法中编写了一个无限递归循环,这也是造成这种情况的原因。【参考方案3】:我遇到了这个问题,结果证明这是我的代码中的一个问题,测试框架没有正确捕获。一些意外的重构让我得到了这段代码:
public void GetThingy()
this.GetThingy();
这当然是一个无限递归,并导致了 ***Exception(我猜)。这导致了可怕的:“代理进程在测试运行时停止。”
快速的代码检查向我展示了问题,我的测试现在运行良好。希望这会有所帮助 - 可能值得检查代码以查找问题,或者可能将一些内容提取到控制台应用程序中并检查它在那里是否正常工作。
【讨论】:
这不是问题(我知道,因为每次失败都是不同的测试),但感谢您抽出宝贵时间回答。 +1,因为这是此问题的许多有效答案之一。我的一个类的 sstatic 方法中的 SO 异常导致了这个问题。 +1,我也见过这个。调试测试(在 VS 11 中)很快就发现了问题。 同意杰里米。如果您调试单元测试,那么它应该在抛出异常的地方停止。但是,如果您只是运行单元测试,它们都会亮起绿灯。很奇怪。【参考方案4】:我能够通过查看测试结果文件 (/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>
这并没有提供任何关于是什么测试导致错误的信息,但它确实告诉我异常在哪里,这非常有用。
【讨论】:
【参考方案5】:此消息通常在测试进程崩溃时生成,并且可能在后台线程上出现未处理的异常、发生堆栈溢出或显式调用 Process.GetCurrentProcess().Kill()
或 Environment.Exit
时发生。另一个可能的原因是非托管代码中的访问冲突。
没有人提到的是事件日志中可能有其他信息。通常你不会在结果中获得太多关于测试为什么会崩溃的信息,但是如果在后台线程上发生未处理的异常,那么测试框架会使用源 VSTTExecution 将详细信息写入应用程序事件日志。如果没有信息写入事件日志,则可能是上面列出的其他原因之一。
【讨论】:
【参考方案6】:我遇到了同样的问题并在删除时解决了它
Environment.Exit(0);
所以我很确定,当您的测试或被测方法导致执行进程终止时,会发生此错误。
【讨论】:
【参考方案7】:在我的情况下,解决方案是通过检查输出窗口解决的。
'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, XXXX072\QTAgent32.exe,未处理 异常捕获,通过报告 Watson:[异常消息]
在我的例子中,我有一个 FileSystemWatcher,它在单独的线程上抛出了一个错误。
【讨论】:
你是怎么解决的?我正在使用 M$ 中的一些示例代码,它将 FileSystemWatcher 包装在服务中并围绕它创建 WF 工作流。我得到了很多这些...... 就我而言,两个测试失败了。当我转到 Output 窗格并选择 Tests 时,它提到“一个后台线程抛出异常”......事实上,9 NullReferenceExceptions 正在等待我的堆栈痕迹。谢谢,这很有帮助!【参考方案8】:感谢您发布问题。我刚刚遇到了这个问题,并找出了您可能遇到的原因。
异步异常可能有 发生了
在我的测试设置过程中,我创建了一个对象,该对象在线程池中对工作线程进行排队。如果我足够快地完成调试,我的代码就会通过。
如果工作线程在测试设置完成之前启动并出现错误,那么我会得到 Aborted with no reasoning 的结果。
如果工作线程在测试开始后启动并出现错误,那么我会得到以下结果:错误 - 测试运行时代理进程已停止。
重要提示:这是我在多个测试中使用的组件。如果测试框架遇到太多此类错误,则会中止其余测试。
希望对你有帮助
【讨论】:
感谢您的回答。我知道异步异常可能会导致类似于我所看到的情况,但我几乎可以肯定情况并非如此。代码用于 Web 应用程序,我们不会异步执行任何操作。此外,似乎哪个测试失败是随机的。【参考方案9】:我将 try/catch 块添加到在我的测试中涉及的任何类中定义的析构函数 ~ClassName() 中。这解决了我的问题。
~MyClass()
try
// Some Code
catch (Exception e)
// Log the exception so it's not totally hidden
// Console.WriteLine(e.ToString());
【讨论】:
【参考方案10】:要找出引发异常的位置,请单击“测试结果”窗口中感叹号图标旁边的超链接“测试运行错误”。一个带有堆栈跟踪的窗口被打开。
这对追查错误很有帮助!
【讨论】:
【参考方案11】:我遇到了同样的问题,它是由非托管资源的终结器(由于某种原因没有正确处理的文件写入器)引起的。
在将终结器代码包装在一个可以吞下异常的 try-catch 中后,问题就消失了。我不建议吞下这样的异常,因此首先找出异常发生的原因显然是明智之举。
【讨论】:
【参考方案12】:我偶尔会遇到这种情况,而罪魁祸首几乎总是被证明是线程。
奇怪的是,所有测试都可以在开发机器上正常运行,然后在构建服务器上随机失败。
仔细检查后发现,虽然测试在开发盒上被列为通过,但还是抛出了异常。异常被抛出在一个单独的线程上,该线程没有作为错误被拾取。
根据测试跟踪记录异常详细信息,因此我们能够确定需要修改哪些代码/测试。
希望这对某人有所帮助。
【讨论】:
【参考方案13】:就我而言,我对 WCF 服务进行了一些单元测试。此 WCF 服务正在启动 2 个计时器。 这些计时器会产生副作用。 --> 我默认禁用这些计时器,一切都很好!
顺便说一句:我使用 WCFMock 来伪造 WCF 服务,所以我围绕我的 WCF 服务进行了“真正的”单元测试
【讨论】:
【参考方案14】:这个错误也是由我的终结器引起的。 终结器实际上调用了一些没有被模拟出来的数据库代码。我花了一些时间才找到它,因为它不是我写的类,而且对它的引用被埋没了好几类。
【讨论】:
【参考方案15】:我遇到了类似的问题,其中测试在 TestInitialize 中失败,并且还在运行来自我另一个项目的 ddl 的代码。我收到如上所述的错误消息,如果我尝试调试测试,测试只是中止,没有任何异常详细信息。
我怀疑问题可能是我的其他项目中的 dll 来自 Visual Studio 2012 项目并且我正在 VS2010 项目中运行我的测试,和/或可能来自 2 个项目的 UnitTestFramwork dll 版本不匹配.
【讨论】:
【参考方案16】:该问题也可能由 TestClass 的构造函数中的异常或 *** 触发。
【讨论】:
【参考方案17】:由于此错误可能有许多不同的原因,我想添加另一个以确保此线程的完整性。
如果所有您的测试按照 OP 的描述中止,原因可能是项目配置错误。在我的例子中,目标框架设置为 .NET Framework 3.5。通过项目属性页面(标签 Application)将其设置为更高版本解决了该问题。
【讨论】:
【参考方案18】:我能够通过查看 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
这确实是从类终结器调用的方法中的空引用异常。
【讨论】:
【参考方案19】:对于遇到这个老问题并想知道从他们的线程中抛出什么的任何人,这里有一个提示。使用 Task.Run(与 Thread.Start 相反)将更可靠地报告子线程异常。简而言之,而不是这样:
Thread t = new Thread(FunctionThatThrows);
t.Start();
t.Join();
这样做:
Task t = Task.Run(() => FunctionThatThrows());
t.Wait();
而且你的错误日志应该会更有用。
【讨论】:
以上是关于VS 2010 Test Runner 错误“测试运行时代理进程已停止。”的主要内容,如果未能解决你的问题,请参考以下文章
为什么在NUnit Android Test Runner中Asserts等于0(零)?
实现一个BOOST_TEST test_runner,用于从不同的共享库中运行多个测试。
如何在Visual Studio Test Runner中排除某些测试?