単体テストの実行中にエラーが発生しました。単体テストをデバッグすると、vstest.executionengine.x86.exeが実行され、テストに合格すると閉じます。
テストを実行するだけの場合(テストが単純に新しいリストを作成するだけで、アサーションがない場合でも)vstest.executionengine.x86.exeは閉じず、タスクマネージャーで実行されたままになります。
これは、ファイルの削除やsqlliteデータベースのクリーンアップを含む、より複雑なテストを作成する際に問題を引き起こしています。
任意の助けをいただければ幸いです。
編集:
再現する手順 :
これは仕様です。
Vstest.executionengine.exeは、2回の連続したテスト実行の間に構成の変更を検出した場合にのみ再起動されます。これにより、不必要にプロセスの再起動時にパフォーマンスが低下しないようになります。
製品の更新 VS2013では、テスト->テスト設定の下に「キープテスト実行エンジンの実行」という新しいメニュー項目があります。これをオフにして、デフォルトの動作をオプトアウトできます。
影響を受けるテストプロジェクトのビルド前イベントとして次を使用して、これを回避しました。
64ビットの場合:
taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"
または32ビットの場合:
taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"
これにより、テストプロジェクトをビルドする前に実行エンジンがサイレントに強制終了されます。 /FI "MEMUSAGE gt 1"
は、実行エンジンが実行されていない場合にコマンド(したがってビルド)が失敗するのを防ぎます。
その価値のために、私はこの同じ状況に出くわし、すべてのリソースを適切にクリーンアップしないテストがあったことが判明しました。私の特定のケースでは、テストが終了する前に閉じられなかったネットワーク接続が開いているバックグラウンドスレッドがありました。テストを終了してもこれが閉じられなかった理由はわかりませんが、開いたすべてのリソースを適切に破棄するようにコードを修正すると、すべてが期待どおりに機能しました。 vstest.executionengine.exe
を殺すためにハックを追加する必要も、Test -> Test Settings -> Keep Test Execution Engine Running
をオプトアウトする必要もありませんでした
Resharperのテストランナーを使用してテストを実行すると、Test-->Test Settings-->Keep Test Execution Engine Running
設定。私の場合、次のエラーでビルドが失敗していました:
警告MSB3026:「...\SQLite.Interop.dll」を「bin\Debug\x86\SQLite.Interop.dll」にコピーできませんでした。 1000msで10回の再試行を開始しています。プロセスは別のプロセスによって使用されているため、ファイル 'bin\Debug\x86\SQLite.Interop.dll'にアクセスできません。
@HappyCatが提案したように、テストプロジェクトにビルド前イベントを追加すると、私にとってはうまくいきました。また、ビルドサーバーで実行されて他のジョブに干渉するのを防ぐために、ifステートメントでラップする必要がありました。
if $(ConfigurationName) == Debug (
echo "attempting to kill vstest to prevent access denied on sqlite.interop.dll"
taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"
)
私はこれが古いことを知っていますが、私が発見したばかりのものを投入すると思いました。
実行中のテストには、IDisposable
を実装するオブジェクトがいくつか含まれていたため、コード分析から、テストクラスもそうであることがわかりました。それを実現するにはしばらく時間がかかりましたが、テストクラスに配置したときにそのインターフェイスの実装でthis.Dispose();
が呼び出されると、実際にはStackOverflow例外がスローされました。そこで、インターフェイスをヤンクして、CAが泣き続けるようにしました。
「テスト実行エンジンの実行を維持」を切り替える必要はありませんでした。
最も簡単な方法は、Windowsタスクマネージャーに移動することです。バックグラウンドで実行されているvstest.executionengine.exeプロセスを探します。そのプロセスを強制終了すると、今は正常に動作するはずです。