2013-05-22 11 views
21

DllImportピンボケを使用してVS2010のC++ DLLを呼び出すVS2012プロジェクトのC#ユニットテストがあります。vstestディスカバリエンジンがDLLをロックしないようにする

テストプロジェクトのビルド前イベントとして、DLLの最新バージョンをテストのバイナリプロジェクトにコピーします。

vstest.discoveryengineが実行されている場合、これは繰り返し失敗します。 'discovery engine'がテストをロードしてDLLにロックを保持しているようです。

私がvstestディスカバリーエンジンを殺すと、テストをビルドして実行できます。それ以外の場合はビルドに失敗し、VS2012は以前のバージョンを実行するように提案しています(このメッセージをもう一度表示しないモデルダイアログで)

テストを強制するには何かできますか実際にテストを実行していないときにDLLをアンロードするか、バックグラウンド検索実行ファイルを無効にするプロジェクトですか?

Kealakekuaという名前の実行可能ファイルを作成し、vstest.discoveryengine.x86、vstest.executionengine.x86を削除し、ビルド前のイベントの最初の部分として、ファイルをコピーしてビルドできるようにすることで回避策をハッキングしました私のファイルのためにビジュアルスタジオと戦っていない方が好きです。

+0

コードを使ってテストクラスにDLLをロードすることはできますか? – Joel

+0

@Joel実際にはありません - テストはDLLを直接ロードしていません。テストしているコードはDLLです。私はその仕事をするのに必要な以上に生産コードを複雑にする必要はありません。テストコードとテスト中のアセンブリとの間のリンクがテストコード側で壊れる可能性がありますが、それが機能する可能性があります。 –

答えて

1

私は実際にテストをしていない "テスト"プロジェクトを作成したのと同様の問題がありました。 (C++ライブラリの開発者として、特定のヘッダがCLRを有効にしてコンパイルできることを確認したかったので、CLRでそれらをコンパイルするだけの偽のCLRプロジェクトを作成しました。 vstest.discoveryengineによって無期限に開かれた。

Ignoredテストをプロジェクトに追加して修正しました。私はvstest.discoveryengineがdllのすべてのテストを見つけるまでdllを保持すると思いますが、見つかるべきテストがなければ、それは永遠にそれを保持します。

私は追加テスト(私はそれがデフォルトのテストだと思う)()、それが実行されていないことを確認するTEST_IGNORE注:

#include <CppUnitTest.h> 

namespace CLRTests 
{ 
    TEST_CLASS(CLRTestsClass) 
    { 
    public: 

     BEGIN_TEST_METHOD_ATTRIBUTE(CLRTest1) 
     TEST_OWNER(L"") 
     TEST_DESCRIPTION(L"") 
     TEST_PRIORITY(1) 
     TEST_IGNORE() 
     END_TEST_METHOD_ATTRIBUTE() 
     TEST_METHOD(CLRTest1) 
     { 
     // TODO: Your test code here 
     } 

    }; 
} 

私はこれがあなたの状況で可能であると思います。

2

最近この問題もあり、問題は自分のユーザーコードによって発生しています。

テストディスカバリ中に、すべてのテストクラスがインスタンス化され、テストクラスコンストラクタの1つでは、非常に複雑なビジネスクラスが初期化されました。問題は次のことをやったこと、それを初期化中にバックグラウンドスレッドが作成されたということです。

socket.Read(...) 

このスレッドは、いくつかのソケットデータが到着するのを待っている永遠に走り続け、結果として私たちのアセンブリをロック。

私の解決策は、このコードがテストの検出中に呼び出されないようにすることでした。

この問題の影響を受けるかどうかは、一部のアセンブリをロックしたときにVisual Studioをテスト検出エンジンに接続することで確認できます。一時停止を押すと、現在実行中の行が自分のユーザコードのどこかにあることがわかります(スレッドウィンドウもチェックしてください)。

関連する問題