Webのユニットテスト⑦ .NET

前回の続きです。
いろいろなブラウザでのユニットテストを実行する、Hudsonの分散プロジェクトを作ってみます。
の続編です。

default.buildなどを置く

以前に作ったdefault.build等を「【SampleJob】WEB+DBユニットテスト(.NET)①デプロイ」のプロジェクト直下に置きます。


 default.build
 coverage.build


以下のファイルを変更しています。


■default.build
テストで使用するブラウザを切り替える為にApp.configの更新処理とSeleniumServerの起動・停止処理を追加しました。
AntではBrowserTypeをプロパティ値で参照できたのですが、NAntからはプロパティ値を取得できなかったので、
Hudsonが設定した環境変数(BUILD_TAG)からBrowserTypeを強引に取得しています。

<?xml version="1.0" encoding="utf-8"?>
<project name="UnitTestProject" default="build" basedir=".">

  <!-- ========================================================== -->
  <!-- 定義値 -->
  <!-- ========================================================== -->
  <!-- .NETバージョン -->
  <property name="nant.settings.currentframework" value="net-3.5" />
  <!-- プロジェクト名 -->
  <property name="project.name" value="WebAndNDbUnitSample"/>
  
  <!-- 出力ディレクトリ -->
  <property name="bin.dir" value="bin"/>
  <!-- テスト結果ファイル格納ディレクトリ -->
  <property name="report.dir" value="report"/>
  <!-- スクリーンショット格納ディレクトリ -->
  <property name="screenshot.dir" value="screenshot"/>
  <!-- IISディレクトリ -->
  <property name="iis.dir" value="C:/Inetpub/wwwroot/${project.name}"/>
  
  <!-- SeleniumServerの起動コマンド -->
  <property name="start.seleniumServer.command" value="${project.name}Test/selenium-server-run.bat"/>
  <!-- SeleniumServer停止URL -->
  <property name="stop.seleniumServer.url" value="http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer"/>
  
  <!-- ========================================================== -->
  <!-- NAntタスク実行順序 -->
  <!-- ========================================================== -->
  <target name="build">
    <call target="clean" />
    <call target="compile" />
    <call target="deploy" />
  </target>
  <target name="build-unitTest">
    <call target="clean-unitTest" />
    <call target="unitTest" />
  </target>
  <target name="build-unitTest-coverage">
    <call target="clean-unitTest" />
    <call target="update.App.config" />
    <nant buildfile="coverage.build" target="coverage" />
  </target>
  
  <!-- ========================================================== -->
  <!-- ディレクトリをクリア -->
  <!-- ========================================================== -->
  <target name="clean">
    <delete dir="${bin.dir}" />
    <mkdir dir="${bin.dir}" />
  </target>
  
  <!-- ========================================================== -->
  <!-- ディレクトリをクリア(ユニットテスト用) -->
  <!-- ========================================================== -->
  <target name="clean-unitTest">
    <delete dir="${report.dir}" />
    <delete dir="${screenshot.dir}" />
    <mkdir dir="${report.dir}" />
    <mkdir dir="${screenshot.dir}" />
  </target>

  <!-- ========================================================== -->
  <!-- コンパイル -->
  <!-- ========================================================== -->
  <target name="compile">
    <msbuild verbosity="Minimal">
      <property name="Configuration" value="Release" />
      <property name="OutputPath" value="..\${bin.dir}"/>
    </msbuild>
  </target>

  <!-- ========================================================== -->
  <!-- Webアプリケーションをデプロイ -->
  <!-- ========================================================== -->
  <target name="deploy">
    <delete dir="${iis.dir}" />
    <copy todir="${iis.dir}">
      <fileset basedir="${bin.dir}/_PublishedWebsites/${project.name}">
        <include name="**/*" />
      </fileset>
    </copy>
  </target>
  
  <!-- ========================================================== -->
  <!-- App.configの更新 -->
  <!-- ========================================================== -->
  <target name="update.App.config">
    <regex pattern="^hudson-BrowserType=(?'BrowserType'.*),.*$" input="${environment::get-variable('BUILD_TAG')}" />
    <echo message="BrowserType=${BrowserType}" />
    <copy file="${project.name}Test/${BrowserType}-App.config" tofile="${bin.dir}/${project.name}Test.dll.config" overwrite="true" />
  </target>

  <!-- ========================================================== -->
  <!-- ユニットテスト実行 -->
  <!-- ========================================================== -->
  <target name="unitTest">
  
    <!-- SeleniumServer起動 -->
    <exec program="cmd">
      <arg value="/C" />
      <arg value="start java -jar ${project.name}Test/selenium-server.jar" />
    </exec>

    <!-- ユニットテスト実行 -->
    <nunit2 failonerror="false" verbose="true">
      <formatter usefile="true" type="Xml" extension=".xml" outputdir="${report.dir}"/>
      <test>
        <assemblies basedir="${bin.dir}">
          <include name="*Test.dll"/>
        </assemblies>
      </test>
    </nunit2>
     
    <!-- SeleniumServer停止 -->
    <exec program="cmd">
      <arg value="/C" />
      <arg value="start ${stop.seleniumServer.url}" />
    </exec>

  </target>
  
</project>


■coverage.build
NCoverに付属しているAntタスクを使用しています。
NCoverのAntタスクでカバレッジの取得からHTMLレポートの生成までをしています。
IIS再起動してNCoverの実行を止めてね!」って、ヘルプに書いてあったので、
NCover実行後にIISを再起動してカバレッジ採取を止めています。

<?xml version="1.0" encoding="utf-8"?>
<project name="UnitTestCoverage" default="coverage" basedir=".">
 
  <!-- NCoverのAntタスクを読み込む -->
  <loadtasks assembly="NCover.NAntTasks.dll"/>
  
  <!-- ========================================================== -->
  <!-- 定義値 -->
  <!-- ========================================================== -->
  <property name="coverage.dir" value="coverage"/>
  <property name="ncover.home" value="C:/Program Files/NCover"/>
  <property name="nunit.home" value="C:/Program Files/NUnit 2.5.2/bin/net-2.0"/>
  <property name="coverage.target" value="${project.name}Test.dll"/>
  <property name="coverage.out" value="coverage.xml"/>
  
  <!-- ========================================================== -->
  <!-- NAntタスク実行順序 -->
  <!-- ========================================================== -->
  <target name="coverage">
    <call target="clean" />
    <call target="ncover" />
  </target>
  
  <!-- ========================================================== -->
  <!-- ディレクトリをクリア -->
  <!-- ========================================================== -->
  <target name="clean">
    <delete dir="${coverage.dir}" />
    <mkdir dir="${coverage.dir}" />
  </target>
  
  <!-- ========================================================== -->
  <!-- NCover実行 -->
  <!-- ========================================================== -->
  <target name="ncover">
  
    <!-- SeleniumServer起動 -->
    <exec program="cmd">
      <arg value="/C" />
      <arg value="start java -jar ${project.name}Test/selenium-server.jar" />
    </exec>

    <!-- NCover実行 -->
    <ncover program="${ncover.home}/NCover.Console.exe" 
      testRunnerExe="${nunit.home}/nunit-console.exe" 
      testRunnerArgs="${bin.dir}/${coverage.target}"
      htmlReportDir="${coverage.dir}"
      profileIIS="true" />
    
    <!-- SeleniumServer停止 -->
    <exec program="cmd">
      <arg value="/C" />
      <arg value="start ${stop.seleniumServer.url}" />
    </exec>
    
    <!-- IIS再起動(カバレッジ採取を止める) -->
    <exec program="iisreset" />

    <!-- テスト結果XMLをコピー -->
    <copy file="TestResult.xml" tofile="${report.dir}/TestResult.xml" />
    
  </target>

</project>