ユニット テストの構造

更新 : 2007 年 11 月

単体テストとは、C#、Visual Basic、または Visual C++ で記述されたクラスのメンバであるメソッドです。

ms182517.alert_note(ja-jp,VS.90).gifメモ :

C++ 実行コードで単体テストを使用する方法および C++ で記述された単体テストを使用する方法の詳細については、「ユニット テストと C++」を参照してください。

Team System テスト ツール で識別される単体テストの場合、このソース コード ファイルはテスト プロジェクトに存在する必要があり、そのテスト プロジェクトは Visual Studio ソリューションの一部である必要があります。このプロジェクトまたはソリューション全体をビルドすると、テスト プロジェクトは、実行可能単体テストを含むアセンブリにビルドされます。

すべての単体テスト メソッドは、[TestMethod()] 属性 (Visual Basic の場合は <TestMethod()>) でマークが付けられており、[TestClass()] クラスのメンバです。このクラスは、名前空間 Microsoft.VisualStudio.TestTools.UnitTesting で定義されています。単体テストを生成すると、生成されたファイルの先頭の using ステートメントまたは Imports ステートメントに、この名前空間が含まれています。

単体テストの属性とプロパティ

特定の単体テスト機能を有効にするには、単体テスト メソッドの [TestMethod()] 属性、およびその子クラスの [TestClass()] 属性だけでなく、その他の属性も使用されます。そのような属性の例には、[TestInitialize()] および [TestCleanup()] があります。単体テストが実行される環境を準備するには、[TestInitialize()] とマークが付けられたメソッドを使用します。これを行う目的は、単体テストの実行で既知の状態を確立することです。たとえば、[TestInitialize()] メソッドを使用して、テストに使用する特定のデータ ファイルをコピー、変更、または作成できます。

テストが実行された後で、環境を既知の状態に戻すには、[TestCleanup()] とマークが付けられたメソッドを使用します。つまり、フォルダのファイルを削除したり、データベースを既知の状態に戻したりすることを意味します。オーダー エントリ アプリケーションで使用されるメソッドをテストした後で、在庫データベースを初期状態にリセットすることがこの例です。さらに、ファイナライザ メソッド内ではなく、[TestCleanup()] メソッド内または ClassCleanup メソッド内のクリーンアップ コードを使用することをお勧めします。ファイナライザ メソッドからスローされる例外はキャッチされず、予期しない結果が生じる可能性があります。

テスト クラスで重要なプロパティは、TestContext プロパティです。このプロパティには、現在実行している単体テストの名前、配置ディレクトリ、ログ ファイルの名前、データ ドリブン テストの場合は接続しているデータベースなどの情報が含まれます。TestContext プロパティは、TestContext インスタンスを返します。詳細については、「TestContext クラスの使用」を参照してください。

単体テストの例

C# で記述された簡単な単体テストを次のコード スニペットに示します。

[TestMethod()]
public void DebitTest()
{
    string customerName = "Mr. Bryan Walton"; 
    double balance = 11.99; 
    BankAccount target = new BankAccount(customerName, balance);
    double amount = 11.22; 
    target.Debit(amount);
    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
    //Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

別の例については、「データ ドリブン ユニット テストのコーディング」を参照してください。

単体テストの結果

単体テストに合格したことを確認する方法は 3 種類あります。

  • 1 つ以上の Assert ステートメントを使用して、特定の結果を検証します。詳細については、「Assert ステートメントの使用」を参照してください。

  • スローされた例外がないことを確認します。この場合も、1 つまたは複数の Assert ステートメントを使用することをお勧めします。

  • 特定の例外がスローされたことを確認します。これを行うには、ExpectedExceptionAttribute 属性を使用します。

Assert ステートメントの使用

テストで生成される成功または失敗という結果が、テストで完了するアクションよりも有益または重要である場合は、テストのコードで 1 つ以上の Assert ステートメントを使用する必要があります。

テスト エンジンでは、それぞれの単体テストが合格状態で開始されていると想定されます。Assert ステートメントで合格状態と矛盾する結果 (成功から失敗または結果を作成できません) が生成されない限り、または ExpectedExceptionAttribute 属性で指定されていない例外がスローされない限り、テストはその状態のままになります。つまり、Assert ステートメントのない単体テストの場合は、実行されるごとに結果成功が生成されます。これは必ずしも意味のないテストではありません。例外をスローすることなく実行できることを確認するために、コードを検証する必要があります。テストによって決定的な結果が生成されたかどうか、さらには Assert ステートメントを含んでいたかどうかにかかわらず、単体テストで検証されるコードは、コード カバレッジ統計で扱われたものとして報告されます。

ただし、特定のアクションが実行されたこと、または特定の状態に達したことを検査するには、Assert を使用する必要があります。Microsoft.VisualStudio.TestTools.UnitTesting 名前空間では、複数の Assert ステートメントを使用できます。さまざまな Assert ステートメントを使用することで、柔軟に処理できます。たとえば Assert.Fail() ステートメントを使用して、テストを強制的に失敗させることができます。これらの Assert ステートメントだけでなく、if ブロックで Assert ステートメントを使用することで、独自のカスタム機能を構築することもできます。

テストが返す結果にかかわりなく、Assert ステートメントに基づいてテストは合格または失敗します。テストに複数の Assert ステートメントが含まれている場合、状態を失敗またはInconclutiveに変更する Assert ステートメントが出現するまで、テストの状態は成功のままです。

詳細については、「Assert クラスの使用」を参照してください。

参照

参照

Microsoft.VisualStudio.TestTools.UnitTesting

その他の技術情報

ユニット テストの作成