VS 2010テストランナーエラー「テストの実行中にエージェントプロセスが停止しました。」


101

Visual Studio 2010には、いくつかの単体テストがあります。テストリストを使用して一度に複数のテストを実行すると、1つ以上のテストで次のエラーが表示されることがあります。

テストの実行中にエージェントプロセスが停止しました。

同じテストが失敗することは決してありません。もう一度テストを実行しようとすると、成功します。

Connectでこのバグレポートを見つけました。これは同じ問題のようですが、解決策はありません。

他の誰かがこの動作を見ましたか?どうすれば回避できますか?

編集する

私はまだこのバグを経験しており、同じソフトウェア/ハードウェアのセットアップで私の同僚の多くもそうです。これまでに回答を評価しましたが、問題は解決しません。私はこの問題の解決策の賞金を始めています。


私は同じものを手に入れています。私はそれを掘り下げていますが、これまでのところ解決策はありません
マーク

これに関するニュースは?同じ問題がここにある...
Peter Gfader、

@ピーター、受け入れられた答えの下の私のコメントを参照してください。それが私の解決策でしたが、あなたの問題が類似しているかどうかはわかりません。
driis

キャッチされなかった例外を除いて、同じ動作をしました。ビルドサーバーでVisual Studioを実行してAssert-Windowを取得すると、例外が表示されました。アサートウィンドウのため、テストを続行できませんでした。

回答:


41

私はちょうど同じような問題を経験しました:一部のテストは失敗し、テスト実行ごとに異なります。その理由は正確にはわかりませんが、クラスの1つにファイナライザーを追加したときに発生し始めました。ファイナライザを無効にすると、問題が解決します。ファイナライザをオンにすると、問題が再発します。

現在、私はこれを克服する方法を知りません。


16
ありがとう-この答えは私を解決に導きます。私はいくつかのタイプのファイナライザーを持っているだけで、確かに、それらを削除すると問題も解決しました。さらに調査したところ、1つのファイナライザに微妙なバグが見つかりました。これは、コンストラクタで例外がスローされたときにのみ発生し、ファイナライザは完全に構築されていないオブジェクトをファイナライズしようとします。結論:型のファイナライザーで例外が発生し、そのファイナライザーがすべてのテストが完了する前に実行される場合、Visual Studioは私が直面していたエラーを表示します。これ以上の説明なしで、ランダムテストについて。
driis

6
私のコードにはファイナライザ/デストラクタがありません...〜MyClass()で同じエラーが発生します。Resharperを使用したテストの実行はすべて環境に
優しい

6
ファイナライザでキャッチされない例外の問題は、バックグラウンドタスクでキャッチされない例外の特別なケースであり、テストによって(おそらく暗黙的に)開始またはスケジュールでき、テストが完了した場合でも実行を継続できます。
satorg、

1
ピーターと同じように、Resharperテストランナーは私にすべての緑を与えます。VS 2010テストランナーがデストラクタのあるクラスで失敗します。
RyBolt

1
Dispose()メソッドで無限再帰ループを誤ってコーディングしてしまったため、これも発生しました。
ロバート

88

このメッセージは、実行中のテストスレッドとは異なるスレッドの例外によって発生します。これまでのすべての答えは、この単純な説明に要約されます。その場合、実用的な情報を表示しないことはVisual Studioの既知のバグです。

Visual Studioのテストランナーは、実行中のテストスレッド以外のスレッドが例外をスローした場合、完全にチョークします:飲み込まれ、出力がなく、インターセプトおよびデバッグする機会がなく、ユニットと想定されていた焼失したくすぶっている混乱以外は何もありません。テスト。


私にも同じことが起こりました-私のテストは別のスレッドを生成していましたが、例外が発生していました。スレッド内で例外をキャッチすると、少なくともそれを印刷して、何が起こっているのかを知ることができます。ただし、Assert.Fail()をスレッドのキャッチブロックに配置しないように注意してください。これにより、別の例外が発生し、開始した場所に戻ります。
カイル・クルル

4
そんなに難しいのJavaに比べてC#で追跡するためですスタックオーバーフローを除き、私にとっては同じこと、...
ジョン・ガードナー

実際、Threadオブジェクトの使用を開始し、Abort()を呼び出してそれらを停止したときに、これが発生していることに気付きました。
espaciomore 2016年

1
これasync voidは、テスト中に呼び出されたメソッドが例外をスローした場合にも発生します
Mathias Becher

1
trxにエラー情報が含まれている可能性があることに注意してください。テキストエディターで開くか、Visual Studioで開いて、[ テスト結果]ウィンドウの[ テスト実行エラー]ハイパーリンクをクリックすると表示できます。
Ohad Schneider

16

私はこの問題を抱えていましたが、テストフレームワークが適切にキャッチしなかった私のコードの問題であることがわかりました。少し偶発的なリファクタリングにより、次のコードが残りました。

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

これはもちろん無限の再帰であり、StackOverflowExceptionを引き起こしました(おそらく)。これが引き起こしたのは恐ろしいことでした:「テストの実行中にエージェントプロセスが停止しました。」

簡単なコードインスペクションで問題が明らかになり、テストが正常に実行されます。これが役立つことを願っています-問題を探すためにコードを検査するか、コンソールアプリに少し抽出し、そこで正しく動作することを確認する価値があるかもしれません。


3
これは問題ではありません(毎回失敗するテストは異なるため、わかっています)が、回答に時間を割いていただきありがとうございます。
driis

6
これはこの問題に対する多くの有効な回答の1つであるため、+ 1。私のクラスの1つのsstaticメソッドでSO例外が発生したため、この問題が発生しました。
ピーターT.ラコームJr.

6
+1、これも見ました。テストをデバッグすると(VS 11の場合)、問題がすぐに見つかります。
ジェレミー・マギー

ジェレミーに同意します。単体テストをデバッグすると、例外がスローされた場所で停止するはずです。ただし、単体テストを実行しただけでは、すべてが緑色に点灯します。非常に奇妙です。
Andrew Stephens、

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>

これはエラーの原因となったテストに関する情報を提供しませんでしたが、例外がどこにあるかを示してくれたので、とても役に立ちました。


5

このメッセージは、テストプロセスがクラッシュしたときに典型的に生成され、スタックオーバーフローが発生したバックグラウンドスレッド、上の未処理の例外がある場合に発生する可能性があり、または明示的なコールProcess.GetCurrentProcess().Kill()またはEnvironment.Exit。別の考えられる原因は、アンマネージコードでのアクセス違反です。

誰も言及していないことは、イベントログに追加情報がある可能性があることです。通常、テストが結果でクラッシュした理由に関する多くの情報は得られませんが、バックグラウンドスレッドで未処理の例外が発生した場合、テストフレームワークは、ソースVSTTExecutionを使用してアプリケーションイベントログに詳細を書き込みます。イベントログに情報が書き込まれていない場合は、上記の他の原因の可能性があります。


4

私の場合、出力ウィンドウを確認することで解決策が解決されました。

'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がありました。


どのように解決しましたか?FileSystemWatcherをサービスにラップし、その周りにWFワークフローを作成するM $のサンプルコードを使用しています。私はこれらの多くを取得しています...
ekkis

私の場合、2つのテストが失敗しました。[ 出力]ペインに移動して[ テスト]を選択すると、「バックグラウンドスレッドの1つが例外をスローしました」と表示されていました...実際、9つのNullReferenceExceptionsがスタックトレースで待機していました。ありがとう、これはとても役に立ちました!
Qwertie

3

削除中に同じ問題が発生し、解決しました

Environment.Exit(0);

そのため、このエラーは、テストまたはテスト中のメソッドが実行中のプロセスを終了させて​​いるときに発生することは間違いありません。


2

質問を投稿していただきありがとうございます。私はこの問題に遭遇し、あなたが遭遇しているかもしれない原因を見つけ出しました。

非同期例外が発生した可能性があります

テストのセットアップ中に、スレッドプールのワーカースレッドをキューに入れるオブジェクトを作成します。デバッグを十分に速く実行すると、コードがパスします。

ワーカースレッドが開始し、テストセットアップが完了する前にエラーが発生した場合、理由なしにAbortedの結果が返されます。

テストの開始後にワーカースレッドが開始し、エラーが発生した場合、次の結果が返されます。エラー-テストの実行中にエージェントプロセスが停止しました。

注意すべき重要な点:これは、いくつかのテストで使用しているコンポーネントです。テストフレームワークでこれらのエラーが多すぎると、残りのテストが中止されます。

お役に立てれば


答えてくれてありがとう。非同期の例外が、私が見ているものと似たようなものを引き起こす可能性があることは承知していますが、そうではないことはほぼ確実です。コードはWebアプリ用であり、非同期で何も行いません。また、失敗したテストはランダムであるようです。
driis

2

私のテストに関係するクラスで定義されたデスクラスタ〜ClassName(){}にtry / catchブロックを追加しました。これで問題が解決しました。

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

2

例外がスローされた場所を見つけるには、[テスト結果]ウィンドウの感嘆符アイコンの横にあるハイパーリンク[テスト実行エラー]をクリックします。スタックトレースのウィンドウが開きます。

これはエラーを追跡するのに大いに役立ちます!


1

私は同じ問題を抱えていましたが、それはアンマネージリソースのファイナライザー(何らかの理由で適切に破棄されなかったファイルライター)によって引き起こされました。

ファイナライザコードを、例外を飲み込むtry-catchでラップした後、問題は解消しました。このような例外を飲み込むことはお勧めしません。例外が最初に発生している理由を明らかにすることは明らかに賢明でしょう。


1

私は奇妙な機会にこれを経験しました、そして犯人はほとんどいつもスレッディングであることがわかります。

奇妙なことに、すべてのテストが開発マシンで正常に機能し、ビルドサーバーでランダムに失敗します。

よく調べてみると、テストは開発ボックスに合格したものとしてリストされていましたが、例外がスローされていました。例外は、エラーとして取得されなかった別のスレッドでスローされていました。

例外の詳細がテストトレースに対してログに記録されていたため、変更が必要なコード/テストを特定できました。

これが誰かを助けることを願っています。


0

私の場合、WCFサービスのユニットテストをいくつか行いました。このWCFサービスは2つのタイマーを開始していました。
これらのタイマーは副作用を引き起こしました。
->これらのタイマーはデフォルトで無効にしており、すべて問題ありません。

ところで、私はWCFMockを使用してWCFサービスを偽造しているので、自分のWCFサービスに関する「実際の」ユニットテストがあります。


0

このエラーは、ファイナライザが原因でも発生しました。
ファイナライザは、モックアウトされていないDBコードを実際に呼び出していました。それが私が書いたクラスではなかったので、それを見つけるのにしばらく時間がかかりました、そして、それへの参照はかなりの数のクラスに埋められました。


0

TestInitializeでテストが失敗し、別のプロジェクトのddlからコードを実行しているという同様の問題に遭遇しました。上記のエラーメッセージが表示され、テストをデバッグしようとすると、例外の詳細なしでテストが中止されます。

問題は、他のプロジェクトのdllがVisual Studio 2012プロジェクトのものであり、VS2010プロジェクトでテストを実行していること、または2つのプロジェクトのUnitTestFramwork dllバージョンが一致していないことであると考えられます。



0

このエラーにはさまざまな原因が考えられるため、このスレッドを完全にするために、別のエラーを追加したいと思います。

場合は、すべての OPによって記載されているように、あなたのテストが中止され、原因は間違ったプロジェクト構成であるかもしれません。私の場合、ターゲットフレームワークは.NET Framework 3.5に設定されていました。プロジェクトのプロパティページ([ アプリケーション ]タブ)で上位バージョンに設定すると、問題が解決しました。


0

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

これは確かに、クラスファイナライザから呼び出されたメソッド内のnull参照例外でした。


0

この古い質問に遭遇し、自分のスレッドから何がスローされているのかと思っている人のために、ここにヒントがあります。(たとえば、Thread.Startとは対照的に)Task.Runを使用すると、子スレッドの例外がより確実に報告されます。要するに、これの代わりに:

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

これを行う:

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

そして、あなたのエラーログははるかに役立つはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.