Visual Studio 2008になってProfessional Editionでも単体テストを自動実行するツールが標準添付されました。
では、Visual Studio 2005までのProfessional Editionでは単体テストを自動実行する事はできないのかといえば、Visual Studioに対応した「NUnit」などのフリーの単体テスト自動実行ツールを導入すれば可能です。
会社の開発環境はVisual Studio 2005が中心であるため、社内での単体テストツールも自ずとNUnitが採用されています。
NUnit
NUnitとは
NUnitは、Java用のテストツールであるJUnitをベースにしており、SourceForge.net上でオープンソースソフトウェアとして公開されていて無料で利用できる.NET用のテストツールです。つまり、NUintの「N」は.NETの「N」になります。
そのほかにも、Ruby用のRUnitのように様々な環境に派生していますので、それらの総称として「xUnit」と呼ばれています。
NUnitを入手するには
入手元:http://sourceforge.net/projects/nunit
NUnitをインストールする
入手元からは.NET Framework 1.1と.NET Framework 2.0のNUnitが入手できる。例えば、.NET Framework 2.0用であれば、NUnit-2.4.5-net-2.0.msiを入手する。
msiファイルをダウンロードしたらダブルクリックすればWindows Installerが起動してインストール画面が表示されるので、デフォルト設定のままでよければ[Next]ボタンを連打していくだけでよい。もちろん、インストールドライブはCドライブ以外も可能で、その場合は[Next]を闇雲に連打せずにドライブ指定画面できちんとCドライブ以外を指定するようにしてほしい。
クラスライブラリをNUnitでテストする
テストされる側のクラスライブラリの用意
クラスライブラリをNUnitでテストする場合、もちろん、既存のクラスライブラリのプロジェクトを使っても構いませんが、テストファーストっぽく新規にクラスライブラリを作成する例でご紹介したいと思います。
Visual Studioで新規プロジェクトとしてテストされる側のクラスライブラリを作成し、クラスファイルにPublic Class、Public Sub、Public Function、Public Propertyを定義します。
このとき、実際の中身は記述する必要はなく、外部からの呼び出しができるようになっているまでで良いです。
NUnit用のクラスライブラリの用意
次に、IDEの[ファイル]-[追加]-[新しいプロジェクト]でNUnit用の新しいプロジェクト(クラスライブラリテンプレートを指定)を作成します。
ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[参照の追加]を指定します。[参照の追加]画面では[.NET]タグの中の[nunit.framework]を指定します。
ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[スタートアッププロジェクトに設定]を指定します。これで、この2つのソリューションは必ずNUnit用クラスライブラリから実行が始まります。
ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[参照の追加]を指定します。[参照の追加]画面では[プロジェクト]タグを選び、テストされる側のプロジェクトを指定します。
単体テスト用コードの作成
テストされる側のクラスライブラリにあるIsLoginメソッドを呼び出して、その戻り値がTrueであるならテスト成功という単体テストを行いたい場合、NUnit用クラスライブラリのクラスで次のようなテストコードを記述してビルドします。
Imports System
Imports NUnit.Framework
_
Public Class Class2
Private target As ClassLibrary1.Class1
_
Protected Sub SetUp()
target = New ClassLibrary1.Class1
End Sub
_
Protected Sub TearDown()
target = Nothing
End Sub
_
Public Sub ログインテスト()
Assert.AreEqual(True, target.IsLogin("hatsune_", "hatsunedayo"), "認証チェック")
End Sub
End Class
単体テストを記述するクラスにはTestFixture属性を付与して、NUnitのRunnerが認識できるようにします。
実際にテストを行うコードは、Test属性を付与したPublic Subとして記述します。例では1つだけ記述していますが、もちろん、いくつ定義しても構いません。NUnitのRunnerはそのすべてPublic Subを自動的に呼び出して実行してくれます。
SetUp属性がついたProtected Subは、テストを行うPublic Subが呼び出される直前に自動的に呼ばれます。テストを行うPublic Subが複数ある場合は、それぞれが呼び出される直前に1回づつ呼ばれます。今回の例では、テストするクラスライブラリのインスタンシングを行っています。
TearDown属性がついたProtected Subは、テストを行うPublic Subが呼び出された後に自動的に呼ばれます。テストを行うPublic Subが複数ある場合は、それぞれが呼び出された後に1回づつ呼ばれます。
単体テストの実行
[スタート]メニューの[プログラム]-[NUnit V2.0]-[NUnit-Gui]メニューでNUnitのRunner画面を開き、[File]-[Open]メニューで単体テスト用クラスライブラリのDLLを指定します。
ウィンドウ内の[Run]ボタンをクリックすれば、テスト成功の時は緑マーク、失敗の時は赤マークになります。このエントリのように新規にプロジェクトを作っている場合、この段階では、IsLoginメソッドの中身は空ですからTrueが返却されてくる事はありません。よって、必ず赤マークがつくはずです。
あとはテストケースを増やし、そのテストケースすべてが緑マークになるようにIsLoginの中身をコーディングしていく事になります。
UnitRun利用のお勧め
NUnit付属のRunnerは使い勝手が良いとも言えませんし、あまりデザイン的にもかっこよくありません。
そのため、以前にもご紹介しましたが、RunnerとしてはReSharper UnitRunをつかっています。
ソリューションエクスプローラでソリューションを右クリックして[Run Unit Tests]で実行できるなど非常に便利ですよ。