C# テスト駆動開発の実践方法:Assertクラスの基本を解説 #6

当連載ではC#でテスト駆動開発をするための基礎知識や実践方法などを解説しています。前回の「C# テスト駆動開発の実践方法:テストプロジェクトを追加する方法 #5」ではソリューションに対してテストプロジェクトを作成する方法を紹介しました。

今回はテストエクスプローラーにて、テストコードにおいてテストの合否を判定する方法について解説します。テストメソッド内においてテストの値を判定するにはAssertクラスというものを利用します。

ここではAssertクラスの基礎的な部分よく使うメソッドを紹介していきます。Assertクラスの使い方を知ってからテスト駆動開発の実践に移っていきます。

テストを判定するには

まずテストを判定する方法について解説していきます。アプリケーション開発においてテスト駆動開発をする場合は、おもにユニットテストを自動化させます。

ユニットテストではメソッドを検証することになりますが、それは少なくとも何かしらの値が「予想通りになっているか」を判定することになります。

その「何かしらの値」を判定する方法が必要になります。その値の判定がユニットテスト、およびテスト駆動開発をするために、Assertクラスを使用しなくてはなりません。

Asserクラスとは

Assertクラスとはオブジェクト動詞を比較するメソッドを集めたクラスであり、テスト駆動開発において最も使用頻度の高くなるクラスになります。

  • AreEqualメソッド
  • IsTrueメソッド
  • IsFalseメソッド
  • IsNullメソッド
  • IsNotNullメソッド

などが用意されています。コレクションの検証にはCollectionAssertクラス、特殊な文字列にはStringAssertクラスを使用しますが、ここでは基本的なAssertクラスを使います。

Assertクラスの使い方

それでは簡単にAssertクラスを使用する方法を解説していきます。前回の「C# テスト駆動開発の実践方法:テストプロジェクトを追加する方法 #5」の解説に従って、プレーンなソリューションである「App02」を作成してください。今回はAssertクラスの使い方に特化するため、テストプロジェクトの名前も変更せず「UnitTestProject1」のままにしています。App02の作成後のソリューション構成は以下のようになっています。

また画像の通りUnitTestProject1内のUnitTest1クラスに属するTestMethod1メソッドは以下の通りになっています。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
    }
}

ここから代表的な機能をいくつか見ていきたいと思います。基本的にメソッドはTestMetod1内に記載していきますので、今回はクラス等の追加はしないようにしていきます。

AreEqualメソッド

まずはAreEqualメソッドについて解説しますが、AreEqualメソッドは二つのオブジェクトを比べて同じであるかを判定します。例えば以下のような感じで使うことができます。

int num1 = 10;
int num2 = 10;
Assert.AreEqual(num1, num2);

string hello1 = "おはよう";
string hello2 = "おはよう";
Assert.AreEqual(hello1, hello2);

数値や文字列判定を行い、中身が同一であるかを判定します。中身が同一である場合はテスト結果は真となり「グリーン」になります。

IsTrueメソッド

IsTrueメソッドは値がTrueである場合にテスト結果をグリーンにしてくれるメソッドになります。ユニットテストの結果をブール値で判定したい場合などに有効ですね。

bool flg = true;
Assert.IsTrue(flg);

int num3 = 5;
Assert.IsTrue(num3 * 2 == 10);

単純にtrue / false になるブール値を渡すのもよいですが、条件式を渡して判定にするのも問題ないようになります。判定したい値がtrueであればグリーンになり、値がfalseであればレッドになります。

IsFalseメソッド

IsTrueメソッドの反対にあたるのがIsFalseメソッドになります。IsTrueは値がtrueであればグリーンでしたが、IsFalseメソッドでは値がfalseであれはグリーンになります。

bool flg2 = false;
Assert.IsFalse(flg2);

int num4 = 4;
Assert.IsFalse(num4 * 3 == 13);

IsTrueメソッドと同様に値で判定を行ってもよいですし、条件式を渡して真偽の判定を行っても良くなります。IsTrueとIsFalseは同じようなものなので、使用する局面に応じて必要な方を使うとよいと思います。

IsNullメソッド

IsTrueやIsFalseとは別にnullかどうかを判定するメソッドも用意されています。IsNullメソッドでは渡した値がNullである場合にグリーンとなり、それ以外ならばレッドになります。

int? num5 = null;
Assert.IsNull(num5);

分かりやすくするためにnullableのint型に対してnullを突っ込んで判定するようにしました。IsNullメソッドでは、たとえばユニットの戻り値がnullを返すような異常パターンの判定などに使えるでしょう。

IsNotNullメソッド

IsNullメソッドの反対にあたるのがIsNotNullメソッドです。このメソッドはIsNullメソッドの真逆にあたるので使用方法も簡単です。

int? num6 = 5;
Assert.IsNotNull(num6);

Nullでないものを拾うので、殆どの場合ではTrueになるんじゃないかと思います。IsNullは使い道がありそうですが、IsNotNullは「何か値が入っていること」程度の確認にしかならないので、あまり出番はないかもしれませんね。

Assertクラスは基本中の基本

以上、Assertクラスの代表的な機能をサンプルコードを交えて解説してきました。今後はここで紹介してきたAssertクラスの機能を駆使して、値が想定通りであるか・想定通りの処理が行われているかを確認していきます。

このクラスの基本を使用して、もう少し実践的な内容に取り組んでいきます。次回以降は簡単な機能を実装しながらテスト駆動開発の工程について解説していきます。

また、ここで記述したコード(アプリケーション)はコメント付きでGitHubに挙げておきます。「tdd-course/App02」から確認してみてください。