C# Tips
−NUnitでUnitTest−


[トップ] [目次]

UnitTestとは

たとえば、「あるクラスのあるメソッドが正しく実装できているか」をソフトウエア自体でテストしてしまおう、それがUnitTestです。 もちろん、テストコード自体は各自が必要に応じて作成する必要があります。 が、そのテストコードを実行して「成功」とか「失敗」とか表示するような共通部分を毎回作る必要はありません(誰かが一度作ってくれれば)。 そういった「共通部分」のことをテスティングフレームワークなどと呼びます。 いまでは、いろいろなテスティングフレームワークがオープンソースで公開されています。 たとえば、Java用のJUnit、C++用のCppUnit、Ruby用のRubyUnitなどなどです。
で、NUnitはC#で実装されたオープンソースの.NET用テスティングフレームワークです。


NUnitのセットアップ

NUnit.orgからダウンロードしてセットアップするだけです。


NUnitを使う

eXtremeProgramming FAQ の「Unit Test/ツールへのリンク集」に「NUnit 利用ガイド」というのがあります。 とてもよく書かれているので、ぜひ、一度読んでみてください。 ただ、残念ながらNUnit 1.11を前提に書かれているので、その点だけは注意してください。

NUnitはVer1.xとVer2.0では結構変わっています。 NUnit2.0でも1.xのコードでも問題なく使えるらしいんですが、せっかくなので2.0での使い方を書いておきます。


サンプルコード(テストされる側)

かなり意図的ですが(^^; 以下のようなクラスがあったとします。
このクラスのDivisionメソッドのテストコードを書いてみましょう。


1
2
3
4
5
6
7
8
9

using System;

namespace Sample {
    public class SampleClass {
        public double Division(double a, double b) {
            return a / b;
        }
    }
}
テストされる側のコード

サンプルコード(テストする側)

Visual Studio.NET(以下 VS.NET)でテスト用のプロジェクトを作成する手順は以下のような感じになります。

  1. VS.NETでテスト用のプロジェクトを新規作成。
    プロジェクトの種類は、C#の「クラスライブラリ」でいいでしょう。
    また、このプロジェクトは、テストされる側のソリューションの中に作っても構いませんし、別に作っても構いません (テストされるコードのEXEなりDLLなりが参照さえできれば、プロジェクト自体はどこにあっても構わないはずです)。
  2. そのプロジェクトに「プロジェクト」−「参照の追加」メニューでnunit.framework.dll (NUnit2.0を標準のままセットアップした場合は、\Program Files\NUnit V2.0\binにあります) への参照を追加(NUnit1.xではNUnitCore.dllでしたが、名前が変わったようです)。
  3. 同じく「プロジェクト」−「参照の追加」メニューでテストされるコードのプロジェクトへの参照を追加 (同じソリューションのときは「プロジェクト」タブで追加しておくのが簡単です)。

これだけの準備をしておけばテストコードが書けます。


1
2
3
4
5
6
7
8
9
10
11
12
13
14

using System;
using NUnit.Framework;

namespace Sample.Tests {
    [TestFixture]
    public class SampleTests {
        [Test]
        public void Divide() {
            Sample.SampleClass s = new Sample.SampleClass();
            double result = s.Division(4, 2);
            Assertion.AssertEquals(2.0, result);
        }
    }
}
テストコード

こんな感じです。
このようにNUnit2.0では、

といったところがNUnit1.xとの大きな違いです。
あと、テスト用のクラスはXxxTestCaseのように「名前」+「TestCase」というクラス名にするのが一般的でした。 けど、NUnit2.0ではサンプルとかドキュメントとかが一貫してXxxTestという名前になっています。 とりあえず、NUnit2.0にあわせましたが、どっちがいいのかはよくわかりません。

さて、これをコンパイルしてNunit-Gui.exeで読み込んで「Run」すればテストが実行されます。 上記のテストは必ず成功するはずなのでみごとに緑色になるはずです。

毎回、わざわざNunit-Gui.exeを起動するのが面倒という場合は、VS.NETで、

  1. ソリューションの「スタートアッププロジェクトの設定」でテスト用プロジェクトをスタートアッププロジェクトに指定する。
  2. テスト用のプロジェクトのプロパティを開く。
  3. 「構成プロパティ」−「デバッグ」を選択する。
  4. 「デバッグモード」を「プログラム」にする。
  5. 「スタートアプリケーション」にNunit-Gui.exeを指定。
  6. 「コマンドライン引数」に/assembly:Test.dllのような形でテスト用コードのDLLを指定。

としておけば、VS.NETで実行すればNunit-Gui.exe が自動的に起動します (起動するだけで自動的にテストを実行してくれるわけではありません)。
ただ、VS.NETからNunit-Gui.exeを起動すれば、どこかが赤くなったら(テストに失敗したら) 該当するテストメソッドにブレークポイントを仕掛けて、トレースで原因を調査することができます。

もっと自動化したいときはNunit-Console.exeを使えばいいでしょう。 こちらを使うとテスト結果をXMLファイルとして保存することができます。 その上で中西氏のVB.NETとC#でデザインパターン にある「Nunit V2.0のnunit-console.exeで出力されたXMLテスト結果レポートをHTMLに変換します」 のようなツールを使えば、テスト結果をHTML化することができます。 うまく使えば、テスト結果の履歴をHTMLで残すようなこともできるわけです。


とりあえず、こんなとこで

他にも[SetUp]属性、[ExpectedException]属性や[Suite]属性とTestSuiteクラスといったものが用意されています。 ただ、NUnitを使うこと自体は、たいして難しいことじゃありませんし、最近では日本語での解説もいろいろありますから、 Webを検索するなりしてみてください。 それに、NUnitは他のテスティングフレームワーク(xUnit)と基本的に同じつくりになっています。 なので、NUnit自体の解説ではなくても参考になるものが多いです (NUnit2.0は属性ベースってことで、ちょっと他のとは毛色が違うところはありますが)。

むしろ、いかにちゃんとしたテストコードを書くかのほうが難しかったりします。 テストコード自体に不備があってはテストの意味がなくなっちゃいますから。


[トップ] [目次]

株式会社ディーバ 青柳 臣一
2002/12/02