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

4.プログラム本体を実装する

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

プログラムを実装する

 いよいよ、本来の目的のプログラム・コードを記述する段階がやってきた。一見回りくどいことをやってきたように見えるかもしれないが、ここまで進んでくれば、具体的にどう実装すればよいか、イメージできているはずだ。

 まずは、[Test]Constructorメソッドを正しくパスするように、MaxDataSizeRecorderクラスを書き換えてみよう。

using System;

namespace ServerApp
{
  public class MaxDataSizeRecorder
  {
    public string Name = "NoName";
    public int Point = 0;
    public void SetPoint( string name, int point )
    {
    }
    public bool IsHighest( int point )
    {
      return false;
    }
  }
}
メンバ変数の初期化コードを追加したMaxDataSizeRecorderクラス(C#版)
 
Public Class MaxDataSizeRecorder
  Public Name As String = "NoName"
  Public Point As Integer = 0
  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版)

 [Test]Constructorメソッドが必要としているのは、メンバ変数に初期値を与えるだけなので、コンストラクタを作るまでもなく、「= "NoName"」や「= 0」といったメンバ変数の初期化コードを直接書き込んでしまえばよい。あまり悩むような話ではない。相変わらず裸の変数がpublicになっているのが気になるが、当面、ほかに気になることが山ほどあるので放置しておこう。

 書き終わったらビルドして、もう1度NUnitのNunit-Guiを開いてテストを実行してみよう。開いたままのNunit-Guiを閉じないでもう一度[Run]ボタンを押す場合は、[File]メニューの[Reload]を実行しておく。

初期化コードを追加した後のテスト結果
テスト用メソッドのConstructorメソッドに緑の丸印がついて、この部分のテストが成功したことが分かる。

 左側のツリーの中で、Constructorメソッドの手前が赤丸ではなく緑の丸になれば作業は成功である。作業が一歩先に進んだわけだ。

 あとの2つの失敗も、さっさとコーディングして消してしまおう。実際に書いてみたのが以下のコードである。

using System;

namespace ServerApp
{
  public class MaxDataSizeRecorder
  {
    public string Name = "NoName";
    public int Point = 0;
    public void SetPoint( string name, int point )
    {
      if( this.Point >= point ) return;
      this.Name = name;
      this.Point = point;
    }
    public bool IsHighest( int point )
    {
      return this.Point < point;
    }
  }
}
SetPointメソッドとIsHighestメソッドの追加(C#版)
 
Public Class MaxDataSizeRecorder
  Public Name As String = "NoName"
  Public Point As Integer = 0
  Public Sub SetPoint(ByVal _name As String, ByVal _point As Integer)
    If Me.Point >= _point Then Exit Sub
    Me.Name = _name
    Me.Point = _point
  End Sub
  Public Function IsHighest(ByVal _point As Integer) As Boolean
    Return Me.Point < _point
  End Function
End Class
SetPointメソッドとIsHighestメソッドの追加(VB.NET版)

 すべてのテストを満たしていれば、以下のように左側のツリーの丸印がすべて緑色になり、プログレス・バーの色は赤ではなく緑になっているはずである。

すべてのメソッドを実装した後のテスト結果
丸印とプログレス・バーがすべて緑色になり、すべてのテストが成功したことが分かる。

 これで最大データ・サイズ記録クラスは完成である。このクラスに必要な機能が何であるかは、すべてテスト・クラス上に記述されている。従ってテストによってエラーが1つも発生しないということは、これにより必要な機能がすべてそろっていると見なせる、ということである。もちろん、テスト・クラスがいい加減なら、完成とは見なせないかもしれない。クラスの実装を確実にするためには、クラスが満たすべき重要な条件については、すべてテスト・クラスに書き込んでおく必要がある。

 従来のコーディング優先のプログラミングでは、この段階に達して初めて、作成したコードが正しく機能するかどうか、あれこれと使ってみてテストするわけだが、今回のケースでは、すでにテストは終了してしまっているのである。早く家に帰って風呂にでも入ろう。しかし、本当にこれで一般的なプログラミングよりも時間の節約になっているのだろうか? 残念ながらこれまでの段階では、必ずしも時間の節約にはなっていない。テストに要する時間を先に使っているからだ。また、変数をpublicとして公開しているような不穏なコードも含まれている。このソース・コードは、現時点で要求されている機能を満たしているという意味で一応の完成をみたということはできるが、本当のゴールに到着したとはいえないのである。

コラム: C#とJavaはここが違う?
 NUnitは、Java用のツールであるJUnitの派生ソフトである。実際、NUnitの初期のバージョンは、JUnitと非常によく似た雰囲気であった。しかし、NUnit 2.0では、テスト・クラスの書き方がJUnitとはだいぶ異なっている。その変化の理由は一体何だろうか?

 JUnitでは、テスト・クラスはTestCaseクラスを継承することで記述する。それに対して、NUnit 2.0ではTestFixture属性を付けることで指定する。JUnitでは、テスト・メソッドは“test”という名前で始まるメソッド名で識別する。それに対して、NUnit 2.0ではTest属性を付けることで指定する。これらの相違により、NUnit 2.0では、実際にテストを書くために守るべきルールは少なくなっているような感じがする。その変化のポイントは、「属性」を使うか否かにあるといえるだろう。標準的なJava言語には属性はなく、C#やVB.NETにはある。そのため、C#やVB.NETでは、属性を使った指定方法を選択する自由が与えられる。NUnit2.0でも、互換のために属性を使わない方法もあることはあるが、それを積極的に使ってもらおうという意思は感じられない。

 よく繰り返されるテーマではあるが、C#とJavaはどこが違うのか、という議論のときには、属性の有無について取り上げてみるのも面白いだろう。その際、NUnitとJUnitを比較してみると、すぐに具体的に使って試すことができるだろう。

 

 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 記事ランキング

本日 月間