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


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



  1. テスト対象メソッドを右クリックし、「単体テストの作成」を実行

  2. テスト用のメソッドが生成される(ファイルやクラスがなければもちろん作成されます)

  3. 一通り自動生成されたテストコードを説明

  4. (おもむろに)Assert.Inconclusive() を削除(またはコメントアウト)
    # いや、実際はちゃんと軽く説明しますが・・・

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


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



/// <summary>
///
SayHello のテスト
///</summary>
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\Fabrikam", "/")]
[UrlToTest("http://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() が必要なわけです。そして、きちんとテストコードが書かれたあとには役目を終えるわけです。


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


ながさわ


Comments (2)

  1. こんにちは。最近のセミナーなどで単体テスト機能のデモンストレーションをご覧いただくときに、まず最初に以下のステップをご覧いただきます: テスト対象メソッドを右クリックし、「単体テストの作成」を実行 テスト用のメソッドが生成される

  2. MSDN オフラインセミナー 全国ツアー <チーム開発編>にご参加いただきありがとうございました。 このページでは、セミナーでご覧いただいたデモンストレーションでのオペレーションやテクニックについて主に、過去、そしてこれからこのブログに投稿する(した)ものを紹介する形でご紹介いたします。

Skip to main content