web-dev-qa-db-ja.com

DeploymentItem属性の問題

私は現在、C#.netで記述された「古い」システムを保守し、いくつかの古い機能を削除し、リファクタリングを行っています。ありがとう、前の男はいくつかの単体テスト(MSTests)を書いた。私はJUnitテストには非常に満足していますが、MSTestsにはまだあまり取り組みませんでした。

テストメソッドには、テスト対象のビジネスロジックメソッドによって解析されるテキストファイルを指定するDeploymentItem属性と、TIFの束を含むパスのみが指定された2番目のDeploymentItemがあります。デプロイする必要があるファイルも。

_[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}
_

以前はテストは機能していましたが、\ files\tifディレクトリに含まれるTIFファイルの名前を変更する必要がありました。規則によれば、TIFファイル名は、ExistsTifTest()メソッドでもチェックされる特定のパターンに一致する必要があります。ここで、新しい要件に合わせてファイル名を変更する必要があり、突然TIFファイルが以前のように展開されなくなりました。

誰かがこれがなぜ起こるのか、または何が原因であるのかヒントを教えてもらえますか?\files\valid \ディレクトリの「valid_entries.txt」の横に「my2ndTest.txt」という新しいテキストファイルを追加し、テストメソッドのDeploymentItem属性を追加した場合も、同じことが起こります。ファイルは展開されませんか?

Testrunco​​nfigで展開パスを直接定義することで画像を展開しましたが、これらの問題が発生する理由や、たとえば、新しいファイル "my2ndTest.txt"が他のファイルで展開されない理由を理解したいと思います。

93
Juri

DeploymentItemはちょっとした混乱です。

ソリューションの各ファイルには、VS.NETの「出力フォルダーにコピー」設定があります。ファイルを出力フォルダーに入れるには、これを「常にコピー」(または同様)にする必要があります。

新しいファイル用にこのセットがあることを確認してください。このセットがない場合、ファイルは出力フォルダーにコピーされず、出力フォルダーからMSTestが処理するフォルダーにファイルを展開できません。

個人的に、ユニットテストに必要なファイルがある場合、それらのファイルをリソースとしてアセンブリに埋め込み、テスト中にそのアセンブリ自体を「アンパック」することがより予測可能な方法であることがわかりました。 YMMV。

注:これらのコメントは、VS2010での私の経験に基づいています。私の答えへのコメントは、これがVS2012の問題ではないことを示唆しています。埋め込みリソースを使用すると「マジック」が少なくなり、ユニットテストの「アレンジ」ステージがより明確になるというコメントがまだあります。

104
Martin Peck

VS2010では、Local.testsettingsの[展開を有効にする]がオフになっており、DeploymentItem属性が機能していませんでした。私はそれをチェックし、すべてがうまくいきました。これがお役に立てば幸いです!

74
Ivan Muzzolini

私も同様の問題に直面しましたが、このための簡単な3ステップの解決策を見つけました:

フォルダー構造が次のようになっていると仮定します:_SolutionFolder\ TestProjectFolder\ SubFolder\_

  1. 「Solutions Items/Local.testsettings」>「Deployment」>「Enable Deployment」にチェックを入れます
  2. VS2010を使用している場合、展開するファイルの[出力フォルダーにコピー]プロパティが[常にコピー]または[新しい場合にコピー]に設定されていることを確認してください。
  3. TestMethodを次のいずれかで属性付けします。
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]は、_<SubFolder>_のすべてのコンテンツをテスト実行ディレクトリに展開します
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")]は、テスト実行ディレクトリの_<SubFolder>_のすべての内容を_<TargetFolder>_にデプロイします

MSTestに関する最後の注意事項(少なくともVS2010の場合):

_<TargetFolder>_を_<SubFolder>_と同じ名前にしたい場合、[DeploymentItem(@"SubFolder", @"SubFolder")]を使用すると、MSTestランナーが愚かなEdgeケースにヒットするため、サイレントに失敗します。これが、_<SubFolder>_の前に_<TestProjectFolder>_を付ける必要がある理由です:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

17
Murari Kumar

うまくいけば他の誰かを助けるために:ここですべての提案を試みましたが、still展開アイテムがコピーされていませんでした。

私がしなければならなかったのは( ここで提案したように )、DeploymentItem属性に2番目のパラメーターを追加することでした。

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
14
Peter K.

.testrunco​​nfigファイルに移動し、展開中に[展開を有効にする]のチェックを外すと、テストは通常​​の場所で実行され、単体テストの外でアプリを実行するときと同じようにすべてが機能します。

10
Josh Close

これはおそらくあなたの正確な問題とは関係ありませんが、[DeploymentItem]属性で見つけたヒントをいくつか紹介します。

  1. 出力ディレクトリへのコピーは、常にコピーに設定する必要があります。

[〜#〜] not [〜#〜] [TestInitialize]属性とともに使用すると動作します

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

[TestMethod]にあるはずです。

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
8
Matt Frear

ここにリストされている他の提案をすべて試しても、何が起こっているのかまだわかりませんでした。最後に、[テスト/テスト設定]メニューで設定ファイルが選択されていないことがわかりました。これは、展開が有効になっていないことを意味します。テスト/テスト設定/テスト設定ファイルの選択メニュー項目をクリックし、Local.TestSettingsファイルを選択すると、すべてが機能しました。

5
Mike

これが質問に正確に答えるかどうかはわかりませんが、一部の人には役立つかもしれません。まず、展開を機能させるには、[展開を有効にする]ボックスをオンにする必要があることがわかりました。第二に、ドキュメントでは、ソースパスは「プロジェクトパスに相対的」であり、最初はプロジェクトフォルダを意味するものでした。実際、ビルド出力フォルダーを参照しているようです。したがって、「TestFiles」というプロジェクトフォルダーとTestdata.xmlという名前のファイルがある場合、この方法で属性を使用しても機能しません。

[DeploymentItem(@"TestFiles\Testdata.xml")] 

Testdata.xmlファイルCopy Alwaysをマークして、ビルドが出力フォルダー(たとえば、Debug\TestFiles\TestData.xml)の下にコピーを配置できるようにします。展開メカニズムは、ビルド出力に関連するそのパス(TestFiles\Testdata.xml)にあるファイルのコピーを見つけます。または、この方法で属性を設定できます。

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

展開メカニズムは元のファイルを見つけます。どちらでも動作しますが、Copy Alwaysを使用すると、プロジェクトでapp.configファイルを編集するときと同じ問題が発生することがあります-コードを変更したり、強制的に再構築しないと、何もトリガーされませんビルド時にコピーするようマークされたファイルのコピー。

4
user1546704

最初に展開フラグを無効にしました。しかし、有効にした後でも、何らかの未知の理由で、ターゲットDLLでさえもコピーされません。偶然、テスト実行ウィンドウを開いて以前のすべての実行を強制終了し、魔法のように次の実行時にテストフォルダーに必要なすべてのDLLとファイルを見つけました...非常に混乱しています。

3
Schultz9999

上記のすべての提案を試してみて、デプロイするファイルを取得しようとして大きな問題がありました。

その後、VS2010を閉じました。再起動し、ソリューションをロードして、すべてが機能しました。 (!)

いくつか確認しました。 local.TestSettingで「展開を有効にする」フラグを設定した後、テスト結果ウィンドウからテストを単に再実行しないでください。 UIから以前のテスト実行を削除する必要があります。別のテストを実行するか、ソリューションを再度開きます。

2

私はVS2013でこれに取り組んできました。これを機能させるための私の発見:

  • 出力ディレクトリへのコピーは、「常にコピー:必須」に設定する必要があります。
  • .TestSettingsの「展開を有効にする」:必須ではありません。これは、.TestSettingsファイルがまったくなくても機能します。
  • 2番目のパラメーターとしてフォルダーを指定:OPTIONAL。出力フォルダーのレイアウトを整形しますが、うまく機能しません。
  • ファイル名のスペース:これは頭痛の種を引き起こしました-ファイルは決してコピーされませんでした。スペースを削除すると、これが修正されました。エスケープ文字はまだ調べていません。

また、難しい方法を学んだヒント:この属性を個々のテストに追加することを忘れないでください。ファイルはtestrunの最初の属性付きテストでコピーされますが、テストの順序が変更され、属性のないテストが最初にファイルを見つけようとしたときに欠落していました。

1
Volkirith

DeploymentItem属性は常に混乱しているため、ビルド後スクリプトを使用してこのようなファイルの展開を行います。 -コピーするファイルに[常にコピー]プロパティが設定されていることを確認します。 -ビルドターゲットフォルダー(Bin\Debug)からテストが必要な場所にファイルをコピーするように、テストプロジェクトのビルド後スクリプトを変更します。

1
Ismail Hawayel

ローカルユニットテストの実行とチームシティユニットテストの再実行でも、展開アイテムの問題を解決するために多くの時間を費やしました。それは簡単ではない。

この問題をデバッグするための非常に良いツールは ProcessExplorer です。プロセスエクスプローラーを使用して、Visual Studioが展開アイテムを検索している場所を確認し、プロジェクトを修正できます。パスにdeploymentitemファイル名が含まれるすべてのファイル操作をフィルタリングすると、それが表示されます。

1
Tomas Kubes

DeploymentItemの混乱を避け、@ Martin Peckが提案するアプローチ(受け入れられた答え)を好む人のために、次のコードを使用して埋め込みリソースのコンテンツにアクセスできます。

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var Assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = Assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

詳細については、「 this SO Thread 」を参照してください。

1

Deployment属性をチェックする必要があることに加えて、DeploymentItem属性について何か他のものを発見しました。

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

DeploymentFile.txtは、testfile.csではなくソリューションファイルに関連する必要があります。

enter image description here

1
Pavenhimself

DeploymentItemを使用しないでください。

正しくセットアップするのは非常に難しく、私のReSharperテストランナーでもVisual Studio 2017のMSTESTのネイティブランナーでも動作しませんでした。

代わりに、データファイルを右クリックし、propertiesを選択します。 出力ディレクトリにコピー:常にを選択します。

テストでこれを行います。ディレクトリは、テストプロジェクトに相対的なファイルのディレクトリです。簡単です。

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

これは、自動化されたビルドおよびテストシステムでうまく機能するようです。

1
Jess

私にとって、根本的な原因はまったく別のものでした。テストによって実行されている製品コードは、展開されている.xmlテストファイルの名前を変更したり削除したりしていました。

したがって、テストを個別に実行すると合格しますが、一緒に実行すると、2番目以降のテストは「ファイルが見つかりません」というエラーで失敗します(元々DeploymentItemと誤診されていました)属性が機能しない)。

私の解決策は、個々のテストメソッドにデプロイされたファイルのコピーを作成し( この手法 を使用)、テスト対象の製品コードに元のファイルではなくコピーされたファイルを使用させることでした。

1
Jon Schneider

VS2010でこれを試してください。したがって、tifごとにDeployItemsを追加する必要はありません
削除

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

テスト構成を追加します。
-ソリューションエクスプローラーでソリューションノードを右クリックします。
-追加->新規アイテム...
-左側の[テスト設定]ノードを選択し、右側の項目を選択します
-[追加]をクリックします

例:TDD

TDDの下のTestMenuを選択します>> Edit Testsettings

展開をクリックします。有効にしてから、必要なファイルとディレクトリを追加します。ソリューションへの相対パスがあります。ファイルが置かれます。元のファイルの例を次に示します。

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

ユニットテストを実行すると、ユニットテストがコピーされます

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

テストコードで私はそれをから呼び出します:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

常にコピーを選択する必要はありません。ファイルをテストプロジェクトに入れます。テストコードにハードコードされたパスを追加します。私にとっては、このソリューションが最適でした。 DeploymentItemで試しました。常にコピーしますが、それは私の好みではありませんでした。

1

私も同様の問題に直面しています。上記のすべての手順はありますが、それでも運はありません。 VS2010を使用しています。次に、$ Menu> Test> Select Active Test Setting> Trace and Test impactが選択されていることがわかりました。トレースとテストの影響をLocalに変更した後、動作し始めました。このページには、ファイルをテスト結果フォルダーにコピーすることに関する非常に役立つ情報が含まれています。このエクスペリエンスも追加したいと思います。

0
MJK

私の大きな「落とし穴」は、DeploymentItemがディレクトリを処理する方法でした。展開したいサブディレクトリを含むディレクトリパスとして、2パラメータバージョンを使用していました。最初はディレクトリのROOTにあるものだけをコピーし、再帰的なフォルダ構造全体をコピーするのではないことに最初は気付きませんでした!

基本的に[DeploymentItem(@ "Foo \"、@ "Foo \")]があり、Foo\Barを展開することを期待していました。具体的には[DeploymentItem(@ "Foo\Bar \"、@ "Foo\Bar \")]に変更する必要がありましたが、今では魅力のように機能します。

0
StalePhish