NSpec を使って .NET Framework 2.0 のテストをする

まだ 2.0。。。

はい、弊社の .NET Framework はまだ 2.0 です。今や最新版の半分という状況で、かなりゲンナリしておりますががんばっております。

発端は RSpec

別事業部は Ruby on Rails で開発を行っており、たまたまそこにパートナーで Ruby がかなりデキル人が来ていてタイミング良く RSpec のレクチャー会に参加できました。
いやー、WEB+DB とか読んでてスゴイスゴイとは思ってましたが、いざライブコーディングされるとその素敵さはすさまじいですね。

まずは IronRuby + RSpec でやってみた。が。。。

IronRuby と RSpec の概要 - MSDN とか見つつやっていくと割と簡単にできました。
RSpec のテスト自体も楽勝で動作しました。唯一上記の記事通りいかなかったのは記事の執筆された時期から RSpec のバージョンも上がったせいか実行コマンドが異なりました。
以下で動作しました。

>ir -S rspec -fs sampletest_spec.rb
RSpec 標準の Mock が動作しない!!

これが致命的でした。ぶっちゃけ Mock をさせないと話しになりません。エラーメッセージ的には型の不一致エラーが出ているのですが、Ruby なのにそんなのおかしいじゃないかと。
以下のサイトで紹介されているように Caricature を使用すればいけるようなのですがここで少しモチベーションダウンしてしまった訳です。。

Write your Tests in RSpec with IronRuby - Kazi Manzur Rashid's Blog

NSpec があるよ!

と、どうやら NSpec の開発者らしき方から情報をもらい、どうやら .NET でも似たような事ができると知りました。

探していると同じようなライブラリに MSpec というのもあったのですが、せっかくなので NSpec から試してみる事に。

NSpec

NSpec

NSpec は .NET Framework 4 が必要だ。

いきなり挫折しそうになりました。。だってうちは 2.0 なんだから、そんな事を思っていたら、テストだけ 4 でやればいい的な事を言われ、なるほどと。

Visual Studio 2010 Express Edition のインストール

まだライセンスをくれと上司に言える状態でもないので、とりあえず Visual Studio 2010 Express Edition をインストールしました。
.NET Framework 4 もこれで一緒に入ります。

あれ、拡張機能マネージャーコンソールが無い。。。

これはよく分からないのですが、 Express Edition にはコンソールがありませんでした。これでは NSpec のページに書いてある通りにインストールができないじゃないか!

NuGet をインストールしようとしても「そのバージョンにはインストールできねぇよ」と言われる始末。。どうしようも無い。ライセンス欲しい。

NSpec のバイナリをダウンロードして参照させる

諦めて普通に dll を参照させる方針に切り替えました。
Github にバイナリが置いてあるのでそれをダウンロード。
NSpec ダウンロード

後は普通に参照設定させるだけです。
ちなみに NSpec 用のプロジェクトはクラスライブラリで作る必要があります。

最初のテストを書いてみる

テスト対象のクラスをビルドしバイナリ (exeやdll)を作成しそれを NSpec 用のクラスライブラリの参照に加えます。
テストを回すためにもテスト対象の Debug フォルダ以下のバイナリを直接参照した方がいいでしょう。

using Sample; // テスト対象の名前空間

using NSpec;

namespace NSpecFirstSample {
    public class first_spec : nspec {
        void first_test() {
            it["最初のテストです"] = () => {
                var test = new TestClass();
                test.should_not_be_null(); // 単純な存在チェック
            };
        }
    }
}

実行は以下のようにします。 NSpecFirstSample.dll は NSpec 用のクラスライブラリです。

> NSpecRunner.exe NSpecFirstSample.dll
firstspec
  first test
    最初のテストです

1 Examples, 0 Failed, 0 Pending

おおー!できましたね!マッチャーがどの程度 RSpec に追随しているのかはまだ分かりませんが、テストのレポートもなかなか良い感じです。

RSpec 程はコードはスッキリしませんがなかなか良いのではないでしょうか。