Visual Studio 2010には、多数の単体テストがあります。テストリストを使用して複数のテストを一度に実行すると、1つ以上のテストについて次のエラーが発生することがあります。
テストの実行中にエージェントプロセスが停止されました。
同じテストが失敗することはなく、テストを再度実行しようとしても成功します。
私はこれを見つけました 接続に関するバグレポート 、これは同じ問題のようですが、解決策を提供しません。
他の誰かがこの動作を見ましたか?どうすればそれを回避できますか?
私はまだこのバグを経験しているので、同僚の多くは同じソフトウェア/ハードウェア設定を使用しています。これまでに回答を評価しましたが、問題は解決しません。私はこの問題の解決策の恩恵を始めています。
私はちょうど同じような問題を経験しました:いくつかのテストは失敗し、テストの実行ごとに異なります。私はそれが起こる理由を正確には知りませんが、クラスの1つにファイナライザーを追加したときに発生し始めました。ファイナライザを無効にすると、問題はなくなります。ファイナライザをオンにすると、問題が再発します。
今、私はこれを克服する方法を知りません。
このメッセージは、 実行中のテストスレッドとは異なるスレッドでの例外。これまでの回答はすべて、この簡単な説明に要約されています。その場合、賢明な情報を表示しないことはVisual Studioの既知のバグです。
Visual Studioのテストランナーは、実行中のテストスレッド以外のスレッドが例外をスローすると完全に窒息します:飲み込まれ、出力がなく、インターセプトとデバッグの機会がなく、焼かれたくすぶりの混乱以外は何もありませんテスト。
私はこの問題を抱えていましたが、テストフレームワークが適切にキャッチしていないコードの問題であることがわかりました。少しの偶発的なリファクタリングにより、このコードが残されました。
public void GetThingy()
{
this.GetThingy();
}
これはもちろん無限の再帰であり、StackOverflowExceptionを引き起こしました(推測)。この原因は、「テストの実行中にエージェントプロセスが停止した」という恐ろしいことでした。
簡単なコード検査で問題が示され、テストは正常に実行されています。これがお役に立てば幸いです-コードを調べて問題を探す価値があるかもしれませんし、コンソールアプリに少し抽出して、そこで正しく動作することを確認するかもしれません。
テスト結果ファイル(/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>
これはどのテストがエラーを引き起こしたかについての情報を提供しませんでしたが、例外がどこにあったかを私に示しました。これは非常に役に立ちました。
通常、このメッセージはテストプロセスがクラッシュしたときに生成され、バックグラウンドスレッドで未処理の例外が発生した場合、スタックオーバーフローが発生した場合、またはProcess.GetCurrentProcess().Kill()
またはEnvironment.Exit
。別の考えられる原因は、アンマネージコードでのアクセス違反です。
誰も言及していないことは、イベントログに追加情報がある可能性があることです。通常、テストが結果でクラッシュした理由に関する多くの情報は得られませんが、バックグラウンドスレッドで未処理の例外が発生した場合、テストフレームワークはソースVSTTExecutionを使用してアプリケーションイベントログに詳細を書き込みます。イベントログに情報が書き込まれていない場合は、上記の他の原因の1つである可能性があります。
私は同じ問題に遭遇し、削除しながらそれを解決しました
Environment.Exit(0);
したがって、テストまたはテスト中のメソッドが実行中のプロセスを終了させている間にこのエラーが発生することはかなり確信しています。
質問を投稿していただきありがとうございます。私はちょうどこの問題に遭遇し、あなたが遭遇するかもしれない原因を見つけました。
非同期例外が発生した可能性があります
テストのセットアップ中に、スレッドプールのワーカースレッドをキューに入れるオブジェクトを作成します。デバッグを十分に速く実行すると、コードはパスします。
ワーカースレッドが開始され、テストのセットアップが完了する前にエラーが発生した場合、推論なしでAbortedの結果が表示されます。
ワーカースレッドが開始され、テストの開始後にエラーが発生した場合、次の結果が表示されます。エラー-テストの実行中にエージェントプロセスが停止しました。
重要な点:これは、いくつかのテストを通して使用するコンポーネントです。テストフレームワークでこれらのエラーが多すぎると、残りのテストが中止されます。
お役に立てれば
テストに関係するクラスで定義されたtry/catchブロックをデスクラクタ〜ClassName(){}に追加しました。これで問題は解決しました。
~MyClass()
{
try
{
// Some Code
}
catch (Exception e)
{
// Log the exception so it's not totally hidden
// Console.WriteLine(e.ToString());
}
}
私の場合、ソリューションはOutput Windowをチェックすることで解決されました。
「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、未処理の例外がキャッチされ、ワトソンを通じて報告:[例外メッセージ]
私の場合、別のスレッドでエラーをスローしていたFileSystemWatcherがありました。
例外がスローされた場所を見つけるには、[テスト結果]ウィンドウの感嘆符アイコンの横にあるハイパーリンク[テスト実行エラー]をクリックします。スタックトレースのウィンドウが開きます。
これはエラーを追跡するのに大いに役立ちます!
私は同じ問題を抱えていましたが、それはアンマネージリソース(何らかの理由で適切に破棄されなかったファイルライター)のファイナライザーが原因でした。
例外を飲み込むtry-catchでファイナライザコードをラップすると、問題はなくなりました。そのような例外を飲み込むことはお勧めしません。したがって、そもそも例外が発生している理由を見つけることは明らかに賢明でしょう。
私はこれを奇妙な機会に起こしており、犯人はほとんど常にスレッドであることが判明しています。
奇妙なことに、すべてのテストは開発マシンで正常に動作し、ビルドサーバーでランダムに失敗します。
綿密な検査で、テストは開発ボックスに合格したものとしてリストされていましたが、例外がスローされたことが判明しました。例外は別のスレッドでスローされていましたが、エラーとして検出されませんでした。
例外の詳細はテストトレースに対して記録されていたため、変更する必要があるコード/テストを特定できました。
これが誰かを助けることを願っています。
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
それは実際、クラスファイナライザから呼び出されたメソッド内のnull参照例外でした。
このエラーにはさまざまな原因があるため、このスレッドを完全にするために別のエラーを追加したいと思います。
all OPの説明に従ってテストが中止された場合、原因はプロジェクト構成の誤りである可能性があります。私の場合、ターゲットフレームワークは.NET Framework 3.5に設定されていました。プロジェクトのプロパティページ(タブアプリケーション)で上位バージョンに設定すると、問題が解決しました。
この問題は、TestClassのコンストラクターの例外またはStackoverflowによってトリガーされることもあります。
TestInitializeでテストが失敗し、別のプロジェクトのddlからコードを実行しているという同様の問題に遭遇しました。上記のエラーメッセージが表示され、テストをデバッグしようとすると、例外の詳細なしでテストが中止されます。
私の問題は、他のプロジェクトのdllがVisual Studio 2012プロジェクトのものであり、VS2010プロジェクトでテストを実行していること、および/または2つのプロジェクトのUnitTestFramwork dllバージョンが一致していないことです。
このエラーは、私にとってもファイナライザーが原因でした。
ファイナライザーは、実際にはモックアウトされていないDBコードを呼び出していました。それは私が書いたクラスではなく、それへの参照がかなりの数のクラスに深く埋もれていたので、それを見つけるのにしばらくかかりました。
私の場合、WCFサービスの単体テストがいくつかありました。このWCFサービスは2つのタイマーを起動していました。
これらのタイマーは副作用を引き起こしました。
->私はこれらのタイマーをデフォルトで無効にし、すべてがうまくいきました!
ところで:私は WCFMock を使用してWCFサービスを偽装しているので、WCFサービスの周りに「実際の」単体テストがあります