単体テストでの MSTest フレームワークの使用

MSTest フレームワークは、Visual Studio での単体テストをサポートしています。 単体テストをコーディングするときに、Microsoft.VisualStudio.TestTools.UnitTesting 名前空間のクラスとメンバーを使用します。 コードから生成された単体テストを調整するときにも、それらを使用できます。

フレームワークのメンバー

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

注意

名前が "Attribute" で終わる属性要素は、最後に "Attribute" を付けても付けなくても使用でき、括弧を付けても付けなくてもパラメーターなしのコンストラクターに使用できます。 たとえば、次のコード例は同じように機能します。

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

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

すべてのテスト クラスには TestClass 属性が必要であり、すべてのテスト メソッドには TestMethod 属性が必要です。 詳細については、「単体テストの構造」を参照してください。

TestClassAttribute

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

この属性は、動作を更新または拡張するために拡張できます。

例:

[TestClass]
public class MyTestClass
{    
}

TestMethodAttribute

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

メソッドは、public void または public Task (必要に応じて async) として定義されたインスタンス メソッドで、パラメーターなしにする必要があります。

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

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

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

DataRow

DataRowAttribute を使うと、テスト メソッドの呼び出し時に使用されるインライン データを指定できます。 これはテスト メソッドで、1 回または複数回使用できます。 TestMethodAttribute または DataTestMethodAttribute と組み合わせる必要があります。

引数の数と型は、テスト メソッドのシグネチャと完全に一致している必要があります。

有効な呼び出しの例:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f) {}
    
    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines) {}

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o) {}

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

params 機能を使って、DataRow の複数の入力を取得することもできる点に注意してください。

[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) {}
}

Note

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

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

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

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

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

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

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

次のいずれかの属性で装飾されたメソッドは、指定した時点で呼び出されます。 詳細については、「単体テストの構造」を参照してください。

アセンブリ

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

これらの属性でマークされたメソッドは、TestClassstatic void または static Task として定義し、1 回だけ表示する必要があります。 初期化部分には、TestContext 型の 1 つの引数と、引数なしのクリーンアップが必要です。

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

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [AssemblyInitialize]
    public static async Task AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static async Task AssemblyCleanup()
    {
    }
}

クラス

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

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

クラスのクリーンアップをクラスの末尾またはアセンブリの末尾で実行するかどうかを構成することもできます (EndOfClass が既定であり、ClassCleanup 動作のみであるため、MSTest v4 以降ではサポートされなくなりました)。

これらの属性でマークされたメソッドは、TestClassstatic void または static Task として定義し、1 回だけ表示する必要があります。 初期化部分には、TestContext 型の 1 つの引数と、引数なしのクリーンアップが必要です。

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

    [ClassCleanup]
    public static void ClassCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [ClassInitialize]
    public static async Task ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static async Task ClassCleanup()
    {
    }
}

テスト

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

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

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

これらの属性でマークされたメソッドは、TestClassvoid または Task として定義され、パラメーターがなく、1 回または複数回表示する必要があります。

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

    [TestCleanup]
    public void TestCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [TestInitialize]
    public async Task TestInitialize()
    {
    }

    [TestCleanup]
    public async Task TestCleanup()
    {
    }
}

単体テストでは、さまざまな種類のアサーション、例外、および属性を使用して、特定のアプリケーションの動作を確認できます。 詳細については、Assert クラスの使用に関するページを参照してください。

TestContext クラス

次の属性とそれらに割り当てられた値は、Visual Studio Properties で特定のテスト メソッドの [プロパティ] ウィンドウに表示されます。 これらの属性は、単体テストのコードからアクセスするためのものではありません。 代わりに、Visual Studio の IDE、または Visual Studio テスト エンジンのいずれかによる単体テストの使用法または実行方法に影響します。 たとえば、これらの属性には、 [テスト マネージャー] ウィンドウや [テスト結果] ウィンドウの列として表示されるものがあり、それらを使用してテストやテスト結果をグループ化したり並べ替えたりできます。 このような属性の 1 つに TestPropertyAttribute があります。この属性を使用して、任意のメタデータを単体テストに追加できます。 たとえば、これを使用し、単体テストを [TestProperty("TestPass", "Accessibility")] とマークして、このテストの対象となる "テスト パス" の名前を格納できます。 または、[TestProperty("TestKind", "Localization")] を使用して、テストの種類のインジケーターを格納できます。 この属性を使用して作成するプロパティ、および割り当てるプロパティ値は、どちらも Visual Studio の [プロパティ] ウィンドウの [各テストで特有] という見出しの下に表示されます。

DeploymentItemAttribute

MSTest V2 フレームワークでは、配置項目として指定されたファイルまたはフォルダーを配置ディレクトリにコピーするための DeploymentItemAttribute が導入されました (カスタム出力パスを追加せずに、コピーしたファイルがプロジェクト フォルダー内の 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");
    }
}

テスト構成クラス

レポートの生成に使用される属性

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

プライベート アクセサーと共に使用するクラス

プライベート メソッドの単体テストを生成できます。 生成するとプライベート アクセサー クラスが作成され、このクラスにより、PrivateObject クラスのオブジェクトがインスタンス化されます。 PrivateObject クラスは、プライベート アクセサー プロセスの一部としてリフレクションを使用するラッパー クラスです。 これは PrivateType クラスに似ていますが、PrivateType クラスは、プライベート インスタンス メソッドの呼び出しではなく、プライベート静的メソッドの呼び出しに使用されます。

参照