NUnitとMSTest
MSTestはVisual Studioに付属しているので、Microsoft製であるという安心感がありますし、オープンソース系のツール利用が禁じられている現場でも使うことができます。機能的には、NUnitと比べて一長一短があります。
| NUnit(2.6) | MSTest (VS2010付属) | |
|---|---|---|
| 提供 | NUnit.org | Visual Studio(有償版)に同梱 |
| テストの作成 | すべて手書き |
製品コードから雛形を自動生成できる ※privateメソッドをテストするためのプロキシクラスも自動生成できる(注2) |
| テスト実行 |
IDEとは別(GUIまたはコンソール、注3) ※IDE内から実行するためのサードパーティツールはある |
IDE内で実行 ※コンソールからも可能 |
| アサーションの種類 | Assert.That()などもあり、先進的で豊富 | 保守的だが、型指定ができるなど.NET Frameworkの機能を生かしている部分もある |
| パラメタライズドテスト | ○ |
× ※本稿で、サポートツールを紹介 |
| データ駆動テスト |
× ※もちろんそういうコードを書けば可能 |
○ ※テストデータの供給は、データベースだけでなくExcelでも可能(注4を参照) |
|
テストのデバッグ実行 (注を参照) |
面倒 ※デバッグ対象としてNUnitを起動する |
簡単 |
| カバレッジ計測 |
面倒(Premiumエディション以上)、 または、サードパーティツールを使用 |
簡単に取得できる(Premiumエディション以上、後述) |
Visual Studio 2010(有償版)は、privateメソッドにアクセスするためのプロキシクラスを自動生成してくれます。詳しくは、「Visual Studio 単体テスト機能大全(1) 改訂版 Visual Studioで作る単体テスト、基本のき(VS2010向け改訂版)(p.3)」を参照してください。
現在はVisual Studioの中でNUnitのテストを実行するにはサードパーティ製ツールが必要ですが、Visual Studio 11ではその必要はなくなると言われています(参考 → TDD.NET「[NEWS] Visual Studio と NUnit が統合される(続) ~ Unit Test Explorer の動画」)。
データ駆動テストについては、「Visual Studio 単体テスト機能大全(4) Visual Studioで作るデータドリブンテスト」を参照してください。
また、「テストを書く」という観点から表には含めませんでしたが、Visual Studio 2010の上位版には「コード化されたUIテスト」という機能もあります。こちらは、「Visual Studio 単体テスト機能大全(6) Visual Studioで作る単体テスト、UI操作の自動実行」をご覧ください。
TDDに慣れてくると、デバッグモードでテストを走らせてステップ実行することは、ほとんどなくなります。細かいステップでテストケースを追加していれば、予想外のREDが出ても、たいていは自分のミスにすぐ気づくことができるからです。そういう意味では、デバッグ実行がしやすいかどうかは、たいして問題になりません。
MSTestでテストファースト
それでは実際にMSTestでテストファーストしてみましょう。お題は前回の記事と同じ「野球の打率計算」を使います。テストケースを作っていく順序や考え方などは、前回の記事を参照してください。ただし今回は、「お題その1」だけとします。なお、Visual Studioのユニットテスト関連機能については、WINGSプロジェクトりばてぃ氏による「Visual Studio 単体テスト機能大全」も参照してください。
Visual Studio のプロジェクトを用意する
MSTestでは、製品コードのプロジェクトとテストコードのプロジェクトを、必ず分けて作ります。Visual Studioのユニットテストをサポートする機能が、テストコード専用のプロジェクト(テストプロジェクト)でないとテストコードを認識してくれない(テストを実行できない)からです。
| 製品コード | テストコード | |
|---|---|---|
| プロジェクトの種類 | クラスライブラリ | テストプロジェクト |
| プロジェクトの名前 | Tddbc横浜 | Tddbc横浜Test |
次に、ソリューションエクスプローラー上で、[Tddbc横浜Test]プロジェクトを右クリックし、コンテキストメニューの[参照の追加...]を使い、[プロジェクト]タブで、[Tddbc横浜]プロジェクトへの参照を追加しておきます。

