チーム開発のための .NET 開発環境の整備(TDDの準備2)

.NETでのチーム開発のための環境整備を社内で作成しているところですが、備忘もかねて作業記録や気が付いた点など書いていきます。


今回はTDD開発進めるにあたり準備することを記載します。

今回の概要

  1. 単体テストフレームワーク(NSpec)
  2. Jenkinsの設定

今回の環境

  • VisualStudio 2012
  • Entity Framework 5.0
  • ASP.NET MVC4
  • Jenkins

1. 単体テストフレームワーク(NSpec)

NSpecRspecのような記述ができるようNUnitを拡張したライブラリです。*1

RSpecはこのような記述でテストコードが記述できるテスティングフレームワークです。

describe Array, "が空の場合:" do
  before do
    @empty_array = []
  end

  it "#empty? は true であること" do
    @empty_array.should be_empty
  end

  it "#size は 0 であること" do
    @empty_array.size.should == 0
  end

  after do
    @empty_array = nil
  end
end

このように記述に振舞いを示す語彙を使用できることで、テストコード自体の可読性を高めようとするものになります。 BDDの準備1でも同様の目的でSpecFlowというテスティングフレームワークを紹介しましたが SpecFlow(Cucumber)は受け入れテストに用い、NSpec(Rspec)はNUnitなどの代わりに単体テストに用いるのが一般的のようです。

インストール

テスト用のプロジェクトを「クラスライブラリ」で作成します。 パッケージマネージャーコンソールを開いて既定のプロジェクトを今作成したテスト用プロジェクトにしてコンソール画面で「Install-Package nspec」と入力してインストールをします。

テストの記述については、Nspecの公式ページにサンプルがありますのでそちらをご覧ください。 また、Nspecの基となったRspecについて以下の記事で理解を深めるとやりやすいと思います。

NspecはNUnitがもとにはなっていますが、テストアダプターが今のところないためにテストエクスプローラから実行させることはできませんので テストを実行するときにはコンソール画面からNSpecRunner.exeを起動してテストを行う必要があります。

NSpecRunnerは、本家サイトからダウンロードできるのですが、バージョン0.9.64.0までしか用意されておらず*2、 先ほどInstall-Packageでいれたバージョン0.9.67.0よりも古いものとなっております。

0.9.64.0でもテスト自体は動かすことができますが、テストのレポートとして用意されているフォーマッターがConsole,HTML,XML,Tidywikiしか用意しておりません ので最新版のソースをGitHubよりダウンロードしてビルドを行ったものを使用してください。

ダウンロードしたフォルダにはVS2010用のソリューションとVS2012用のソリューションが含まれています。 プロジェクト NSpecRunnerをReleaseビルド後 NSpecRunner\bin\Releaseのフォルダから以下のファイルを任意のフォルダにコピーして、PATHを通しておきます。 f:id:kuroyanagi_h:20130802154330p:plain

テストの実行

簡単に以下のようなテストメソッドを書いてみました。(2つ目のテストは誤り) テスト対象のクラス、メソッドには少なくとも1つの_(アンダースコア)が必要です。

using System;
using NSpec;

namespace MiniblogSample.NSpecTests
{
    public class 数値ライブラリ_について : nspec
    {
        void 累乗_を計算したとき()
        {
            it["5の2乗は25であること"] = () => Math.Pow(5,2).should_be(25);
            it["5の3乗は75であること"] = () => Math.Pow(5, 3).should_be(75);
        }
    }
}

コンソール画面から

nspecrunner MiniBlogSample.NSpecTests\bin\Debug\MiniblogSample.NSpecTests.dll (テストメソッドのあるdll)

と入力して実行すると f:id:kuroyanagi_h:20130802161214p:plain 少し見にくいですが、成功メソッドはグリーン、失敗メソッドおよびエラーメッセージはレッド で表示され、最後にテスト総数、失敗したテスト数が表示されます。

開発時はコンソール画面で結果確認し、問題のソースを修正を繰り返す流れになります。

またテストの結果はこのようにコンソール画面で色付けして表示されるほか、--formatter=[フォーマッタクラス名]というオプションにより出力形式を変更できます。

--formatterに指定するクラス名ですが バージョン0.9.67.0では以下の文字列を指定することができます。

  • ConsoleFormatter コンソール画面への出力形式(Default)
  • HtmlFormatter HTML形式 f:id:kuroyanagi_h:20130802163231p:plain
  • TiddlyWikiFormatter TiddyWiki形式(エラーになってしまう??)
  • XmlFormatter XML形式 f:id:kuroyanagi_h:20130802163455p:plain
  • XUnitFormatter XUnit形式(後述のJenkinsではこの形式を用います) f:id:kuroyanagi_h:20130802164234p:plain

すべてにおいて出力は標準出力に出されますので、Windowsのコンソール画面ではすべて文字コードがShiftJISになることに注意してください。

2. Jenkinsの設定
  • プロジェクトの設定 プロジェクトの設定でWindowsバッチコマンドの起動を追加します。 f:id:kuroyanagi_h:20130802164652p:plain
REM NSpec Consoleの実行
rmdir /s /q NSpec.TestResults
mkdir NSpec.TestResults
REM コンソール出力がShiftJISになっているので文字コードをutf-8に変換して書き込む
"NSpecRunner.exe" MiniBlogSample.NSpecTests\bin\Debug\MiniBlogSample.NSpecTests.dll --formatter=XUnitFormatter  | nkf32 -W8  > NSpec.TestResults/NSpec-result.xml

NSpecRunner のオプションで --formatterにXunitFormatterを指定してJenkinsが読める形式でファイルを作成します。 先ほど説明したとおり、出力の文字コードがShiftJISになってしまうためJenkinsで日本語を読むためにはUTF-8に変換する必要があります。 そこで、nkfを使って文字コードを変換したのちファイルに出力させています。(ここでしばらく悩んでいました)

nkf32はVectorなどからダウンロードして利用してください。nkf以外でもUTF-8に変換できればどんなツールでも よいと思います。

NSpecの実行結果をレポートする時に使用するプラグインですが、Jenkinsインストール時にすでに用意されているJUnitテスト結果の集計プラグインが利用できます。 「ビルド後の処理の追加」で「JUnitテスト結果の集計」を選択し上記のNspec実行時に出力したXMLファイルを指定します。

f:id:kuroyanagi_h:20130802165827p:plain

*1:但しNUnitのTestRunnerでは動かないので、あとで苦労した

*2:2013/8/1現在