一部のテストでは、テスト データ、構成ファイル、ゴールデン マスター、ネイティブ依存関係など、実行時に追加のファイルが必要になります。 DeploymentItemAttributeを使用して、各テストの実行時にテスト アセンブリの横で使用できるファイルとフォルダーを宣言します。
概要
テスト クラスまたはテスト メソッドに [DeploymentItem] を適用すると、MSTest は、指定したファイルまたはフォルダーを、そのスコープ内のテストを実行する前に、 TestContext.DeploymentDirectory によって公開されたディレクトリにコピーします。 デプロイ ディレクトリはテストの現在の作業ディレクトリでもあります。そのため、テスト コードはコピーした名前でファイルを開くことができます。
この属性は、相対パスまたは絶対パスを受け入れます。
-
相対パス は、ビルド出力ディレクトリ (
bin\Debug\net10.0\など、テスト アセンブリを含むフォルダー) に対して解決されます。 - 絶対パス は as-is使用されます。
Important
MSTest 3.x では、テストの実行ごとに展開項目がコピーされます。 配置時にファイルを使用できるようにするには、ビルド出力ディレクトリにファイルが既に存在している (またはコピー先である) 必要があります。
申し込む [DeploymentItem]
属性は、テスト メソッド、テスト クラス、またはその両方に適用できます。 複数のインスタンスが許可され、次の組み合わせが可能です。
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
[DeploymentItem(@"TestFiles\shared-config.json")]
public class ConfigurationTests
{
[TestMethod]
[DeploymentItem(@"TestFiles\customers.csv")]
public void LoadCustomers_FromCsv_ReturnsAllRows()
{
// Both shared-config.json (from the class) and customers.csv (from
// the method) are available in the deployment directory.
Assert.IsTrue(File.Exists("shared-config.json"));
Assert.IsTrue(File.Exists("customers.csv"));
}
}
Note
[DeploymentItem]をテスト クラスに適用する場合、クラスには少なくとも 1 つのテスト メソッドが含まれている必要があります。
AssemblyInitializeメソッドまたはClassInitializeメソッドのみを持つクラスに適用しても効果はありません。 アナライザー MSTEST0035 このような誤用にフラグを設定します。
コンストラクターのオーバーロード
DeploymentItemAttribute には、 DeploymentItemAttribute(string path) と DeploymentItemAttribute(string path, string outputDirectory)の 2 つのコンストラクターがあります。
DeploymentItemAttribute(string path)
pathによって識別されるファイルまたはフォルダーを展開ディレクトリのルートにコピーします。
// Copy a single file from the build output directory.
[DeploymentItem("settings.json")]
// Copy a file that lives in a subfolder of the build output directory.
// The file is copied to the root of the deployment directory (the
// "Resources" folder is not preserved).
[DeploymentItem(@"Resources\test-data.xml")]
// Copy the entire TestFiles folder (and all of its subfolders) into the
// deployment directory.
[DeploymentItem("TestFiles")]
DeploymentItemAttribute(string path, string outputDirectory)
outputDirectoryによって指定された展開ディレクトリのサブディレクトリに項目をコピーします。
// Creates a "Data" subfolder under the deployment directory, then copies
// test-data.xml into it. The file is reached at "Data\test-data.xml".
[DeploymentItem("test-data.xml", "Data")]
// Copies the contents of the Resources folder into a "Resources"
// subfolder of the deployment directory.
[DeploymentItem("Resources", "Resources")]
outputDirectory引数はフォルダー パスである必要があります。 ファイルの名前を変更するために使用することはできません。 別の名前のファイルを展開するには、ソース フォルダー内のファイルの名前を変更します (またはビルド後の手順を使用します)。
ソース ファイルがビルド出力ディレクトリに到達していることを確認する
相対パスはビルド出力ディレクトリに対して解決されるため、ソース ファイルまたはフォルダーが既に存在している必要があります。 これを実現するには、2 つの一般的な方法があります。
CopyToOutputDirectoryで<None>または<Content>を使用する
テスト プロジェクトにファイルを追加し、ビルド出力ディレクトリにコピーするようにマークします。
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
ビルド後、 TestFiles フォルダーは bin\<Configuration>\<TargetFramework>\TestFiles\にレプリケートされ、 [DeploymentItem("TestFiles")] は正しく解決されます。
ビルド後のターゲットを使用する
テスト プロジェクトの外部に存在するファイルの場合は、ビルドの一部としてビルド出力ディレクトリにコピーします。
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
実行時にデプロイ ディレクトリを検査する
デプロイ ディレクトリの絶対パス (たとえば、生成したプロセスに渡したり、診断のためにログに記録したりする) が必要な場合は、 TestContext.DeploymentDirectory使用します。
using System.IO;
[TestMethod]
[DeploymentItem(@"TestFiles\input.json")]
public void ProcessInput_FromDeployedFile_Succeeds()
{
string fullPath = Path.Combine(TestContext.DeploymentDirectory, "input.json");
string contents = File.ReadAllText(fullPath);
// ...
}
TestContextの詳細については、「TestContext クラス」を参照してください。
デプロイが行われない場合
既定では、MSTest は実行ごとの展開ディレクトリを作成し、そのディレクトリに項目をコピーします。
.runsettings ファイルでのデプロイを無効にして、ビルド出力ディレクトリからテストを直接実行できます。
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
デプロイが無効になっている場合、 [DeploymentItem] 属性は影響を受けず、テストはビルド出力ディレクトリ自体で実行されます。 その他の構成オプションについては、「 MSTest の構成」を参照してください。
レガシー モードと .testsettings
MSTest がレガシ モードで実行されている場合 (.testsettings ファイルが使用されている場合、またはRunSettings/MSTest/ForcedLegacyModeがtrue ファイルで.runsettingsに設定されている場合)、ビルド出力ディレクトリではなく、ソリューション ルート ディレクトリに対して相対パスが解決される可能性があります。 新しいプロジェクトではレガシ モードを使用しないでください。最新の .runsettingsベースの構成が推奨される方法です。
ベスト プラクティス
- 深い相対パスよりも
CopyToOutputDirectoryを優先します。..\..\スタイルのパスを持つソース フォルダーにはアクセスしないでください。テストは特定のリポジトリ レイアウトに関連付けられます。 最初にビルド出力ディレクトリ内のファイルをステージングします。 - デプロイ項目を小さくします。 各項目は、すべてのテスト実行に対してコピーされます。大きなファイルがテストの実行速度を低下します。
- フォルダーを使用して、関連する資産を一緒に展開します。
[DeploymentItem("TestFiles")]は、ファイルごとに数十個の属性よりも保守が容易です。 - 小さいフィクスチャには、埋め込みリソースまたはメモリ内データを優先します。 埋め込みリソースを使用すると、デプロイが不要になり、テスト時に I/O が回避されます。
- 作業ディレクトリがプロジェクト ディレクトリであることに依存しないでください。 テストの実行中、作業ディレクトリは配置ディレクトリであり、テスト プロジェクト フォルダーではありません。
こちらも参照ください
.NET