.NET Tools

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

1.NUnitの環境を準備する

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

NUnitとは何か?

 「NUnit」は、単体テストの自動実行を支援するためのツールである。Java用のテスト・ツールである「JUnit」をベースにして、.NET Framework上で利用できるように変更を加えたものだ。ちなみに、JUnitのバリエーションはNUnitに限らず、さまざまなプログラム言語に対応したものが作られている。自動単体テスト・ツールの1つの定番といってもよい。NUnitはエクストリーム・プログラミング(XP)と呼ばれるソフトウェア開発技法と深い関係があるので、関連書籍を読むと、より理解できるだろう。NUnitはSourceForge.net上で、オープン・ソースのソフトウェアとして公開されており、だれでも無料で利用できる。

NUnitの入手先
SourceForge.nethttp://sourceforge.net/projects/nunit

 本稿執筆時点で入手可能なNUnitはバージョン2.0が最新である。本稿は、このバージョンを前提に記述している。本稿の元になった旧記事はバージョン1.10を前提にしているが、これは.NET Frameworkのベータ2ベースのもので、製品版では動作しない。また、テストの記述方法が大きく変化しており、サンプル・コードの内容もすべて新しく書き直しているので、旧記事を読んでいる読者は注意していただきたい。

 さて、具体的にNUnitとは何をしてくれるソフトなのだろうか。ひと言でいえば、プログラマーが単体テスト用のテスト・プログラムを作成し、それを実行することを支援してくれるものである。つまり、テスト・プログラムは、プログラマー自身が記述しなければならない。「そんな面倒なことやりたくない」「時間がないから無理」「テストは自分の仕事ではない」といった感想を持った方もいるかもしれないが、その判断はちょっと待っていただきたい。実際には、面倒が増えるどころか面倒は減るのである。また、必要とされる時間が短縮される場合も多い。テスト・プログラムは一種のドキュメントとして機能するので、ソース・コードについてのドキュメントの作成作業を省略できる(簡略化できる)可能性もある。魔法か手品のように思えるかもしれないが、これも1つの真実である。だまされたと思って、ひとつ以下の解説をお読みいただきたい。

 なお、今回はVisual Studio .NET(以下VS.NET)を前提に手順を説明するが、コマンドラインからでも同じことができる。またプログラム言語も今回はC#を前提にするが、ほかの.NET Framework上のプログラム言語でも同じことができる。C#版とほぼ同等のVisual Basic .NET(以下VB.NET)のソース・コードも掲載しているが、これは必ずしもVB.NETとしてベストの内容(十分吟味されたプログラム)になっているわけではないことをお断りしておく。

まず環境を準備する

 今回は、あるサーバ・プログラムで使用されるクラスをNUnitを用いて開発する手順を例にしながら、NUnitの使い方を解説したいと思う。

 例となるクラスは、最も大きなデータの処理を要求してきたユーザーについての情報を保持するために使う最大データ・サイズ記録クラスであるとする。このクラスでは、要求されたデータ・サイズの整数値とユーザー名の文字列を保存する機能が必要だとしよう。新しいユーザーの登録要求を受けたときには、要求されたデータ・サイズと現在のデータ・サイズとを比較し、要求されたデータ・サイズが大きければ最大データ・サイズの情報を更新し、そうでなければ以前の最大データ・サイズの情報を維持する。

 NUnitは、個々のクラスなど、プログラムを構成する一部分をテストするものなので、プログラム全体のことを考える必要はない(プログラム全体が完成しなくても、テストを実施することができる)。ここでは、実際のサーバ・プログラムは作らず、最大データ・サイズ記録クラスだけを作ってみよう。

 まずNUnitを入手しなければならない。NUnitのサイトより、NUnit 2.0(NUnit-V2.0.msi)をローカル・ディスクに保存して、このファイルをダブルクリックしてインストールを実行する。この際、インストール先フォルダを聞かれるが、任意のフォルダにインストールすればよい。これが完了すると、[スタート]メニューの[プログラム]−[NUnit V2.0]−[NUnit-Gui]から、テスト実行を行うツールを開くことができる。実際に正しくインストールされたことを確かめるために、試しにNUnit-Guiを実行しておこう。ただしこれを実行するには、もちろん、.NET Frameworkのランタイム機能をあらかじめインストールしておく必要がある。これでNUnitを利用する準備は完了である。

 とはいえ、このままでは何もできない。テストを実行するプログラムは自分で書く必要がある。「では、さっそくテストの対象になる最大データ・サイズ記録クラスを見て、どんなテスト・プログラムを書くべきか考えてみようか」と思った読者も多いと思う。実はまだ最大データ・サイズ記録クラスは書かれていない。それにもかかわらず、まずテスト・プログラムを書こうとしているわけである。それは順番が逆だと思った読者もいると思うが、そうではない。これが、「Test First」という方法なのである。

 ただし、最大データ・サイズ記録クラスがコーディングされていないとしても、そのクラスがどんな機能を持つべきかは、すでに検討済みであるとする。今回はテストを中心に解説するので、クラスの設計技法には足を踏み入れない。

 では、さっそくテスト・プログラム作りの手順を説明しよう。まずVS.NETで、テスト対象となるプロジェクトを作成しよう。もちろん新規に作るものだから、これから扱おうとする最大データ・サイズ記録クラスはまだプロジェクトに含まれていない。プロジェクトの種類は、Windowsアプリケーションでも、クラス・ライブラリでも何でもよい。テストの際には、このプログラム内のメソッドを呼び出すが、プログラム自体は実行しないからである。ここでは、サーバ・アプリケーションらしく「ASP.NETアプリケーション」を選んでおこう。

 さて、普通ならこのプロジェクトの中に、テスト対象となるクラスを書き始めるわけだが、Test Firstである以上、テストの方を先に書く。問題はテストを行うコードをどこに書くかである。テスト対象のクラスと同じプロジェクト内に書いても動作するが、実運用では使わないテスト機能がアプリケーションに含まれてしまうのはスマートではない。そこで、テストを行うコードは別プロジェクトのクラス・ライブラリとして作成しておこう。ソリューション・エクスプローラ内でソリューションを右クリックして、[追加]−[新しいプロジェクト]と選ぶ。そして、クラス・ライブラリのプロジェクトを新規作成しよう。ここではテストするプロジェクトをServerApp、テストを行うプロジェクトをServerAppTestと名付けている。以上の作業で、ソリューション・エクスプローラ内は、以下のような表示になる。

サーバ・アプリケーション用とテスト用の2つのプロジェクト(C#の場合)
テストを行うコードは別プロジェクトのクラス・ライブラリとして作成する。
 
サーバ・アプリケーション用とテスト用の2つのプロジェクト(VB.NETの場合)

 このままでは、テスト・メソッドからNUnitの機能が呼び出せないので、NUnitのライブラリをプロジェクトに追加しなければならない。ソリューション・エクスプローラのプロジェクト名ServerAppTestを右クリックして、[参照の追加]を選び、[参照]ボタンをクリックする。そして、NUnitをインストールしたフォルダ以下にあるbinフォルダの中から、「nunit.framework.dll」を選び[開く]ボタンをクリックする。

NUnitのライブラリへの参照をプロジェクトに追加
テスト用のプロジェクト「ServerAppTest」に対して、NUnitのライブラリ「nunit.framework.dll」への参照を追加する。

 同様に、プロジェクトServerAppTestが、プロジェクトServerAppのメソッドを呼び出せるように、プロジェクトServerAppTestにプロジェクトServerAppの参照を追加しよう。ソリューション・エクスプローラのプロジェクト名ServerAppTestを右クリックして、[参照の追加]を選び、[プロジェクト]タブをクリックする。そして、ServerAppの名前をダブルクリックし、選択されたコンポーネントの部分にServerAppの名前があることを確認してから[OK]ボタンをクリックする。

アプリケーション用プロジェクトへの参照をテスト用プロジェクトに追加
テスト用のプロジェクト「ServerAppTest」から、アプリケーション用のプロジェクト「ServerApp」にあるメソッドを呼び出せるように、テスト用プロジェクトに対してプロジェクト「ServerApp」への参照を追加する。

 次は、テスト・メソッドを書き込むためのクラスを用意しよう。テストを書き込むためのプロジェクトを作成したときに、自動的に1つのクラスが用意されているので、これの名前を変更してそのまま使おう。クラスの名前は何でもよいが、テスト対象のクラスと関連性のある名前にしておくと分かりやすいだろう。ここでは、テスト対象のクラスをMaxDataSizeRecorderとして、テストを行うクラスはMaxDataSizeRecorderTestという名前にしておこう。

 こうして用意したMaxDataSizeRecorderTestクラスは、すぐにテスト・メソッドを書き込んでも使えない。その下準備として、このクラスがテスト・メソッドを含むクラスであることを明示的に伝えるための属性を付けてやる必要がある。そのためには、いま参照を追加したnunit.framework.dllに含まれるNUnit.Framework.TestFixture属性を使用する。NUnit.Framework名前空間は何度も参照するので、usingディレクティブ(VB.NETではImportsステートメント)も追加しておこう。ここまで書き込んだ、テスト・クラスは以下のようになる。

using System;
using NUnit.Framework;

namespace ServerAppTest
{
  [TestFixture]
  public class MaxDataSizeRecorderTest
  {
  }
}
MaxDataSizeRecorderTestという名前に変更したテスト用のクラス(C#版)
このクラスにテスト用のメソッドを追加していく。クラスにはテスト・メソッドを含んでいることを示すNUnit.Framework.TestFixture属性を設定する必要がある。
 
Imports NUnit.Framework

<TestFixture()> _
Public Class MaxDataSizeRecorderTest

End Class
MaxDataSizeRecorderTestという名前に変更したテスト用のクラス(VB.NET版)

 コードを書き終えたらひとまずビルドしてみよう。エラーがなければ、自分のテスト用メソッドを書き加える準備は完了である。

 

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

本日 月間