Assert クラスの使用
UnitTestingFramework 名前空間の Assert クラスは、個別の機能を確認するために使用します。単体テストのメソッドでは、開発コード内のメソッドのコードを実行しますが、Assert ステートメントを含めたときにのみコードの動作に関するレポートが出力されます。
メモ : |
---|
Assert ステートメントの有無に関係なく、単体テストではコード カバレッジ データを生成できます。詳細については、「方法 : コード カバレッジ データを取得する」を参照してください。 |
Assert の種類
Microsoft.VisualStudio.TestTools.UnitTesting 名前空間には複数の Assert クラスが用意されています。
テスト メソッドでは、Assert.AreEqual() などの Assert クラスのメソッドを任意の数だけ呼び出すことができます。Assert クラスには、多くの選択可能なメソッドがあり、それらのメソッドの多くには複数のオーバーロードが存在します。
CollectionAssert クラスを使用して、オブジェクトのコレクションを比較したり、1 つ以上のコレクションの状態を確認したりします。
StringAssert クラスを使用して、文字列を比較します。このクラスには、StringAssert.Contains、StringAssert.Matches、StringAssert.StartsWith など、さまざまな便利なメソッドが含まれています。
AssertFailedException 例外は、テストが失敗すると常にスローされます。タイムアウトした場合、予期しない例外がスローされた場合、または "失敗しました" の結果を出力する Assert ステートメントを含む場合、テストは失敗します。
AssertInconclusiveException は、テストで "結果を作成できません" の結果が出力されると常にスローされます。通常 Assert.Inconclusive ステートメントは、まだ編集中のテストに対して、そのテストを実行する準備ができていないことを示すために追加します。
メモ : |
---|
他の方法としては、実行の準備が整っていないテストに Ignore 属性を設定して示す方法もあります。ただし、この方法には、まだ実装していないテストの個数に関するレポートを簡単に作成できないという短所があります。 |
新規の Assert 例外クラスを作成する場合には、そのクラスに UnitTestAssertException 基本クラスを継承させると、例外が発生した場合に、その例外がテストや製品コードからスローされた予期しない例外なのか、アサーションによる失敗なのかを識別しやすくなります。
ExpectedExceptionAttribute 属性をテスト メソッドで使用して、開発コード内のメソッドによって例外がスローされることが予期される場合に、例外が実際にそのメソッドでスローされたかを確認します。
Assert.AreEqual による安全でないオーバーロード型
Assert.AreEqual メソッドには、多くのオーバーロードが存在し、個々のデータ型を比較できます。ただし、Assert.AreEqual メソッドには、ポインタ データ型など、安全でない型に対するオーバーロードは存在しません。
これを示すために、次のクラスを含む C# コンソール アプリケーションを作成します。
unsafe public class CUnsafeTest
{
private int* m_pX = null;
unsafe public void VoidPtr(void* voidPtr)
{
}
unsafe public int* ReturnPointer(float* fPtr, TestThis* pTestThis)
{
int x = 5;
return &x;
}
}
次に CunsafeTest クラス用のテストを生成します。詳細については、「方法 : 単体テストを生成する」を参照してください。次の例と同様のコードが生成されます。
[TestMethod()]
public void ReturnPointerTest()
{
unsafe
{
CodeGen.BVT.Unsafe.CUnsafeTest target;
target = new CodeGen.BVT.Unsafe.CUnsafeTest();
// TODO: Initialize to an appropriate value
System.Single* fPtr = null;
// TODO: Initialize to an appropriate value
TestThis* pTestThis = null;
// TODO: Initialize to an appropriate value
System.Int32* expected = null;
System.Int32* actual;
actual = target.ReturnPointer(fPtr, pTestThis);
Assert.AreEqual(actual, expected);
// On the preceding line, no overload is available.
}
}
この場合には、Assert.AreEqual ステートメントを、独自のカスタムな検査コードに置換する必要があります。
参照
関連項目
Microsoft.VisualStudio.TestTools.UnitTesting