この記事では、テストの記述と整形に役立つ MSTest で使用される API と規則について説明します。
注
"Attribute" で終わる属性名は、短い形式を使用できます。
TestClass と TestClassAttribute は同等です。 パラメーターなしのコンストラクターを持つ属性では、かっこを省略できます。
テスト構造
すべての 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
-
void、Task、または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 クラスを使用して期待される結果を確認する |
| データドリブン テスト | 複数の入力を使用してテストを実行する (DataRow、 DynamicData) |
| テストのライフサイクル | アセンブリ、クラス、およびテスト レベルでのセットアップとクリーンアップ |
| 実行コントロール | スレッド化、並列処理、タイムアウト、再試行、および条件付き実行 |
| テスト組織 | カテゴリ、優先順位、所有者、メタデータ |
| Testcontext | テスト ランタイム情報にアクセスする |
属性クイック リファレンス
| カテゴリ | 属性 | 参照先 |
|---|---|---|
| テスト識別 |
TestClass、 TestMethod、 DiscoverInternals |
このページ |
| データ駆動型 |
DataRow、 DynamicData、 TestDataRow |
データドリブン テスト |
| Lifecycle |
AssemblyInitialize、 ClassInitialize、 TestInitialize、およびクリーンアップの対応部分 |
テストのライフサイクル |
| スレッド |
STATestClass、 STATestMethod、 UITestMethod |
実行コントロール |
| 並列化 |
Parallelize、DoNotParallelize |
実行コントロール |
| タイムアウト/再試行 |
Timeout、Retry |
実行コントロール |
| Conditional |
Ignore、 OSCondition、 CICondition |
実行コントロール |
| メタデータ |
TestCategory、 TestProperty、 Owner、 Priority |
テスト組織 |
| 作業の追跡 |
WorkItem、GitHubWorkItem |
テスト組織 |
アサーション
Microsoft.VisualStudio.TestTools.UnitTesting 名前空間の Assert クラスは、特定の機能を確認するために使用します。 テスト メソッドはアプリケーションでコードを実行しますが、Assert ステートメントを含める場合にのみ正確性を報告します。
MSTest アサーションは、次の内容に分かれています。
-
Assertクラス: 汎用アサーション (AreEqual、IsTrue、ThrowsException) -
StringAssertクラス: 文字列固有のアサーション (Contains、Matches、StartsWith) -
CollectionAssertクラス: コレクション アサーション (Contains、AllItemsAreUnique、AreEquivalent)
プライベート メンバーのテスト
リフレクション ラッパー クラスを使用してプライベート メンバーをテストできます。
- PrivateObject: プライベート インスタンス メソッドの場合
- PrivateType: プライベート静的メソッドの場合
ヒント
プライベート メソッドで直接テストが必要かどうかを検討します。 多くの場合、パブリック インターフェイスを使用したテストでは、より適切なカバレッジと保守性の高いテストが提供されます。
こちらも参照ください
.NET