MSTestはファイルをテスト実行フォルダーにコピーします


108

XMLファイルを読み込んで解析する必要があるテストがあります。このファイルを毎回テスト実行フォルダーにコピーするにはどうすればよいですか?

XMLファイルは、「新しい場合はコピーする」に設定され、コンパイルモードは「なし」に設定されます(実際にはコンパイル可能なものではないため)。

回答:


131

属性を使用するDeploymentItem

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.xml")]
        public void ConstructorTest()
        {
            string file = "testFile1.xml";
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}

17
DeploymentItem属性をクラスレベルで指定して、クラス内のすべてのテストに影響を与えることもできます。
Hannes Nel、2011

24
サブフォルダーにアイテムがあり、展開サブディレクトリ[DeploymentItem( "SubFolder \ testFile1.xml"、 "SubFolder")]にも含める場合は、忘れないでください
omgtitb

31
Thomasのコメントに加えて、RelativePathRootのデフォルト値はソリューションフォルダーであるため、ソリューションが次のようになっている場合(.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt)DeploymentItemは次のようになります。([DeploymentItem(@ "TestProject \ TestData \ aFile.txt"、 "TestData")])..これを使用して、テストでファイルを参照します。.((string file = @ "TestData \ aFile.txt";)
Michael Dausmann

6
VS2010のDeploymentItemAttributeドキュメントこの属性は、テストメソッドまたはテストクラスで指定できます。
Alex Che

12
私が見たほとんどの投稿で言及していないのは、これを機能させることができない場合は、おそらく「展開を有効にする」チェックボックスをオンにする必要があるということです。このチェックボックスは、テスト->テスト設定の編集->ローカル(local.testsettings)->配置タブ。私はこれを実行しただけで、DeploymentItemは正常に機能しました。
Dave、

26

ソリューションのTestSettingsファイルを提供する場合は、[展開を有効にする]オプションをオフにして...TestResults\...\out、余分なファイルをコピーしないフォルダーからmstestを実行しないようにすることができます(展開オプションにしない限り)。 。

TestSettingsの[Deployment、Add Folder]オプションを使用した場合、Deploymentアイテムはすべて一時実行フォルダー(out)に直接(フラット)にコピーされるように見えるため、これは保存フォルダー構造にある追加ファイルに依存している場合にも役立ちます。上記の回答は、各アイテムを独自のDeploymentItemとして追加する場合、構造を維持できることを示唆しています。

私にとっては、Visual Studioでテストを直接実行しても問題なく動作しました(つまり、構造内の余分なファイルが見つかり、テストで使用されていたため)。 TestSettingsファイルを使用するように指定していないため、mstestを実行してテストを実行しました。

Visual StudioでTestSettingsファイルを作成するには、ソリューションを右クリックして[ 新しい項目] を選択し、TestSettingsテンプレートを選択します。mstest.exeのコマンドプロンプトでTestSettingsファイルを使用するには、オプションを追加します/testsettings:C:\Src\mySolution\myProject\local.testsettings (または、TeamCityに追加のコマンドラインオプションとして適切なパスを追加します)。



3

特に複数のテストで同じデータファイルが必要な場合は、テスト設定を使用するのが最善の解決策です。

最初にtestsettingsファイルを作成し、必要な展開項目(ファイルまたはフォルダー名)を追加します。

<TestSettings name="Local" id="00ebe0c6-7b64-49c0-80a5-09796270f111" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Folder1\TestScripts\test.xml" outputDirectory="TestScripts"/>
    <DeploymentItem filename="Folder2\TestData\" outputDirectory="TestData"/>
  </Deployment>
<...../>
  • Visual Studioで実行し、[Test \ Test Settings]メニューから[select Test Settings File]を使用して新しいテスト設定を選択します

  • mstestを実行し、/ testsettingsパラメーターを使用して、mstestにテスト設定を使用させます。


2

AssemblyInitialize属性を持つメソッドを保持するクラスでDeploymentItemを定義できます。そうすれば、実行するテストに関係なく、ファイルが確実にコピーされます。

残念ながら、DeploymentItem属性は、実行中のテストを含むクラスでのみ実行されます。したがって、同じファイルセットを使用する10個のテストクラスがある場合は、それらすべてに属性を追加する必要があります。

* .testsettingsファイルの変更がVisual Studioで自動的に更新されないこともわかりました。したがって、testsettingsのデプロイメントにファイル/フォルダーを追加した後、ソリューションファイルを再度開いてテストを実行する必要があります。


2

Visual Studio 2012では、vstest.console.exe(組み込みテストランナー)は、出力パスを現在のパスとして実行します。これは、テストで使用するために、「常にコピー」または「新しい場合はコピー」プロパティを使用して、ソリューションに項目を含めるだけでよいことを意味します。一般的なケースではDeploymentItem属性は必要ありません。output / testディレクトリ内のコマンドラインからvstest.console.exeを実行する場合も同様です。

別のフォルダーが使用される場合があります。その1つは、DeploymentItem属性を使用している場合です。詳細については、こちらをご覧ください。

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