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

在 VisualStudio2010中,我有许多单元测试。当我使用测试列表一次运行多个测试时,对于一个或多个测试,有时会出现以下错误:

代理进程在 测试正在进行。

同一个测试从来不会失败,如果我再次尝试运行该测试,它就会成功。

我发现这个 关于连接的错误报告,这似乎是相同的问题,但它不提供一个解决方案。

有人见过这种行为吗? 我怎样才能避免呢?

剪辑

我仍然在经历这个 bug,我的许多同事在相同的软件/硬件设置上也是如此。到目前为止,我已经评估了答案,但是它们并没有解决问题。我开始悬赏寻找解决这个问题的办法。

34097 次浏览

Thanks for posting the question. I just ran into this problem and figured out a cause that you may be running into.

An asynchronous exception may have occurred

During my test setup, I create an object that queues a worker thread in the thread pool. If I run through debugging fast enough my code passes.

If the worker thread kicks off and has an error BEFORE the test setup completes, then I get a result of Aborted with no reasoning.

If the worker thread kicks off and has an error AFTER the test has begun, then I get a result of : Error - The agent process was stopped while the test was running.

Important to note: this is a component that I use throughout several of my tests. If the test framework encounters too many of these errors it aborts the rest of the tests.

Hope this helps

I was having this problem, and it turned out to be a problem in my code which the Test Framework wasn't catching properly. A little accidental refactoring had left me with this code:

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

This is of course an infinite recursion, and caused a StackOverflowException (I guess). What this caused was the dreaded: "The agent process was stopped while the test was running."

A quick code inspection showed me the problem, and my tests are now running fine. Hope this helps - might be worth inspecting the code looking for issues, or maybe extracting a bit into a console app and checking it works properly there.

I've just experienced the similar problem: some tests fail and they are different in different test runs. I don't know exactly the reason why it happens, but it began to occur when I added a finalizer to one of my classes. When I disable the finalizer - the problem disappears. When I turn the finalizer on - the problem comes back.

Right now I don't know how to overcome this.

In my case I had some unit-tests for a WCF-service. This WCF service was starting up 2 timers.
Those timers caused side effects.
--> I disable these timers by default and everything is fine!

BTW: I use WCFMock to fake the WCF service, so I have "real" unit tests around my WCF service

This message is caused by an exception on a thread different from the executing test thread. All answers so far boil down to this simple explanation. It is a known bug in Visual Studio not to display any sensible information in that case.

Visual Studio’s test runner totally chokes if a thread other than the executing test thread throws an exception: It gets swallowed and there’s no output, no chance to intercept and debug and no nothing except a burned-down smoldering mess that was supposed to be your unit test.

I encountered the same Problem and solved it while Removing

Environment.Exit(0);

So i am pretty sure, that this error occurs while your test or method under test, is causing the executing process to terminate.

In my case the solution was resolved by checking the Output Window.

'QTAgent32.exe' (Managed (v4.0.30319)): Loaded 'C:\TestResults\bdewey_XXXXXX072 2011-01-11 17_00_40\Out\MyCode.dll', Symbols loaded. E, 9024, 9, 2011/01/11, 17:00:46.827, XXXXX072\QTAgent32.exe, Unhandled Exception Caught, reporting through Watson: [Exception message]

In my case I had a FileSystemWatcher that was throwing an error on a seperate thread.

I had the same problem and it was caused by a finalizer for an unmanaged resource (a file writer that was not getting disposed properly for some reason).

After wrapping the finalizer code in a try-catch that swallows the exception, the problem disappeared. I don't recommend swallowing exceptions like that, so it would obviously be wise to find out why the exception is occurring in the first place.

I have had this happening on the odd occasion, and the culprit almost always turns out to be threading.

Strangely enough all the tests would work fine on the development machines, then randomly fail on the build servers.

On closer inspection it turned out that although the tests were being listed as passed on the dev boxes, there were exceptions being thrown. The exceptions were being thrown on a seperate thread which didn't get picked up as an error.

The exception details were being logged against the test trace, so we were able to identify which code/tests needed to be modified.

Hope this helps someone.

This error was caused by a Finalizer for me as well.
The Finalizer was actaully calling some DB code which wasn't mocked out. Took me a while to find it as it wasn't a class I wrote and the reference to it was burred quite a few classes deep.

I have run into a similar problem where a test is failing in TestInitialize and is also running code from a ddl from another of my projects. I get the error message as described above and if I try to debug the test, the test is just aborted without any exception details.

I suspect that the problem may be that the dlls from my other project are from a Visual Studio 2012 project and I am running my tests in a VS2010 project, and/or possibly that the UnitTestFramwork dll versions from the 2 projects are mismatched.

This message is typically generated when the test process crashes and can happen when there is an unhandled exception on a background thread, a stack overflow occurs, or an explicit call to Process.GetCurrentProcess().Kill() or Environment.Exit. Another possible cause is an access violation in unmanaged code.

Something no one has mentioned is that there may be additional information in the event log. Usually you will not get much information on why the test crashed in the results, however in the event of an unhandled exception on a background thread, then the test framework writes details to the Application event log with source VSTTExecution. If there is no information written to the event log then it is likely one of the other causes listed above.

The problem can also be triggered by an Exception or Stackoverflow in Constructor of a TestClass.

I was able to find the source of my problem by looking in the test result file (/TestResults/*.trx) It provided the full details of the exception that occurred in the background thread, and once I resolved that exception the "agent processed stopped..." error went away.

In my case I was unintentionally launching the GUI in my unit test, which eventually caused a System.ComponentModel.InvalidAsynchronousStateException to be thrown.

So my .trx file contained:

   <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>

This didn't provide any information on what test caused the error, but it did show me where the exception was, which was very useful.

As this error can have many different causes, I'd like to add another one for completeness of this thread.

If all your tests are aborting as described by the OP, the cause might be a wrong project configuration. In my case the target framework was set to .NET Framework 3.5. Setting it to a higher version through the project properties page (tab Application) resolved the issue.

I added try/catch blocks to the descructor ~ClassName(){} that were defined in any class involved in my tests. This fixed the problem for me.

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

For finding out where the exception was thrown click on the hyperlink "Test Run Error" next to the exclamation icon in the Test Results window. A window with the stack trace is opened.

This helps a lot to track down the error!

I was able to determine what was causing my issue by looking in the Windows Logs > Application log entries within the Windows Event Viewer. Look for entries at the time the test bombed-out. I had an Error entry similar to below:

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

It was indeed a null reference exception within a method called from a class finalizer.

For anyone happening upon this old question and wondering what's being thrown from their thread(s), here's a tip. Using Task.Run (as opposed to, say, Thread.Start) will report child thread exceptions much more reliably. In short, instead of this:

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

Do this:

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

And your error logs should be much more useful.