web-dev-qa-db-ja.com

MSTestの展開項目は、プロジェクトテスト設定ファイルに存在する場合にのみ機能しますか?

MSTestの展開アイテムがどのように構成されているかを把握できないようです。プロジェクトのテスト設定ファイルを変更することでそれらを適切に機能させることができましたが、これは理想的とは言えません-展開アイテムの構成は個々のテストから分離されており、ファイルがなければパスは絶対パスとして保存されているようですソリューションフォルダーの下。

プロジェクトテスト設定ファイルを作成/変更することなく、[DeploymentItem]または[TestClass][TestMethod]属性を使用して展開アイテムを追加することはできませんか?どうすればこれを達成できますか?

(率直に言って、私は別個の展開アイテム構成の必要性を理解していません-展開アイテムであるプロジェクトファイルに既存の「出力ディレクトリにコピー」設定を使用しないのはなぜですか?)

75
arathorn

Ok- この投稿はこちら 手動で.testsettingsファイルにアイテムを追加することなく何をする必要があるかを理解するのに役立ちました。

ステップ1-MS Test DeploymentItem属性を有効にします。

最初に、DeploymentItem属性をオン/有効にする必要があります。

ジャンプテスト->テスト設定の編集->現在のアクティブな設定..例::ローカル(local.testsettings)

alt text

次に[〜#〜] deployment [〜#〜]に移動し、Enable Deploymentがオンになっていることを確認します。 (デフォルトではオフです)。

alt text

ステップ2-ファイルのプロパティを確認する

次に、単体テストで使用するファイルが、コンパイル時にBINディレクトリにコピーされるように設定されていることを確認する必要があります。 MS Testの単体テストでは、BINディレクトリにあるファイルのみを使用できます。どうして? MSテストを実行するたびに、ソースのコピーを作成する必要があるため...(つまり、現在の構成用に)現在のBINディレクトリファイルのコピーを作成します。

たとえば...現在の設定はDebug(リリースではなく)です。 alt text

次に、ファイルを追加します...(プロジェクトのフォルダー構造に注意してください)...

alt text

そして、プロジェクトのコンパイル時に、このファイルが常にbinディレクトリにコピーされていることを確認してください。

alt text

PRO TIP:Copy Alwaysも機能しますが、コピー元ファイルをコピー先ファイルにコピーします。たとえ同じであっても。これが、新しい場合はコピーを好む理由ですが... ボートが浮くもの

はい、女性と男性-まだ私と一緒ですか?ウィキッド。

コンパイルすると、ファイルはBin dirに存在するはずです。

alt text

ステップ3-DeploymentItem属性を使用する

さて、コードでDeploymentItem属性をようやく使用できるようになりました。これを行うと、これにより、MSTestはファイルを(binディレクトリからの相対位置から)新しいMS Testディレクトリにコピーするように指示されます...

[TestMethod]
[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
{
    // Arrange.
    const string fileName = @"Test Data\100LogEntries.txt";
    ILogEntryService logEntryService = new PunkBusterLogEntryService();

    // Act.
    var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);

    // Assert.
    Assert.IsNotNull(parsedLogEntries);
    Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
    // Snipped the remaining asserts to cut back on wasting your time.
}

これを分解しましょう。

[TestMethod]

私たちは皆それが何であるかを知っています。

[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]

Binディレクトリから開始して、Test Dataフォルダーに移動し、100LogEntries.txtファイルを、MS Testが各テストごとに作成するルートMS Test出力ディレクトリの宛先フォルダーTest Dataにコピーします。実行されます。

これが私の出力フォルダー構造の外観です。 (すべての混乱を許して...)

alt text

そして出来上がり!プログラム的に展開ファイルがあります。

PRO TIP#2-DeploymentItem属性で2番目の文字列引数を使用しない場合、ファイルは現在のMSテストのルートOUTフォルダーにコピーされます。

const string fileName = @"Test Data\100LogEntries.txt";

これで、ファイルへのパスは、現在のMSテストのOUTフォルダーに相対的です。したがって、私は明示的にファイルをTest Dataというディレクトリに展開するように言ったので、必要なときにコードで正しく参照することを確認する必要がありますファイルを読み込む。

確認するために->そのファイル名のフルパスが、現在のMSテストのC:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Data ..のようなものに変換されます。

HTH。

ユニコーンの写真があります。

alt text

221
Pure.Krome

MSTestと展開項目で問題が発生した方法を共有すると思いました。 [テスト結果]ウィンドウから2回以上テストをデバッグ/実行する場合、前回の実行の設定が使用されます。ただし、[テストビュー]ウィンドウから同じテストをデバッグ/実行すると、最新の設定が使用されます。 「テスト結果」ウィンドウから同じテストでデバッグを開始し続けたときに、Local.testsettingsへの変更が使用されなかった理由を理解しようとして1時間を失いました。

これは[テスト結果]ウィンドウです(Local.testsettingsに変更を加えた後、ここからテストを[再]開始しないでください):

The Test Results Window

これがテストビューウィンドウです(Local.testsettingsに変更を加えた後、ここからテストを開始してください)。

The Test View Window

これにより、将来的に誰かが頭痛の種にならないように願っています。

15

Visual Studio 2012では、出力ディレクトリは作業ディレクトリです。つまり、一般的な場合(テストごとまたはクラスごとの特定の展開アイテムがない場合)には、DeploymentItem属性は必要ありません。これは、すべてのテストで使用したいファイルのセットがある場合、または各TestClass/TestMethodが個別の展開依存関係を持っていることについてあまり気に入らない場合、DeploymentItem属性を使用する必要がない場合を意味します。

[プロジェクト]をクリックするだけです|すべてのファイルを表示し、プロジェクトに「常にコピー」または「新しい場合にコピー」属性を付けてVisual Studioにサブフォルダーとファイルを含めます。ファイルは階層をそのままにして出力ディレクトリにコピーされます。

コマンドラインからvstest.console.exeを実行する場合も同じです。詳細については here をご覧ください。

更新

デフォルトのディレクトリが出力ディレクトリではない場合があります。特にRun All Testsを選択すると、デフォルトパスはTestResults\Deploy_...の下になりますrunsettingsファイルを使用する場合、またはテストでDeploymentItemsを使用する場合も同じ

DeploymentItemsを使用していない場合、出力ディレクトリはデフォルトのディレクトリになります。-

  • Visual Studioでテストを右クリックして、実行/デバッグを選択するか、または
  • Vstest.console.exeを使用してコマンドラインから実行します。
7
acarlon

個々のテストケースで個別の展開項目が必要な場合は、各テストケースで[DeploymentItem("string file path")]属性を使用してください。

1
Pritam Karmakar

私の場合、DeploymentItem属性を追加しますが、すぐに有効にすることはできません。ソリューションを閉じて再度開く必要があると、構成されたDeploymentItem属性が有効になります。

0
Jack Liu Shurui