次の方法で共有


MSTest 属性

MSTest では、カスタム属性を使用してテストを識別およびカスタマイズします。

テスト フレームワークの概要をより明確にするために、このセクションでは、Microsoft.VisualStudio.TestTools.UnitTesting 名前空間のメンバーを関連する機能グループごとにまとめています。

名前が "Attribute" で終わる属性は使用時に末尾に "Attribute" を付けても付けなくてもかまいません。 パラメーターなしのコンストラクターを持つ属性は記述時にかっこを付けても付けなくてもかまいません。 次のコード例は同じように動作します。

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

テスト クラスとテスト メソッドの識別に使用する属性

すべてのテスト クラスには TestClass 属性が必要であり、すべてのテスト メソッドには TestMethod 属性が必要です。

TestClassAttribute

TestClass 属性は、テストを含むクラスをマークし、必要に応じてメソッドを初期化またはクリーンアップします。

この属性を拡張して、既定の動作を変更または拡張できます。

例:

[TestClass]
public class MyTestClass
{
}

TestMethodAttribute

TestMethod 属性は、実行する実際のテスト メソッドを定義するために TestClass 内で使用されます。

このメソッドは、publicvoid、または Task (MSTest v3.3 以降) として定義されるインスタンス ValueTask メソッドである必要があります。 必要に応じて async にすることはできますが、async void にしてはいけません。

DataRow 属性、DynamicData 属性、またはテスト メソッドにテスト ケース データを提供する同様の属性でマークされていない限り、メソッドにはパラメーターが 0 である必要があります。

次のテスト クラスの例を考えてください。

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

データ ドリブン テストで使用する属性

次の要素を使用して、データドリブン テストを設定します。 詳細については、「データ ドリブン単体テストを作成する」および「データ ソースを定義するための構成ファイルの使用」を参照してください。

ヒント

MSTest は、組み合わせテストをネイティブでサポートしていませんが、オープンソースの Combinatorial.MSTest NuGet パッケージを使用してこの機能を追加できます。 これはコミュニティによって積極的に管理され 、GitHub で入手できます。 このパッケージは Microsoft によって管理されていません。

DataRowAttribute

DataRow 属性を使用すると、複数の異なる入力で同じテスト メソッドを実行できます。 これはテスト メソッドで、1 回または複数回使用できます。 TestMethod 属性と組み合わせる必要があります。

引数の数と型は、テスト メソッドのシグネチャと完全に一致している必要があります。 テスト メソッドパラメーターに合わせたインライン引数を使用した DataRowAttribute の使用法を示す有効なテスト クラスの次の例を考えてみましょう。

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
    public void TestMethod4(string[] input, string[] expectedOutput)
    {
        // Omitted for brevity.
    }
}

params 機能を使って、DataRowAttribute の複数の入力を取得することもできます。

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    public void TestMethod(params int[] values) {}
}

無効な組み合わせの例:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2)] // Not valid, we are passing 2 inline data but signature expects 1
    public void TestMethod1(int i) {}

    [TestMethod]
    [DataRow(1)] // Not valid, we are passing 1 inline data but signature expects 2
    public void TestMethod2(int i, int j) {}

    [TestMethod]
    [DataRow(1)] // Not valid, count matches but types do not match
    public void TestMethod3(string s) {}
}

MSTest v3 以降では、ちょうど 2 つの配列を渡す場合に、2 番目の配列をオブジェクト配列でラップする必要がなくなりました。 以前:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]v3 以降:[DataRow(new string[] { "a" }, new string[] { "b" })]

DataRowAttribute プロパティを設定することで、Visual Studio と DisplayName の各インスタンスのロガーで使用される表示名を変更できます。

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
    public void TestMethod(int i, int j) {}
}

DataRowを継承することで、独自の特殊なDataRowAttribute属性を作成することもできます。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}

[TestClass]
public class TestClass
{
    [TestMethod]
    [MyCustomDataRow(1)]
    public void TestMethod(int i) {}
}

初期化とクリーンアップを提供するために使用される属性

複数のテストに共通するセットアップとクリーンアップを独立したメソッドに抽出し、以下に示す属性のいずれかでマークして、適切なタイミング (たとえば、すべてのテストの前) に実行できます。 詳細については、「単体テストの構造」を参照してください。

アセンブリ レベル

AssemblyInitialize 属性は、アセンブリが読み込まれた直後に呼び出され、アセンブリがアンロードされる直前に AssemblyCleanup 属性が呼び出されます。

これらの属性でマークされたメソッドは、static voidでマークされたクラスで、static Taskstatic ValueTask、またはTestClassAttribute (MSTest v3.3 以降) として定義し、1 回だけ表示する必要があります。 初期化部分には、 TestContext 型のパラメーターが 1 つ必要です。クリーンアップにはパラメーターがありません。MSTest 3.8 以降では、 TestContext型のパラメーターを 1 つ持つことができます。

[TestClass]
public class MyTestClass
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup() // Starting with MSTest 3.8, it can be AssemblyCleanup(TestContext testContext)
    {
    }
}

クラス レベル

ClassInitialize 属性は、クラスが読み込まれる直前 (ただし、静的コンストラクターの後) に呼び出され、クラスがアンロードされた直後に ClassCleanup が呼び出されます。

Von Bedeutung

既定では、 ClassCleanupAttribute はアセンブリの最後のテスト ( AssemblyCleanupAttributeと同様) の後にトリガーされます。 この動作は、属性に CleanupBehavior を設定することで変更できます。 または、アセンブリ属性 ClassCleanupExecutionAttributeを使用して、アセンブリに対してこの動作をグローバルに設定することもできます。

継承動作を制御することもできます。 InheritanceBehavior.Noneを使用する現在のクラスのみ、または InheritanceBehavior.BeforeEachDerivedClassを使用するすべての派生クラスに対して実行できます。

これらの属性でマークされたメソッドは、static voidstatic Taskstatic ValueTask、または TestClass (MSTest v3.3 以降) として定義し、1 回のみ出現する必要があります。 初期化部分には、 TestContext 型のパラメーターが 1 つ必要です。クリーンアップにはパラメーターがありません。MSTest 3.8 以降では、 TestContext型のパラメーターを 1 つ持つことができます。

[TestClass]
public class MyTestClass
{
    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static void ClassCleanup() // Starting with MSTest 3.8, it can be ClassCleanup(TestContext testContext)
    {
    }
}

テスト レベル

TestInitialize 属性は、テストが開始される直前に呼び出され、テストが完了した直後に TestCleanup が呼び出されます。

TestInitializeAttribute は クラス コンストラクターに似ていますが、通常は長い初期化や非同期の初期化に適しています。 TestInitializeAttributeは常にコンストラクターの後に呼び出され、各テスト (データ ドリブン テストの各エントリを含む) に対して呼び出されます。

TestCleanupAttribute はクラス Dispose (または DisposeAsync) に似ていますが、通常は長いクリーンアップや非同期のクリーンアップに適しています。 TestCleanupAttributeは常にDisposeAsync/Disposeの直前に呼び出され、各テスト (データドリブン テストの各エントリを含む) に対して呼び出されます。

これらの属性でマークされたメソッドは、voidTaskValueTask、または TestClass (MSTest v3.3 以降) として定義し、パラメーターなしにして、1 回または複数回出現する必要があります。

[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
    }

    [TestCleanup]
    public void TestCleanup()
    {
    }
}

テスト実行の制御に使用する属性

次の属性を使用して、テストの実行方法を変更できます。

TimeoutAttribute

Timeout 属性を使用して、テスト メソッドの実行を許可する最大時間 (ミリ秒単位) を指定できます。 テスト メソッドの実行が指定した時間より長くなると、テストは中止され、失敗としてマークされます。

この属性は、任意のテスト メソッドまたは任意のフィクスチャ メソッド (初期化メソッドとクリーンアップ メソッド) に適用できます。 また、runsettings ファイルのタイムアウト プロパティを使用して、すべてのテスト メソッドまたはすべてのテスト フィクスチャ メソッドのタイムアウトをグローバルに指定することもできます。

タイムアウトが正確である保証はありません。 指定した時間が経過するとテストは中止されますが、ステップが取り消されるまでに時間がかかる場合があります。

タイムアウト機能を使用すると、テスト メソッドを実行するために別のスレッド/タスクが作成されます。 メイン スレッド/タスクは、タイムアウトを監視し、タイムアウトに達したらメソッド スレッド/タスクの監視を停止する役割を担います。

MSTest 3.6 以降では、属性に CooperativeCancellation プロパティを指定して (または、runsettings を介してグローバルに) 協調的なキャンセルを有効にすることができます。 このモードでは、メソッドはキャンセル トークンをチェックし、一般的な async メソッドと同様に通知された場合にテストを中止する役割を担います。 このモードはパフォーマンスが高く、キャンセル プロセスをより正確に制御できます。 このモードは、非同期メソッドと同期メソッドの両方に適用できます。

STATestClassAttribute

テスト クラスに適用すると、 STATestClass 属性は、クラス内のすべてのテスト メソッド (および [ClassInitialize] メソッドと [ClassCleanup] メソッド) をシングル スレッド アパートメント (STA) で実行する必要があることを示します。 この属性は、テスト メソッドが STA を必要とする COM オブジェクトとやりとりする場合に便利です。

これは Windows 3.6 以降でのみサポートされます。

STATestMethodAttribute

テスト メソッドに適用すると、 STATestMethod 属性は、テスト メソッドをシングル スレッド アパートメント (STA) で実行する必要があることを示します。 この属性は、テスト メソッドが STA を必要とする COM オブジェクトとやりとりする場合に便利です。

これは Windows 3.6 以降でのみサポートされます。

ParallelizeAttribute

既定では、テストは MSTest により順番に実行されます。 アセンブリ レベル属性 Parallelize 属性を使用して、テストを並列で実行できます。 並列処理をクラス レベル (複数のクラスを並列に実行できるが、特定のクラスのテストは順番に実行される) で行うか、メソッド レベルで行うかを指定できます。

並列実行に使用するスレッドの最大数を指定することもできます。 値 0 (既定値) は、スレッドの数がマシン上の論理プロセッサの数と等しいことを意味します。

runsettings ファイルの並列化プロパティを使用して並列処理を指定することもできます。

DoNotParallelizeAttribute

DoNotParallelize 属性を使用すると、特定のアセンブリでのテストの並列実行を防ぐことができます。 この属性は、アセンブリ レベル、クラス レベル、またはメソッド レベルで適用できます。

既定では、MSTest はテストを順番に実行するため、アセンブリ レベル の Parallelize 属性を適用した場合にのみ、この属性を使用する必要があります。

RetryAttribute

Retry属性は MSTest 3.8 で導入されました。 この属性により、失敗またはタイムアウト時にテスト メソッドが再試行されます。 これにより、再試行の最大数、再試行間の遅延時間、および遅延バックオフの種類 (定数または指数) を指定できます。

テスト メソッドには 1 つのRetryAttributeのみが存在することが予想され、RetryAttribute でマークされていないメソッドではを使用できません。

RetryAttribute は抽象 RetryBaseAttributeから派生します。 組み込みの RetryAttribute がニーズに合わない場合は、独自の再試行実装を作成することもできます。

ユーティリティ属性

DeploymentItemAttribute

DeploymentItem 属性は、配置項目として指定されたファイルまたはフォルダーを配置ディレクトリにコピーするために使用されます (カスタム出力パスを追加せずに、コピーしたファイルはプロジェクト フォルダー内のフォルダーTestResultsされます)。 配置ディレクトリには、すべての配置項目がテスト プロジェクト DLL と共に存在します。

テスト クラス ( TestClass 属性でマークされたクラス) またはテスト メソッド ( TestMethod 属性でマークされたメソッド) で使用できます。

ユーザーは、複数の項目を指定するために属性の複数のインスタンスを使用できます。

ここでは、そのコンストラクターを確認できます。

[TestClass]
[DeploymentItem(@"C:\classLevelDepItem.xml")]   // Copy file using some absolute path
public class UnitTest1
{
    [TestMethod]
    [DeploymentItem(@"..\..\methodLevelDepItem1.xml")]   // Copy file using a relative path from the dll output ___location
    [DeploymentItem(@"C:\DataFiles\methodLevelDepItem2.xml", "SampleDataFiles")]   // File will be added under a SampleDataFiles in the deployment directory
    public void TestMethod1()
    {
        string textFromFile = File.ReadAllText("classLevelDepItem.xml");
    }
}

警告

この属性を配置ディレクトリにファイルをコピーするために使用することはお勧めしません。

ExpectedExceptionAttribute

ExpectedException 属性は、テスト メソッドがスローすることが予想される例外を定義します。 予期される例外がスローされ、例外メッセージが予期されたメッセージと一致する場合、テストは成功します。

警告

この属性は下位互換性のために存在し、新しいテストには推奨されません。 代わりに、Assert.ThrowsException (MSTest 3.8 以降を使用する場合は Assert.ThrowsExactly) メソッドを使用します。

メタデータの属性

次の属性とそれらに割り当てられた値は、Visual Studio の特定のテスト メソッドに対する [プロパティ] ウィンドウに表示されます。 これらの属性は、テストのコードからアクセスするためのものではありません。 代わりに、Visual Studio の IDE から、または Visual Studio テスト エンジンによって、テストがどのように使用または実行されるかに影響します。 たとえば、これらの属性には、 [テスト マネージャー] ウィンドウや [テスト結果] ウィンドウの列として表示されるものがあり、それらを使用してテストやテスト結果をグループ化したり並べ替えたりできます。 このような属性の 1 つが TestPropertyAttribute で、これを使用して任意のメタデータをテストに追加します。

たとえば、これを使用して、テストを [TestProperty("Feature", "Accessibility")] でマークすると、このテストの対象となる "テスト パス" の名前を格納できます。 または、[TestProperty("ProductMilestone", "42")] を使用して、テストの種類のインジケーターを格納できます。 この属性を使用して作成するプロパティ、および割り当てるプロパティ値は、どちらも Visual Studio の [プロパティ] ウィンドウの [各テストで特有] という見出しの下に表示されます。

以下の属性は、それらの属性が装飾するテスト メソッドを Team Foundation Server チーム プロジェクトのプロジェクト階層内のエンティティに関連付けます。