「出力ディレクトリにコピー」を単体テストで機能させるにはどうすればよいですか?
-
03-07-2019 - |
質問
テストを実行する前に単体テスト プロジェクトをビルドすると、テスト出力が TestResults フォルダーにコピーされてからテストが実行されます。私が抱えている問題は、Debug/bin ディレクトリ内のすべてのファイルが TestResults プロジェクトにコピーされないことです。
Debug/bin ディレクトリにコピーされたファイルを TestResults フォルダーにもコピーするにはどうすればよいですか?
解決
これを行う標準的な方法は、 導入アイテム の中に .testrunconfig
ファイルには、次の方法でアクセスできます。 テスト実行構成の編集 Visual Studio の項目 テスト メニューまたは 解決策アイテム フォルダ。
他のヒント
以下に示す例のような展開属性を指定できます。また、「コンテンツ」を設定する必要があります。 & "新しい場合はコピー"プロパティ(後の設定に関するドキュメントはありませんが、機能するように設定しました。
[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{
}
「展開を有効にする」をオンにする必要がありました。 Test->テスト設定の編集->ローカル->動作する
。 [DeploymentItem]
属性のデプロイメント
ニーズに応じて、3 つの答えはすべて正解です。
デプロイするファイルを追加する .testrunconfig (VS2010 の .testsettings) は、独立して実行される無関係なテストであっても、これらのファイルすべてをすべてのテスト出力フォルダーにコピーします。1 つのテストを実行すると、.testssettings の展開セクションにリストされているすべてのテスト データ ファイルがテスト出力フォルダーにコピーされます。
私のテストでは、実際のテスト出力 XML と比較するために、予想される XML ファイルをテスト出力フォルダーにコピーする必要があります。DeploymentItem 属性を使用して、実行中のテストに関連する XML ファイルのみをコピーします。VS2010 では、.testsettings ファイルでデプロイを有効にし (ただし、パスは追加しません)、DeploymentItem で TestProject に相対的な XML ファイル パスを参照する必要がありました。
お役に立てれば。
同様の問題がありましたが、私はLocal.testsettingsファイルの代わりにTraceAndTestImpact.testsettingsファイルを指定する必要がありました。 Test / Select Active Test Settingsメニューで、一方から他方に変更できます。
VSは、testsettingsファイルを使用せずに複数のソリューションに含まれるテストプロジェクトのVS2012で次のように機能します。
1)展開するファイルとフォルダーをテストプロジェクトディレクトリ内のフォルダーに配置します。
2)プロジェクトのプロパティで、ビルド後の手順を作成します
xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"
$(ProjectDir)
および $(TargetDir)
は、VSによって解釈されるマクロであり、そのように含める必要があります。
&lt; Project_Folder_Name&gt;
は、手順1で作成したフォルダーの名前です。
&lt; Deployment_Folder_Name&gt;
は、テストファイルが展開されるフォルダーの名前であり、複数のテストプロジェクトが同じディレクトリに展開されるときに一意になるように名前を付ける必要があります。 &lt; Project_Name&gt; _TestInputs
。
共有場所のテストファイルは、テストのやり取りを制限するために、ターゲットディレクトリの展開フォルダーにもコピーする必要があります。 $(ProjectDir)
マクロに関連するソースパスを指定します。たとえば、&quot; $(ProjectDir).. \ .. \ Common Files \ C1219TDL-2008.xml&quot;
。
3) [DeploymentItem(source、destination)]
プロパティを、展開ファイルを使用する各テストメソッド(ベストプラクティス)またはテストクラス(遅延または急いでのより簡単なプラクティス)に追加します。 、および以前に使用した相対パスまたはテスト設定ファイルをプロジェクトを更新する最も簡単な方法です。
テストメソッドでは、 source
は、 xcopy
およびによって作成されたターゲットディレクトリを基準とした、テストメソッドで使用されるファイルまたはディレクトリへのパスです。 destination
は、展開ディレクトリを基準にして作成されるディレクトリへのパスです。そのため、テストはターゲットディレクトリまたは展開ディレクトリのいずれかで一貫して実行されます。宛先パスは、ファイル参照のないソースパスと同じである必要があります。例: [DeploymentItem(&quot; Example_TestInputs \ C1219TDL-2008.xml&quot;、&quot; Example_TestInputs&quot;)]
。 DeploymentItem
は、そのファイルまたはディレクトリを使用するすべてのメソッドに含める必要があります。
クラスでは、 source
と destination
は両方とも、 xcopy
によってターゲットディレクトリに作成されたフォルダーの名前です。これにより、クラス内のテストが実行されると、フォルダー全体が展開ディレクトリにコピーされます。例: [DeploymentItem(&quot; Example_TestInputs&quot;、&quot; Example_TestInputs&quot;)]
4)テストメソッドでは、Visual Studioがその日にそれを置くことを決めた場所に関係なく、作業ディレクトリにあると確信してファイルとディレクトリにアクセスできるようになりました。 File.Exists(&quot;。\ Example_TestInputs \ C1219TDL-2008.xml&quot;)
。
CopyLocalが機能しない状況で、データや設定などに使用する通常の方法ではなく、dll専用にデプロイする方法を述べることで、受け入れられた回答を強化したいだけです。
[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
Visual Studio内からビルド後のイベントコマンドラインを試してください(そのIDEを使用している場合)。
Visual Studio 2012では、単純なケースではDeploymentItem属性は必要ありません。私の回答こちら
をご覧ください。[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
// in the method you are testing you should have this:
var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
受け入れられた答えは正しいので、他のほとんどの答えもそうです。ただし、長年にわたり、多数のデータファイルがある場合、 DeploymentAttribtue および出力にコピーを使用するVisual Studio単体テストの展開システムは扱いにくいことがわかりました。ファイルを元の場所に保存する方がうまくいくことがわかりました。
他の回答の詳細はこちら。 https://stackoverflow.com/a/53004985/2989655
これがお役に立てば幸いです。