次の方法で共有


MSTest でテストを記述する

この記事では、テストの記述と整形に役立つ MSTest で使用される API と規則について説明します。

"Attribute" で終わる属性名は、短い形式を使用できます。 TestClassTestClassAttribute は同等です。 パラメーターなしのコンストラクターを持つ属性では、かっこを省略できます。

テスト構造

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

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_TwoNumbers_ReturnsSum()
    {
        // Arrange
        var calculator = new Calculator();

        // Act
        int result = calculator.Add(2, 3);

        // Assert
        Assert.AreEqual(5, result);
    }
}

TestClassAttribute

TestClassAttributeは、テストを含むクラスをマークし、必要に応じて、メソッドを初期化またはクリーンアップします。 この属性を拡張して、テスト クラスの動作をカスタマイズできます。

TestMethodAttribute

TestMethodAttributeは、実行するテストとしてメソッドをマークします。 テスト メソッドは次のようにする必要があります。

  • インスタンス メソッド (静的ではない)
  • Public
  • voidTask、またはValueTaskを返します (MSTest v3.3 以降)
  • データ ドリブン属性を使用しない限り、パラメーターなし
[TestClass]
public class TestMethodExamples
{
    [TestMethod]
    public void SynchronousTest()
    {
        Assert.IsTrue(true);
    }

    [TestMethod]
    public async Task AsynchronousTest()
    {
        await Task.Delay(100);
        Assert.IsTrue(true);
    }
}

Warnung

テスト メソッドには async void を使用しないでください。 代わりに、async Task タグまたは async ValueTask タグを使用してください。

DiscoverInternalsAttribute

DiscoverInternalsAttribute アセンブリ属性を使用すると、MSTest はinternalのテスト クラスとメソッドを検出できます。 既定では、 public テストのみが検出されます。 この属性は、内部型をパラメーターとして使用するパラメーター化されたテストがある場合に特に便利です。

[assembly: DiscoverInternals]

internal record TestInput(int Value, string Description);

[TestClass]
public class CalculatorTests
{
    internal static IEnumerable<TestInput> TestData
    {
        get
        {
            yield return new TestInput(1, "one");
            yield return new TestInput(2, "two");
        }
    }

    [TestMethod]
    [DynamicData(nameof(TestData))]
    internal void Add_WithTestInput_ReturnsExpected(TestInput input)
    {
        var calculator = new Calculator();
        int result = calculator.Add(input.Value, 1);
        Assert.AreEqual(input.Value + 1, result);
    }
}

DiscoverInternalsしないと、テスト メソッドとその内部TestInputパラメーター型は、テスト ランナーによって検出されません。

主要な概念

MSTest のドキュメントはトピック別に整理されています。

トピック Description
アサーション (命題) Assert クラスを使用して期待される結果を確認する
データドリブン テスト 複数の入力を使用してテストを実行する (DataRowDynamicData)
テストのライフサイクル アセンブリ、クラス、およびテスト レベルでのセットアップとクリーンアップ
実行コントロール スレッド化、並列処理、タイムアウト、再試行、および条件付き実行
テスト組織 カテゴリ、優先順位、所有者、メタデータ
Testcontext テスト ランタイム情報にアクセスする

属性クイック リファレンス

カテゴリ 属性 参照先
テスト識別 TestClassTestMethodDiscoverInternals このページ
データ駆動型 DataRowDynamicDataTestDataRow データドリブン テスト
Lifecycle AssemblyInitializeClassInitializeTestInitialize、およびクリーンアップの対応部分 テストのライフサイクル
スレッド STATestClassSTATestMethodUITestMethod 実行コントロール
並列化 ParallelizeDoNotParallelize 実行コントロール
タイムアウト/再試行 TimeoutRetry 実行コントロール
Conditional IgnoreOSConditionCICondition 実行コントロール
メタデータ TestCategoryTestPropertyOwnerPriority テスト組織
作業の追跡 WorkItemGitHubWorkItem テスト組織

アサーション

Microsoft.VisualStudio.TestTools.UnitTesting 名前空間の Assert クラスは、特定の機能を確認するために使用します。 テスト メソッドはアプリケーションでコードを実行しますが、Assert ステートメントを含める場合にのみ正確性を報告します。

MSTest アサーションは、次の内容に分かれています。

プライベート メンバーのテスト

リフレクション ラッパー クラスを使用してプライベート メンバーをテストできます。

  • PrivateObject: プライベート インスタンス メソッドの場合
  • PrivateType: プライベート静的メソッドの場合

ヒント

プライベート メソッドで直接テストが必要かどうかを検討します。 多くの場合、パブリック インターフェイスを使用したテストでは、より適切なカバレッジと保守性の高いテストが提供されます。

こちらも参照ください