1. ホーム
  2. unit-testing

MSTest のデプロイメント項目は、プロジェクトのテスト設定ファイルに存在するときのみ機能しますか?

2023-09-06 21:31:13

質問

MSTest の配置項目がどのように構成されることになっているのか、把握できないようです。展開アイテムの設定は個々のテストから分離されており、ファイルがソリューション フォルダ下にない限り、ファイル パスは絶対パスとして保存されるようです。

を使用してディプロイメント項目を追加することはできないのでしょうか? [DeploymentItem] 属性を使って [TestClass] または [TestMethod] というように、プロジェクトのテスト設定ファイルを作成・変更することなく、テストができるようになりませんか?どうすればこれを達成できますか?

(率直に言って、個別のデプロイメント項目設定の必要性が理解できません。デプロイメント項目であるべきプロジェクト ファイルに対して既存の「出力ディレクトリにコピー」設定を使用するだけではどうでしょうか?)

どのように解決するのですか?

この記事はこちら に手動で項目を追加することなく、必要なことがわかるようになりました。 .testsettings ファイルに手動で項目を追加することなく、必要なものを見つけることができました。

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

まず始めに、この属性を有効にするために DeploymentItem 属性を有効にします。

に移動します。 TEST -> EDIT TEST SETTINGS -> 現在有効な設定 ... 例 :: ローカル (local.testsettings)

次に デプロイメント を確認し デプロイメントを有効にする がオンになっていることを確認します。(デフォルトではオフになっています)。

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

ここで、ユニットテストで使用したいファイルが、コンパイル時にBINディレクトリにコピーされるようにセットアップされていることを確認する必要があります。BINディレクトリにあるファイルだけが、MS Testのユニットテストで使用することができます。なぜか?なぜなら、MS テストが実行されるたびに、ソースのコピーを作成する必要があり、これは、現在の BIN ディレクトリのファイル(現在の構成用)のコピーを作成することを意味するからです。

たとえば... 現在の構成は デバッグ (リリースとは対照的) です。

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

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

ヒント: 常にコピーも機能しますが、常にソース ファイルを宛先ファイル上にコピーします ... たとえそれらが同一であってもです。これが、私が Copy if Newer を好む理由です...しかし はあなたのボートを浮かばせるものです。

さて、皆さん、まだ私と一緒ですか?ウィキッドです。

コンパイルすると、今度はBinディレクトリにファイルが存在するはずです...。

ステップ 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 ファイルをコピー先のフォルダ Test Data を、MS Test が各テストを実行したときに作成する MS Test 出力ディレクトリのルートに作成します。

私の出力フォルダの構造はこのようになっています(ごちゃごちゃしていてすみません)。

で、ほら!プログラム的にデプロイメントファイルが出来上がりました。

プロフェッショナルヒント #2 - もし、2番目の文字列引数を DeploymentItem 属性の 2 番目の文字列引数を使用しない場合、ファイルは現在の MS Test のルート OUT フォルダにコピーされます。

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

これで、ファイルへのパスは相対パスで OUT フォルダーに相対的です。そのため、明示的に デプロイ という名前のディレクトリにファイルを配置します。 Test Data ...ですから、ファイルを読み込むときに、コードでそれを正しく参照することを確認する必要があります。

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