97

私は現在、C#.net で記述された「古い」システムを維持しており、廃止された機能をいくつか削除し、リファクタリングを行っています。神に感謝します。前の人はいくつかの単体テスト (MSTests) を書きました。私は JUnit テストにはかなり慣れていますが、MSTests にはまだあまり慣れていません。

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

[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" が他のファイルが展開されるのに展開されない理由を理解したいと思います。

4

20 に答える 20

115

DeploymentItem少し混乱しています。

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

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

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

注:これらのコメントは、VS2010 での私の経験に基づいています。私の回答へのコメントは、これが VS2012 の問題ではないことを示唆しています。埋め込みリソースを使用すると「魔法」が少なくなり、私にとっては、単体テストの「配置」段階がより明確になるというコメントを今でも支持しています。

于 2009-05-19T14:58:01.433 に答える
77

VS2010 では、私の Local.testsettings で "Enable Deployment" がチェックされておらず、DeploymentItem 属性が機能していませんでした。私はそれをチェックし、すべてがうまくいきました。これが役立つことを願っています!

于 2010-07-27T16:59:17.500 に答える
20

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

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

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

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

<TargetFolder>に と同じ名前を付けたい場合、MSTest ランナーがばかげたエッジ ケースに遭遇するため<SubFolder>、使用は暗黙のうちに失敗します。これが、 の前にas[DeploymentItem(@"SubFolder", @"SubFolder")]を付ける必要がある理由です。<SubFolder><TestProjectFolder>[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

于 2013-08-29T06:40:21.947 に答える
15

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

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

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
于 2012-01-24T19:11:58.720 に答える
10

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

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

[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()
    {
        ...
    }
于 2011-07-19T15:27:16.597 に答える
10

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

于 2010-03-19T17:19:05.470 に答える
5

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

于 2012-11-15T21:20:49.850 に答える
4

これが質問に正確に答えるかどうかはわかりませんが、役立つ場合があります。まず、展開を機能させるには、[展開を有効にする]チェックボックスをオンにする必要があることがわかりました。次に、ドキュメントには、ソースパスは「プロジェクトパスに対して相対的」であると記載されています。これは、最初はプロジェクトフォルダーを意味するものでした。実際、ビルド出力フォルダーを参照しているようです。したがって、「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ファイルを編集するときに同じ問題が発生することがあります。コードを変更したり、再構築を強制したりしないと、ビルド時にコピーされます。

于 2012-07-23T19:02:21.177 に答える
3

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

于 2011-09-15T18:20:44.650 に答える
2

上記のすべての提案を試して、展開するファイルを取得しようとして大きな問題が発生しました。

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

私はいくつかのチェックをしました。local.TestSetting で 'Enable deployment' フラグを設定した後、[テスト結果] ウィンドウから単純にテストを再実行しないでください。たとえば、別のテストを実行するか、ソリューションを再度開くことにより、以前のテスト実行を UI から削除する必要があります。

于 2013-01-11T16:41:39.907 に答える
2

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();
    }
}

詳細については、この SO スレッドを参照してください

于 2014-10-22T09:14:51.583 に答える
1

私は常に DeploymentItem 属性がごちゃごちゃしているので、ビルド後のスクリプトを使用してそのようなファイルの配置を行います。- コピーするファイルに [常にコピー] プロパティが設定されていることを確認してください。- テスト プロジェクトのビルド後のスクリプトを変更して、ファイルをビルド ターゲット フォルダー (Bin\Debug) からテストが期待する場所にコピーします。

于 2011-04-08T20:42:50.407 に答える
1

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

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

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

たとえば、それを呼び出しますTDD

>TDDの下で選択します。TestMenuEdit 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 を試してみましたが、常にコピーしましたが、私の好みではありませんでした。

于 2011-12-17T17:24:25.067 に答える
1

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

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

deploymentFile.txt は、testfile.cs ではなく、ソリューション ファイルに対して相対的である必要があります。

ここに画像の説明を入力

于 2016-12-19T10:01:45.097 に答える
0

私も同様の問題に直面しました。上記のすべての手順を実行しましたが、まだ運がありません。私はVS2010を使用しています。次に、 $Menu > Test > Select Active Test Setting > Trace and Test impactが選択されていることがわかりました 。Trace と test impact をLocalに変更すると、機能し始めました。このページには、テスト結果フォルダーへのファイルのコピーに関する非常に有益な情報が含まれています。この経験も追加したいと思います。

于 2014-07-11T09:26:31.813 に答える
0

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

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

于 2014-04-10T16:34:39.363 に答える