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


123

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

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

回答:


121

これを行う標準的な方法は、ファイルに配置項目を指定することです。これには、Visual Studioの[ テスト ]メニューまたは[ ソリューション項目 ]フォルダーの[ テスト実行構成.testrunconfig編集 ] 項目からアクセスできます。


15
VS2010では、これは次のとおりです。テスト/テスト設定の編集/ローカル、次にリストで[展開]を選択し、[有効にする...]チェックボックスをオンにしてファイルを追加します。
マルセル

18
この変更が適切に有効になる前に、ソリューション(またはVisual Studio)を閉じて
再度

RobV、あなたは私の一日を作りました。ありがとう!
イグナシオソレルガルシア

2
コードで[DeploymentItem]属性を使用する場合、ダイアログでファイルを指定する必要はありません。以下の@tomfanningのコードを参照してください。
Patrick Szalapski、2007

これは、binまたはreleaseフォルダーからの構成出力のコピーに関する私の問題を解決しません。設計時に、ファイルがデバッグフォルダーまたはリリースフォルダーにあるかどうか、および私にとっては、コピーされないファイルに関する情報がないためです。テスト結果のOutフォルダー
Gurpreet

61

以下に示す例のように、デプロイメント属性を指定できます。また、「Content」と「Copy if newer」プロパティを設定する必要があります(後の設定に関するドキュメントはありませんが、機能させるために設定しました)。

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



}

3
これを有効にする必要があります。Mercelがコメントで書いたように、VS2010では、これはTest / Edit Test Settings / localであり、リストで[Deployment]を選択し、[Enable ...]チェックボックスをオンにします。
Patrick Szalapski、2007

Visual Studio 2012 Expressでこの問題に取り組んでいます。限定版のため、明確なドキュメントを見つけるのが困難でした。この回答をありがとうございます。
DavidHyogo 2012

2
よく働く。テストメソッドのすぐ上に必要なファイルが記載されているので、実際にはこれがより良い方法であると思います。
bu5hm4nn 2014年

1
(メソッドレベルではなく)テストクラスレベルで指定すると、DeploymentItem属性も機能することがわかりました。
Jon Schneider

10

属性を機能させるにTest -> Edit Test Settings -> Local -> Deploymentは、「展開を有効にする」をオンに[DeploymentItem]する必要がありました。


これは本当です...有効にしたところ、属性が機能しました。ありがとう!
ミゲルアンジェロ2011

別の回答に対する私のコメントで述べたように、私はVisual Studio 2012 Expressで同じ問題に苦労しています。2つの回答を組み合わせることで、最終的に解決策が得られました。
DavidHyogo 2012

5

ニーズに応じて、3つの答えはすべて正しいです。

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

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

お役に立てれば。


2
私の問題相対パスがここで言及された、私は、XMLは、テストはしていたが、それは、プロジェクトのルートになるために必要な、またはそれがであったことをディレクトリで始まることがディレクトリであるべきと思った。
ウェス・グラント

2

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


2

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

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

1

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

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によって作成されたように、ターゲットディレクトリに試験方法相対で使用されるファイルまたはディレクトリへのパスであるxcopydestinationそれが展開ディレクトリに対して作成されるディレクトリへのパスです。そのため、テストはターゲットディレクトリまたはデプロイメントディレクトリのいずれかで一貫して実行されます。宛先パスは、ファイル参照のないソースパスと同じでなければなりません。例: [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")


0

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


3
私はそうですが、それは少しハックのようです。これはかなり一般的なシナリオである必要があり、私が適切に設定していないオプションまたはプロパティがいくつかあることを願っています。
Eric Sc​​hoonover、


0
[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

受け入れられた答えは正しいので、他のほとんどの答えも正しいです。ただし、何年にもわたって、多数のデータファイルがある場合、DeploymentAttribtueCopy to Outputを使用したVisual StudioユニットテストのDeplomentシステムは扱いにくいことがわかりました。ファイルを元の場所に保持する方が効果的であることがわかりました。

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

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.