DHJJ [Hatsune's Journal Japan] blog

Hatsune's Journal Japan blog

目次

Blog 利用状況

ニュース

あわせて読みたいブログパーツ
Firefox 3

運営サイト

Hatsune's Journal Japan
DHJJ

著作など

資格など

MVP
Microsoft MVP for Visual Basic
(April 2008 - March 2011)

ACE
OCP
MCP

書庫

日記カテゴリ

わんくま同盟

単体テストやってますか?

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]で実行できるなど非常に便利ですよ。

投稿日時 : 2008年9月4日 12:13

Feedback

# re: 単体テストやってますか? 2008/09/04 13:08 επιστημη

> JetBrains officially stops supporting ReSharper UnitRun
しくしくしくしくしくしく。

# re: 単体テストやってますか? 2008/09/04 17:34 biac

しくしくしくしくしくしく。 ^2

まぁ、 でも、 バイナリが書き変わったことを NUnit GUI が勝手に察知してリロードしてくれるようになったんで、 ビルドしたらボタン押すだけですけど f(^^;

# re: 単体テストやってますか? 2008/09/04 23:19 オガシン

さいきんこのような、機会的に単体テストしてくれるやつに興味があります。
世間的には単体、PGのUnit単位(ステップ単位って言いたいです)の
テストは自動でやるのが流行ってるのですかね、
使いこなせたら、だいぶ効率よくなりそうですねー

P.S.俺のブログの変な表示部分は</P>タグがぬけてました
コレで大丈夫かとおもいますが。。。指摘ありがとうございます。

# re: 単体テストやってますか? 2008/09/05 11:01 fnya

ReSharper UnitRunというものがあるんですね。知りませんでした。

こちらでは、Visual Studio のアドインであるTestDriven.NETを使ってます。
これも右クリックからNUnitを簡単に実行できるのでお気に入りです。有償ですが。。。

TestDriven.NET
http://testdriven.net/

タイトル  
名前  
Url
コメント