2011-11-18 26 views
11

私たちはVS 2010テストランナー(MSTest)を使用して自動機能テストを行っています。 Visual Studioからテストを実行すると、VSはQTAgent32.exeというプロセスを作成し、そのプロセスでテストを実行します。MSTestにテスト実行ごとに新しいプロセスを使用させることができますか?

複数のテストを実行すると、MSTestは同じQTAgent32プロセスを再利用することがわかりました。プロセスIDは変更されません。テストしているコードは、P /アンマネージDLLへの呼び出しなので、これは私たちのための問題です。 DLLは、プロセスのライフタイム中に1回だけ初期化する必要があります。 [AssemblyInitialize]メソッドがありますが、テスト実行ごとに1回実行されます。複数のテストを実行すると、同じプロセスで2回以上実行されます。

テストを実行するたびに、MSTestは新しいappdomainを作成します。これらのappdomainはすべて同じプロセスにあります。

私は、Visual Studioテストランナーに、テストを実行するたびに新しいプロセスを使用するよう指示する方法はありますか?私は ".testsettings"設定を見たが、関連するものは見なかった。

+2

私の好奇心のために、 'FreeLibrary'を使って連続してテストするたびにアンマネージDLLがアンロードされる可能性はありますか? –

+0

ありがとうWiktor - 良い提案。今のコードでは、C#extern関数宣言の[DllImport]属性を使用して、アンマネージAPIを静的に参照しています。私は、.NETが自動的にライブラリを解放しないと仮定します。これは、appdomainが解体されたときにエラーが発生しているためです。私は実際にC#コードから動的にロードされたDLLを呼び出す方法を知らない - LoadLibrary()とGetProcAddress()を呼び出して、何らかの形で返された関数ポインタをデリゲート型にキャストできますか?とにかく、私はそれを調べます - ありがとう!私はちょうど助けるかもしれないこれを見つけた:http://www.codeproject.com/KB/cs/dyninvok.aspx –

答えて

6

は、あなたがそれで行きたいどこまで知らないが、一つの解決策は

http://technet.microsoft.com/fr-fr/query/bb166558

あなたのユニットテストホストを作成することができ、このリンクはまた、あなたが新しいを起動することができ、アダプターを作成する方法を示していますevertestのためのプロセスは、パイプ通信を作成し、テストの後にそれを分解する。

私は、MS自身が)私はにFreeLibrary(約Wiktor第さんのコメントを読んだ後、この作業を取得することができましたモルの下でテスト

http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

+0

ありがとう!私はこれをチェックします。私はあなたがカスタムホストを作ることができるとは思わなかった。現在は、毎回新しいプロセスでテストを実行できるテストランナー(Gallio Icarusなど)が存在するかどうかを確認しています。インタラクティブな開発とテストでは、実際には問題に過ぎません。ビルドサーバでは、1回のテストプロセスで1回だけテストを実行します。 –

1

を実行するための別のホストを使用しています知っています。

私は、LoadLibrary、GetProcAddress、およびFreeLibraryの周りにラッパーを提供するMike Stallによって作成されたthis classを使用しました。そうすれば、各テスト実行でライブラリを一度ロードし、必要なメソッドを呼び出してから、テスト実行の最後にライブラリを解放することができます。

Mike Stallのコードでは、アンマネージド関数ポインタをマネージドデリゲート型に変換するMarshal.GetDelegateForFunctionPointerを使用しています。

[DllImport] extern宣言をデリゲート型の宣言に置き換えなければなりませんでした。これに

[DllImport("asesignal.dll")] 
public static extern bool ASESDK_Initialize(string licenseCode); 

:だから私は、この変換

public delegate bool ASESDK_Initialize(string licenseCode); 

マイク・ストールのコードを、一般的な代表団(アクション<T>など)との例を含んでいました。しかし、私はそれを得ることができませんでしたので、私は自分のデリゲート型を作成しました。

私はこのような動的にDLLをロードすることができます。

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll"); 

は、関数を呼び出すには、私はこれを行う:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize"); 
function(licenseCode); 

おかげWiktor第及びNP困難あなたの助け!

0

VS 2013には、[テスト]> [テスト設定]> [テスト実行エンジンを実行中]の設定があります。この選択を解除すると、毎回新しいエンジンが起動します。

関連する問題