|
|
.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を比較してみると、すぐに具体的に使って試すことができるだろう。
|
Insider.NET 記事ランキング
本日
月間