はじめに
C#でTDDしている開発者にとって、おそらく一番なじみのあるテスティングフレームワークはNUnitでしょう。今年の2月に、そのVersion 2.6が正式リリースされました。2.x系はこれが最後のリリースとなり、次はVersion 3になるとされています(NUnit Roadmap参照)。この機会に、NUnitの基本機能から、2.6で追加された新機能まで、全体を一通り把握しておきましょう。
本記事では、TDDの話からは離れて、NUnitの機能の紹介だけをします。それでも膨大な量がありますので、記事では概要を述べるだけに留めてサンプルコードの掲載を省略した部分がかなりあります。ぜひサンプルソースもダウンロードして読んでください。また、まず使わないだろうと思われる機能や、Assert.That()
で使うたくさんの制約・修飾子なども説明していませんので、さらに深く学びたい方はNUnitのドキュメント(英文)をあたってください。
対象読者
- TDDに興味をお持ちの.NET Frameworkの開発者。
- テストの自動化に興味をお持ちの.NET Frameworkの開発者。
必要な環境
サンプルコードを試してみるには、C# 2010(Expressで可)とNUnit 2.6が必要です。本稿執筆時点では、下記から入手できます。
- C# 2010 Express: Microsoft Visual Studio Express
- NUnit 2.6: NUnit V2 2.6.0
- NUnitのインストール手順: NUnit 2.5 の導入 Step by Step(筆者サイト、旧バージョンでの説明ですが基本的に同じです)
これだけで、どんなテストだって書ける! ~ Assert.IsTrue()
(サンプルコード:「その01_基本」クラス)
自動化されたユニットテストを作るには、プログラムを実行してみて期待通りの結果が得られたかどうかを判定するというコードを書きます。NUnitでは、3つのことを知っていれば、極端な話ですがどんなテストでも書くことが可能です。
TestFixture
属性:テストクラスに付けるTest
属性:テストメソッドに付けるAssert.True()
(またはIsTrue()
)メソッド
[TestFixture] public class その01_基本 { [Test] public void Test01_IsTrueだけ知っていればどんなテストだって書ける() { var 期待値 = 3; //実行した結果こうなるはず、という値。即値(リテラル)で書く。 var 実際の値 = 整数.加算する(1, 2); //テスト対象を実行して、結果を取り出す。 Assert.True(期待値 == 実際の値); //実行した結果を検証する } }
NUnitのテストランナー(nunit.exe)は、TestFixture
属性の付けられたクラスにユニットテストが記述されていると認識し、Test
属性の付けられたメソッドを抽出して実行します。実行して、メソッド中のAssert
クラスに対する呼び出しが例外を出したらテストは失敗(RED)、そうでなければ成功(GREEN)とレポートします。Assert.True()
では、引数がfalse
だったら失敗とレポートされます。
なお、Assert.True()
に限らずAssert
クラスが持っている検証のためのメソッド(アサーション)には、失敗時に指定したメッセージを出すためのオーバーロードがたいてい用意されていますので、有効に活用してください。
var n = 3; var m = 4; Assert.True(n == m, "{0}と{1}は等しくありません。", n, m); /* [実行結果]
CsTdd03Tests.その1_基本.Test01B_失敗時のメッセージ2_RED:
3と4は等しくありません。 Expected: True But was: False */