【Team System】単体テストの Assert.Inconclusive()

こんにちは。最近のセミナーなどで単体テスト機能のデモンストレーションをご覧いただくときに、まず最初に以下のステップをご覧いただきます:

  1. テスト対象メソッドを右クリックし、「単体テストの作成」を実行
  2. テスト用のメソッドが生成される(ファイルやクラスがなければもちろん作成されます)
  3. 一通り自動生成されたテストコードを説明
  4. (おもむろに)Assert.Inconclusive() を削除(またはコメントアウト)
    # いや、実際はちゃんと軽く説明しますが・・・

と、Assert.Inconclusiove() を削除(またはコメントアウト)してしまってます。

ちなみに、自動生成されるテストメソッドは、大体以下のようなものになります:

/// <summary>
///SayHello のテスト
///</summary>
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\Fabrikam", "/")]
[UrlToTest("https://localhost:777/")]
public void SayHelloTest()
{
Translation target = new Translation(); // TODO: 適切な値に初期化してください
string culture = string.Empty; // TODO: 適切な値に初期化してください
string expected = string.Empty; // TODO: 適切な値に初期化してください
string actual;
actual = target.SayHello(culture);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("このテストメソッドの正確性を確認します。");
}

※この例は、ASP.NET 上で Translation.SayHello() をテストするためのコードになっているので、ちょっと複雑な属性がついていますが、これも自動生成されてます。

さて、本題の Assert.Inconclusive() です。引数として "このテストメソッドの正確性を確認します。" という文字列を渡しています。この文字列は、この Assert が実行されたときに、テスト結果として出力されます。もう少しわかりやすいメッセージにすると、"このテストメソッドの正確性を確認してください。" というべきでしょうか。

ちょうどいいので、このメッセージから推察してみましょう。この Assert が実行されると、「正確性を確認してください」と言われるわけですので・・・このテストメソッドは、テストとしての正確性が確認されていない ということになりますね。いや、もっというと、このテストメソッドは、テストとしてちゃんと確認とれてますか?というフレンドリーな投げかけに思えてきます。

そうです。この Assert は、テストコードが自動生成されたあとに、目的に合わせてテストコードを変更していない(テストしたい内容を記述していない)ことを示しています。

自動生成されたまま、そのままで、あることを教えてくれています。

では、どうするべきかというと、適切に変更を加え(上記の例だと、TODOコメントがある個所が主に変更すべきポイントになります)、テストしたいことが書けたら、Assert.Inconclusive() を削除するか、コメントアウトするかするわけです。

「んな、どうせ削除するなら最初から生成せんでよ」と思われるかもしれませんが、これが自動生成されているのは非常に大きな意味があります。

それは、自動生成されたテストがそのままテスト成功になっては困る ということです。テストコードが適切なものである(OK なものは OK で、NG なものは NG)ことを保証しなければそのテストの信頼性は確保できません。テストコードが適切でないのにテストが OK になったら困るんです(そのテスト対象メソッドの性格にもよりますが、そのままでもOKになるケースもあるわけですね。上記の例だと SayHello の引数に string.Empty を与えると、string.Empty を返すとすると、そのままでテストが OK になってしまいます)。

自動生成されたテストコード( ≒ そのまま OK になっては困るもの)は NG となっていないといけないといえますね。そのためにも、Assert.Inconclusive() が必要なわけです。そして、きちんとテストコードが書かれたあとには役目を終えるわけです。

このあたりは、テスト駆動開発における、レッドの意味に近いものがあります。まず、失敗することを確認すると。

ながさわ