.NET Tools
NUnit入門 Test Firstのススメ [NUnit 2.0対応版]

3.空のメソッドを書いてNUnitを実行してみる

(株)ピーデー 川俣 晶
2003/04/26

空のメソッドを書く

 さて、テスト・メソッドが書けたとはいえ、これだけではコンパイルを通らない。何しろ呼び出し先のクラスがまだ存在しないのだから仕方がない。そこで、呼び出し先クラスを作成して、コンパイルできるようにしよう。

 まず、ServerAppTestプロジェクトにMaxDataSizeRecorderクラスを追加する。その中に、コンパイル・エラーが出ないようにするための最低限度のコードだけを書き込む。以下のような感じだろうか。

using System;

namespace ServerApp
{
  public class MaxDataSizeRecorder
  {
    public string Name;
    public int Point;
    public void SetPoint( string name, int point )
    {
    }
    public bool IsHighest( int point )
    {
      return false;
    }
  }
}
コンパイル・エラーが出ないように最低限度のコードだけを書き込んだMaxDataSizeRecorderクラス(C#版)
 
Public Class MaxDataSizeRecorder
  Public Name As String
  Public Point As Integer
  Public Sub SetPoint(ByVal name As String, ByVal point As Integer)

  End Sub
  Public Function IsHighest(ByVal point As Integer) As Boolean
    Return False
  End Function
End Class
コンパイル・エラーが出ないように最低限度のコードだけを書き込んだMaxDataSizeRecorderクラス(VB.NET版)

 くどくど説明を要することは何もないだろう。メンバ変数NameとPointは、アクセサを付けないと(プロパティにしないと)気持ちが悪いかもしれないが、当面は放置しておこう。いまのところ、クラスの実装の良し悪しは考えないでおく。

 これでエラーなくビルドできるようになったはずである。とうとう今回のテーマであるNUnitを実行する準備が整った。

 ここで、「ちょっと待て」と思った人がいるかもしれない。まだ何も具体的な実装コードを書き込んでいないのに、NUnitを実行してしまうというのか、と。まさにそのとおり。いまこそが、NUnitを実行すべき最初のときなのである。

NUnitを実行する

 まず、[スタート]メニューの[プログラム]−[NUnit V2.0]−[NUnit-Gui]を実行して、「NUnit-Gui」を開こう。そして[File]メニューから[Open]を選び、たったいまビルドしたテストのプロジェクトの生成結果(DLLファイル)を開こう。今回筆者が作成したものは、「ServerAppTest.dll」というファイル名のDLLになっていたので、これを指定した。

 すると以下のような画面になる。

NUnitの実行画面
このプログラムは、[スタート]メニューの[プログラム]−[NUnit V2.0]−[NUnit-Gui]から実行する。画面は、テスト用のプロジェクトをビルドして生成される「ServerAppTest.dll」を開いたところ。

 これでテスト実行の準備はすべて完了である。ウィンドウ内の[Run]ボタンをクリックしよう。テストが実行され、以下のような画面を見ることができるだろう。

[Run]ボタンをクリックしてテストを実行した画面
  テスト項目がツリー表示される。赤い丸はテストの失敗を示す。
  テストを実行するにはこの[Run]ボタンをクリックする。
  テストの進行状況とテスト結果を示すプログレス・バー。
  テストが失敗した場合には、AssertEqualsメソッド等で設定しておいたメッセージがここに表示される。

 では、ウィンドウの内容を説明しよう。ウィンドウの左側は、テスト項目をツリー表示している。最上位の名前は指定したDLLファイルのフルパスが表示されている。その下の階層は名前空間名、その下はクラス名である。さらにその下にテスト・メソッドの名前が列挙されている。これらの名前の前に赤丸が表示されているのは、テストに失敗したという印である。右側に見えるRunボタンは、すでにお分かりの通り、テスト実行を行う機能を持つ。その下に、赤いバーが見えるが、これはテストの進行を示すとともに、結果を色で表現する役割を持つ。赤いバーが見えているときは、テストに失敗しているということである。これが緑のバーになれば、テストに成功したことを示す。

 その下に、いくつかのタブがある。ここでは、[Errors and Failures]というタブが選択されているが、通常はここにテスト結果が表示される。このタブでは、3つのテスト失敗に関する情報が表示されている。これらの情報は、AssertEqualsメソッドやAssertメソッドによってもたらされたものである。例えば、

Constructor: recorder.Name expected: <NoName> but was: <(null)>

という表示は、Constructorはテスト・メソッド名、recorder.Nameはメッセージとして指定した文字列、NoNameは期待する値、(null)は実際の値(null値であったこと)を示している。このリストから特定の項目を選択すれば、さらにその下に、発生したコードのファイル名や行番号などの詳細情報が表示される。

 さて、ここでテストが失敗するのは当たり前である。何しろ、実装はまだ何一つ書き込んでいないのである。だがこれは無意味な失敗ではない。なぜなら、テスト・メソッドにバグが入り込んでいて、失敗するはずの条件を正しいと誤判断する可能性があるからだ。実装が何も含まれないクラスをテストして、テスト・メソッドの数と同じ数だけ失敗が報告されることが確認できれば、テスト・メソッドは間違いなく失敗を失敗として伝える能力があることを証明できる。間違った結果を正しいと報告してしまうメソッドは含まれていない、と自信を持つことができるのである。もちろん、これは100%完全な保証ではないが、何もしないよりははるかに信頼性が高い。

コラム: テストの準備と後かたづけ
 テストを行う際にはある種の前提条件が必要とされることがある。そのような条件を、テスト・メソッド内で準備するという方法もある。しかし、複数のテスト・メソッドで必要とされる準備を、個々のテスト・メソッド内にそれぞれ記述するのも無駄であるし、間違いも入り込みやすい。このような目的で使用するSetUp属性が用意されている。また、それと対になって、テスト終了後の後かたづけを行うためのTearDown属性も用意されている。つまり、テストの準備を行うメソッドを記述してそれにSetUp属性を付けておき、後かたづけを行うメソッドにTearDown属性を付けて置けばよい。

 以下は特定のファイルの内容をチェックするテスト・プログラムの例である。

using System;
using System.IO;
using NUnit.Framework;

namespace SetupTest001
{
  [TestFixture]
  public class SetupTest001
  {
    [SetUp]
    public void Init()
    {
      StreamWriter writer = new StreamWriter(@"c:\test$$$.txt");
      try
      {
        writer.WriteLine("sample");
      }
      finally
      {
        writer.Close();
      }
    }

    [TearDown]
    public void Destroy()
    {
      File.Delete(@"c:\test$$$.txt");
    }

    [Test]
    public void FileCheckSample()
    {
      StreamReader reader = new StreamReader(@"c:\test$$$.txt");
      try
      {
        Assertion.AssertEquals("テストファイルの確認","sample",reader.ReadLine());
      }
      finally
      {
        reader.Close();
      }
    }
  }
}
SetUp属性とTearDown属性を使用したメソッドの記述例(C#版)
テストの準備を行うためのメソッドにはSetUp属性を付け、その後かたづけを行うメソッドにはTearDown属性を付けて記述する。
 
Imports System.IO
Imports NUnit.Framework

<TestFixture()> _
Public Class Class1
  <SetUp()> _
  Public Sub Init()
    Dim writer As StreamWriter = New StreamWriter("c:\test$$$.txt")
    Try
      writer.WriteLine("sample")
    Finally
      writer.Close()
    End Try
  End Sub

  <TearDown()> _
  Public Sub Destroy()
    File.Delete("c:\test$$$.txt")
  End Sub

  <Test()> _
   Public Sub FileCheckSample()
    Dim reader As StreamReader = New StreamReader("c:\test$$$.txt")
    Try
      Assertion.AssertEquals("テストファイルの確認", "sample", reader.ReadLine())
    Finally
      reader.Close()
    End Try
  End Sub
End Class
SetUp属性とTearDown属性を使用したメソッドの記述例(VB.NET版)

 このサンプル・コードでは、チェック対象のファイルを作成して準備するメソッドにSetUp属性が付けられ、テスト終了後にそのファイルを取り除くメソッドにTearDown属性が付加されている。

 

 INDEX
  [.NET Tools]
  NUnit入門 Test Firstのススメ [NUnit 2.0対応版]
     1.NUnitの環境を準備する
     2.何はさておき、最初にテストを書こう
   3.空のメソッドを書いてNUnitを実行してみる
     4.プログラム本体を実装する
     5.唐突な仕様変更に対応する
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間