2012年1月10日火曜日

ASP.NET WebFormでNUnitによるUnitTest環境を構築する

ASP.NET WebFormはUnitTestにすばらしく向いていないため、テスト駆動型開発の環境を整えるのは茨の道になる。試行錯誤しなんとかそれなりに出来たので、以下にその手順を記載します。

・前提
備え付けのMSTest(右クリック→テストケース作成)は使わない
→有料のProfessional以上でないと使用できず、また作成/テスト実行が異常に遅いため
(コード管理のTeamFoundationも有料だし、これでもうイヤと言われたら返す言葉は、ない)

AppCode内に単体テストケースは作成しない
→純粋に考えればこれが一番早いが、プロジェクトファイルが作れなくなるためNUnitの恩恵が受けられない+どの道aspx.vbのコードが参照できないため、あまり意味がない。
Slim3のkotoriのように、NUnitがWeb配置できるようになればこの道も開けるかもしれない。

Kotori Web JUnit Runner


・事前準備
NUnitのインストール(msiファイルをダウンロードして、あとはYESで大丈夫)

・テスト環境構築手順
1.テストプロジェクトの作成
Solution NavigatorでWebサイトを開き、ソリューションのところで
追加->新しいプロジェクト->クラスライブラリ」を選択し、テスト用プロジェクトを作成する。
※こうすること(ソリューションに追加する形で作成すること)で、テスト対象のWebサイトとテストプロジェクトがまとめて見られるようになる

2.Webサイト参照の作成
Webサイトをプリコンパイルし、テストプロジェクトから参照できるようにする。
この処理はバッチファイルで行うが、自動でやりたい!という場合以下2つの方法がある。
1.Webサイトのビルド後処理にプリコンパイル処理を入れる
2.テストプロジェクトのビルド前処理にプリコンパイル処理を入れる

プリコンパイルした内容は、テストプロジェクトのbin/TargetSiteに入れることにする(テストプロジェクトから参照できるならどこでも良い)。プリコンパイルのコマンドは以下の通り。
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe  -f -d -fixednames -p <Webサイトの物理パス>-v / <テストプロジェクトの物理パス>\bin\TargetSite

環境は.NET4.0を想定している。付与しているオプションのポイントは下記点。
-f:ファイルが存在したら上書きするようにするオプション。
-d:デバッグを可能にするためのオプション
-fixednames:出力するdllの名前を固定にするオプション。こうしないと毎回参照を設定しなおさないといけなくなる。

プリコンパイル方法参考


3.テストプロジェクトの環境設定
プロジェクトのプロパティ>デバッグで、以下2点を設定
・外部プログラムの開始→インストールしたNUnitのexeを指定
・コマンドライン引数   →作成したプロジェクトのdllを指定(bin/Debug内にある)

プロジェクトのプロパティ>参照で、2で作成したサイトのBin内にあるdllを片っ端から参照設定。
あとは、NUnitのdll(bin/framework/nunit.framework.dll)を設定すれば準備OK。
※外部プログラムの開始の設定がない場合、プロジェクトファイルを直接編集

VisualStudioとNUnitの連動設定 

さらに、web.configの設定を読み込むようにしておく。
NUnitのTools→Setting→Test Loader→Assembly Isolationについて、Default Domain UsageのUse a Separate AppDomain per Assemblyにチェックを入れる。
web.configを<テストプロジェクト>/bin/Debugの配下にコピーし、名前をテストプロジェクト名.dll.configに変更する

NUnitからweb.configを読み込む方法


4.テストの作成/実行
やり方はNUnitの普通のテストケース作成と変わらない。
Webサイトの参照を通しているので、ページ内のパブリックメソッドなどもテスト可能。
ただ、方針としてはaspx/aspx.vbにあまり重たい処理は持たせない方が良い。イベントハンドリング処理のみとして、実際の実装はクラスオブジェクトで行ったほうが良い(MVPパターンを参照)

MVPパターンの例
※サイトは英語だが、色々見て回った中で一番分かりやすかった。


最後に、環境構築のバッチの例を。


@echo off
setlocal
REM テスト対象のサイトと、サイトのコンパイル結果のコピー先を指定。コピー先は、bin直下の必要あり
set TARGET_SITE=\\app\webSite
set UNIT_TEST_PJ=D:\unitTest\webSiteTest\bin\TargetSite
set PJ_NAME=webSiteTest


echo 【指定されたwebサイトのコンパイルを開始します】
REM オプションについては下記サイトを参照
REM http://msdn.microsoft.com/ja-jp/library/ms229863.aspx
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -f -d -fixednames -p %TARGET_SITE% -v / %UNIT_TEST_PJ%


echo 【サイトのweb.configをテスト環境にコピーします】
REM コピー先に移動
cd /d %UNIT_TEST_PJ%
REM コピー先はbin直下、という前提に基づきweb.configをbin/Debugへ移動
copy /y web.config ..\Debug\%PJ_NAME%.dll.config


echo 【テスト環境の構築が終了しました】


endlocal

0 件のコメント:

コメントを投稿