web-dev-qa-db-ja.com

ユニットテストで動作するように「出力ディレクトリにコピー」を取得するにはどうすればよいですか?

テストを実行する前に単体テストプロジェクトをビルドすると、テスト出力がTestResultsフォルダーにコピーされ、テストが実行されます。私が抱えている問題は、Debug/binディレクトリ内のすべてのファイルがTestResultsプロジェクトにコピーされないことです。

Debug/binディレクトリにコピーされ、TestResultsフォルダーにもコピーされるファイルを取得するにはどうすればよいですか?

123
Eric Schoonover

これを行う標準的な方法は、.testrunconfigファイルで deployment items を指定することです。これは Visual Studioのテスト実行構成項目の編集 Test メニューまたは Solution Items フォルダー内。

121
Mark Cidade

以下に示す例のような展開属性を指定できます。また、「コンテンツ」と「新しい場合はコピー」プロパティを設定する必要があります(後の設定に関するドキュメントはありませんが、機能するように設定しました。

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
59
Sanjay10

Test -> Edit Test Settings -> Local -> Deployment属性を機能させるには、[DeploymentItem]の下で[Enable Deployment]をオンにする必要がありました。

10
tomfanning

必要に応じて、3つの答えはすべて正しいです。

。testrunco​​nfig(VS2010の.testsettings)に展開するファイルを追加すると、無関係のテストが単独で実行されている場合でも、これらのファイルがすべてのテスト出力フォルダーにコピーされます。 1つのテストを実行すると、.testssettingsの展開セクションにリストされているすべてのテストデータファイルがテスト出力フォルダーにコピーされます。

私のテストでは、予想されるXMLファイルをテスト出力フォルダーにコピーして、実際のテスト出力XMLと比較する必要があります。 DeploymentItem属性を使用して、実行中のテストに関連するXMLファイルのみをコピーします。 VS2010では、.testsettingsファイルで展開を有効にし(ただし、パスを追加しない)、DeploymentItemのTestProjectに関連するXMLファイルパスを参照する必要がありました。

お役に立てれば。

5
GraehamF

同様の問題がありましたが、Local.testsettingsファイルではなくTraceAndTestImpact.testsettingsファイルを指定する必要がありました。 Test/Select Active Test Settingsメニューで、一方から他方に変更できます。

2
Simon

CopyLocalが機能しない状況で、データや構成などに使用する通常の方法ではなく、dll専用にデプロイする方法を説明することで、受け入れられた回答を強化したいと思います。

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
1
JamesDill

以下は、VS2012で、testsettingsファイルを使用せずに複数のソリューションに含まれるテストプロジェクトで機能します。

1)展開するファイルとフォルダーをテストプロジェクトディレクトリ内のフォルダーに配置します。

2)プロジェクトのプロパティで、ビルド後の手順を作成します

_xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"
_

$(ProjectDir)および$(TargetDir)はVSによって解釈されるマクロであり、そのように含める必要があります。

_<Project_Folder_Name>_は、手順1で作成されたフォルダーの名前です。

_<Deployment_Folder_Name>_は、テストファイルが展開されるフォルダーの名前であり、複数のテストプロジェクトが同じディレクトリに展開されるときに一意になるように名前を付ける必要があります。 _<Project_Name>_TestInputs_。

共有場所のテストファイルは、テストの相互作用を制限するために、ターゲットディレクトリの展開フォルダーにもコピーする必要があります。 $(ProjectDir)マクロに関連するソースパスを指定します。たとえば、"$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml"

3)[DeploymentItem(source, destination)]プロパティを、デプロイメントファイルを使用する各テストメソッド(ベストプラクティス)またはテストクラス(遅延または急いでのより簡単なプラクティス)、および以前のプロジェクトを更新する最も簡単な方法のいずれかに追加します。相対パスまたはテスト設定ファイルを使用)。

テストメソッドでは、sourceは、xcopyによって作成されたターゲットディレクトリを基準としたテストメソッドで使用されるファイルまたはディレクトリへのパスであり、destinationはへのパスです。展開ディレクトリに関連して作成されるディレクトリ。そのため、テストはターゲットディレクトリまたは展開ディレクトリのいずれかで一貫して実行されます。宛先パスは、ファイル参照のないソースパスと同じである必要があります。例:[DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]DeploymentItemは、そのファイルまたはディレクトリを使用するすべてのメソッドに含める必要があります。

クラスでは、sourcedestinationは両方ともxcopyによってターゲットディレクトリに作成されたフォルダーの名前です。これにより、クラス内のテストが実行されると、フォルダー全体が展開ディレクトリにコピーされます。例:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4)テストメソッドでは、Visual Studioがその日に置くことを決めた場所に関係なく、作業ディレクトリにあると確信してファイルとディレクトリにアクセスできるようになりました。 File.Exists(".\Example_TestInputs\C1219TDL-2008.xml")

1
Richard Morris

Visual Studio 2012では、単純なケースではDeploymentItem属性は必要ありません。私の答えを参照してください こちら

0
acarlon
[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";
}
0
Nina

受け入れられた答えは正解であり、他のほとんどの答えも同様です。ただし、長年にわたって、DeploymentAttribtueおよびCopy to Outputを使用したVisual Studio単体テストの展開システム多数のデータファイルがある場合は面倒です。ファイルを元の場所に保存する方がうまくいくことがわかりました。

詳細については、他の回答をご覧ください。 https://stackoverflow.com/a/53004985/2989655

お役に立てれば。

0
Sau001

Visual Studio内からビルド後のイベントコマンドラインを試してください(そのIDEを使用している場合)。

0
Kasper