Hudsonの使い方⑳ Hudsonでユニットテスト網羅率測定(.NET)

.NETプロジェクトでも、
ユニットテストの網羅率(カバレッジ)測定をしてみます。

Slave端末にPartCoverをインストールします。

PartCoverをダウンロードしてインストールします。

Slave端末にReportGeneratorをインストールします。

ReportGeneratorをダウンロードして適当なフォルダに展開します。
ReportGeneratorを使って、PartCoverが出力したカバレッジをHTMLに変換します。

PartCover、ReportGeneratorをNAntから実行できるようにdefault.buildを追加します。

管理しやすいように、以前に作ったdefault.buildと分けて作りました。


■coverage.build

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

  <!-- ========================================================== -->
  <!-- 定義値 -->
  <!-- ========================================================== -->
  <property name="coverage.dir" value="coverage"/>
  <property name="partcover.home" value="C:/Program Files/Gubka Bob/PartCover .NET 2.3"/>
  <property name="nunit.home" value="C:/Program Files/NUnit 2.5.2/bin/net-2.0"/>
  <property name="reportgenerator.home" value="C:/ReportGenerator0.7.0.0"/>
  <property name="partcover.target" value="HelloNUnitTest.dll"/>
  <property name="partcover.include" value="[HelloNUnit]*.*"/>
  <property name="partcover.exclude" value="[HelloNUnit]*.Properties.*"/>
  <property name="partcover.out" value="coverage.xml"/>
  
  <!-- ========================================================== -->
  <!-- NAntタスク実行順序 -->
  <!-- ========================================================== -->
  <target name="coverage">
    <call target="clean" />
    <call target="partCover" />
    <call target="reportGenerator" />
  </target>
  
  <!-- ========================================================== -->
  <!-- ディレクトリをクリア -->
  <!-- ========================================================== -->
  <target name="clean">
    <delete dir="${coverage.dir}" />
    <mkdir dir="${coverage.dir}" />
  </target>
  
  <!-- ========================================================== -->
  <!-- PartCover実行 -->
  <!-- ========================================================== -->
  <target name="partCover">
    <exec program="${partcover.home}/PartCover.exe">
      <arg value="--target" />
      <arg value="${nunit.home}/nunit-console.exe" />
      <arg value="--target-args" />
      <arg value="${partcover.target}" />
      <arg value="--target-work-dir" />
      <arg file="${bin.dir}" />
      <arg value="--output" />
      <arg value="${coverage.dir}/${partcover.out}" />
      <arg value="--include" />
      <arg value="${partcover.include}" />
      <arg value="--exclude" />
      <arg value="${partcover.exclude}" />
    </exec>
    <!-- テスト結果XMLをコピー -->
    <copy file="${bin.dir}/TestResult.xml" tofile="${report.dir}/TestResult.xml" />
  </target>

  <!-- ========================================================== -->
  <!-- ReportGenerator実行 -->
  <!-- ========================================================== -->
  <target name="reportGenerator">
    <exec program="${reportgenerator.home}/bin/reportGenerator.exe">
      <arg file="${coverage.dir}/${partcover.out}" />
      <arg file="${coverage.dir}" />
    </exec>
  </target>
  
</project>

default.buildを変更します。

NAntタスク実行順序でカバレッジ有り/無しを指定して、
ユニットテストを実行できるようにしておきます。


■default.build

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

  <!-- ========================================================== -->
  <!-- 定義値 -->
  <!-- ========================================================== -->
  <property name="nant.settings.currentframework" value="net-3.5" />
  <property name="bin.dir" value="bin"/>
  <property name="report.dir" value="report"/>
  
  <!-- ========================================================== -->
  <!-- NAntタスク実行順序 -->
  <!-- ========================================================== -->
  <target name="build">
    <call target="clean" />
    <call target="compile" />
  </target>
  <target name="build-unitTest">
    <call target="build" />
    <call target="unitTest" />
  </target>
  <target name="build-unitTest-coverage">
    <call target="build" />
    <nant buildfile="coverage.build" target="coverage" />
  </target>
  
  <!-- ========================================================== -->
  <!-- ディレクトリをクリア -->
  <!-- ========================================================== -->
  <target name="clean">
    <delete dir="${bin.dir}" />
    <delete dir="${report.dir}" />
    <mkdir dir="${bin.dir}" />
    <mkdir dir="${report.dir}" />
  </target>
  
  <!-- ========================================================== -->
  <!-- コンパイル -->
  <!-- ========================================================== -->
  <target name="compile">
    <msbuild verbosity="Minimal">
      <property name="Configuration" value="Release" />
      <property name="OutputPath" value="..\${bin.dir}"/>
    </msbuild>
  </target>
  
  <!-- ========================================================== -->
  <!-- ユニットテスト実行 -->
  <!-- ========================================================== -->
  <target name="unitTest">
     <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>
  </target>
  
</project>

プロジェクトの設定でNAntの呼び出しを変更します。(赤枠の部分です)

targetをbuild-unitTestからbuild-unitTest-coverageに変更します。

HTML Publisher pluginをインストールします。

ジョブの設定でPublish HTML reportsをチェック

ReportGeneratorの出力結果ファイルを指定します。(赤枠の部分です)

ジョブを実行します。

カバレッジが表示されます。(赤枠の部分です)


Summaryが表示されます。


ファイル毎のカバレッジが表示されます。
ソース内でのユニットテスト実行と非実行の行がハイライト表示されます。