Part Cover 紹介 その4 - ビルドに組み込む。MSBuild から Part Cover console を実行する

Part Cover 紹介 その4です。以前の記事はこちら
Part Cover 紹介 その1 - Part Cover browser から テストコード(NUnit)のカバレッジを取得する - お だ のスペース
Part Cover 紹介 その2 - Part Cover browser から Windows アプリケーションのカバレッジを取得する - お だ のスペース
Part Cover 紹介 その3 - Part Cover console から テストコード(NUnit)のカバレッジを取得する - お だ のスペース
Part Cover 紹介 その3.5 - Part Cover console 設定ファイルを使用する - お だ のスペース
今回で Part Cover の紹介はひと段落の予定です。


MSBuild で実行する際に、カスタムタスクを作成するわけではなく、Exec タスク を使用して実行します。
※PartCover 用のカスタムタスクを作成している方もおられるようですが、特に困らないので必要ないかな?というのが個人的な感想です。
MSBuild Task for PartCover | Zorched / One-Line Fix


Visual Studio で使うプロジェクトファイル(csproj,vbproj)に直接書くという方法もありますが、個人的には、別に proj ファイルを作成する方法が良いかと思います。(理由は最後に記載) というわけで、MSBuild ファイルはこんな感じです。

WindowsFormsApplication.report.proj

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="ReportBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- カスタムタスクライブラリ MSBuildCommunityTasksを利用するための設定 Xsltタスクを使用している -->
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />

  <PropertyGroup>
    <!-- PartCoverのパス -->
    <PartCoverPath>C:\Program Files\Gubka Bob\PartCover .NET 2.3</PartCoverPath>
    <ProjectName>WindowsFormsApplication1</ProjectName>
    <BuildConfig>Debug</BuildConfig>
    <!-- PartCoverの結果を保存するパス -->
    <PartCoverResultPath>$(MSBuildProjectDirectory)\PartCoverResult</PartCoverResultPath>
    <!-- スタイルシートの保存パス -->
    <XslPath>$(PartCoverResultPath)\xsl</XslPath>
  </PropertyGroup>

  <!-- リビルドする -->
  <Target Name="Rebuild">
    <Message Text="Rebuild" />
    <MSBuild Projects="$(MSBuildProjectDirectory)\$(ProjectName).sln" 
             Targets="Rebuild;" Properties="Configuration=$(BuildConfig);" />
  </Target>

  <!-- レポートの作成 -->
  <Target Name="CreateReport">
    <Message Text="Exec PartCover" />
    <!-- PartCover を実行する -->
    <Exec Command="&quot;$(PartCoverPath)\PartCover.exe&quot; --settings &quot;$(MSBuildProjectDirectory)\PartCoverSettings2.xml&quot; --output &quot;$(PartCoverResultPath)\PartCoverResult.xml&quot;" />
    <!-- Xslt タスクに渡す XML ファイルを指定 -->
    <CreateItem Include="$(PartCoverResultPath)\PartCoverResult.xml" >
      <Output TaskParameter="Include" ItemName="PartCoverResult" />
    </CreateItem>
    <Message Text="Create Class Covered Report" />
    <!-- スタイルシートの適用 -->
    <Xslt Inputs="@(PartCoverResult)" Xsl="$(XslPath)\PartCover.class.report.xsl" 
          Output="$(PartCoverResultPath)\ClassCoveredResult.html" />
  </Target>

  <!-- リリースビルドタスク -->
  <Target Name="ReportBuild" DependsOnTargets="Rebuild;CreateReport;" />
</Project>

このファイルを .sln と同じ階層に配置して、MSBuild で実行します。


これで、MSBuild から Part Cover console を実行して、結果を HTML 変換した物が出来上がります。
MSBuild ファイル(.proj) の説明は、コメント書いてるので雰囲気伝わりますよね?
一点補足:XML を HTML に変換する Xslt タスク は標準の MSBuild タスクではありません!
こちら msbuildtasks.tigris.orgMSBuild.Community.Tasks という物を使っています。
そのために、<Import Project 〜 という一文が必要になります。
Xslt タスクについては、以前少し紹介しました。MSBuild.Community.Tasks の Xslt を使ってみた - お だ のスペース


ちなみに何故 proj ファイルを別に作ったのかというと、proj ファイルの中でリポジトリからソースコードを取得してから〜とかも書くと、必要なのは proj ファイル1個でビルド対象の .sln やら一式は、リポジトリから取ってくる事も出来ます。なので個人的には分けた方が良いかなと思います。
実際開発に使用する .sln や .csproj、.vbproj とは別に、リリース/レポート用等で別に proj ファイルを作成するのが個人的には好きですね。Hudson 等から ボタン一つでリリース物一式を作成するとかが理想です。