読者です 読者をやめる 読者になる 読者になる

Jenkins で MSTest の結果とコードカバレッジを表示する方法

はじめに

Jenkins で .NET ソリューションのビルドとテストが出来るようになりました。これだけでも便利ですけど、欲を言えばテスト結果を Jenkins 上に表示したい。あと、コードカバレッジのレポートも表示できると、いろいろ捗りそうです。

ということで、テスト結果とコードカバレッジを Jenkins で表示することに挑戦しました。ちなみに Visual Studio 2010 のコードカバレッジ機能は Premium 以上のエディションで利用できます。

今回の作業は、次の記事を参考にしました。

そのままでは上手く動かないので、やったことをまとめておきます。

Visual Studio ソリューションの設定

テストプロジェクトが既に作成されていることを前提に進めていきます。

コードカバレッジの有効化

まず、テストプロジェクトを含むソリューションを開き、拡張子が .testsettings ファイルを開きます。ここでは Local.testsettings を選択。ソリューションに無い場合は、[追加] - [新しい項目(W)...] から [テストの設定] を選んで、ファイルを追加して下さい。
f:id:griefworker:20110726203055p:image

[テストの設定] ダイアログが表示されるので、[データと診断] を選択し、右下のリストに表示されている [コードカバレッジ] にチェックをつけます。
f:id:griefworker:20110726203056p:image

コードカバレッジを診断するアセンブリの指定

次に、リストの上にある [構成] ボタンをクリックすると、[コードカバレッジの詳細」ダイアログが表示されます。
f:id:griefworker:20110726205320p:image
カバレッジを測定するアセンブリにチェックをつけて、OK をクリック。[テストの設定]ダイアログに戻ったら、いったん、[適用] ボタンをクリックして設定を保存しておくといいです。

テスト結果出力先の固定

MSTest を実行して生成されるファイルやフォルダは、初期設定のままだと、名前にタイムスタンプがついてしまいます。タイムスタンプがついていると Jenkins で設定するのが面倒になるので、名前を固定しておきます。

[全般] を表示し、[ユーザー定義されたスキーム] を選択します。テスト結果が出力されるフォルダの名前を固定するために、下図のように入力。
f:id:griefworker:20110727161151p:image

これで Visual Studio での設定は終了

テストを実行すればコードカバレッジも測定されます。設定した後、ちゃんとコードカバレッジが出力されるかを試しておくといいです。

コードカバレッジのデータは

<ソリューションディレクトリ>/TestResults/TestResult/In/<コンピュータ名>/data.coverage

に出力されます。


Jenkins にプラグインを導入

MSTest の結果を Jenkins に表示するために、MSTest プラグインを導入します。

コードカバレッジは Emma 形式に変換して表示するので、Emma プラグインが必要です。Trac Lightning で Jenkins をインストールしたので、最初から入っていました。

Jenkins の設定

ここから Jenkins の設定です。ビルドを行うための新規ジョブを作成します。

Subversion リポジトリを指定

Subversion リポジトリからソースコードをチェックアウトし、テストや診断を実行します。
f:id:griefworker:20110726220209p:image

MSBuild でテストプロジェクトを含むソリューションをビルド

MSBuild でソリューションをビルドします。
f:id:griefworker:20110726220210p:image
MSBuild の設定方法は、次の記事を参考にしてください。

MSTest を実行

ビルドに [Windowsバッチコマンドの実行] を追加し、次のコマンドを記述します。

::過去の結果があれば削除
rmdir /S /Q TestResults
mkdir TestResults

::テスト実行
"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /testsettings:Local.testsettings /resultsfile:TestResults\TestResult.trx /testcontainer:"Sample.Test\bin\Debug\Sample.Test.dll"

テスト対象の DLL が増えてきたら、MSBuild 用ビルドファイルを作成した方がいいかも。

出力されたカバレッジデータを XML に変換

まず、ソリューションフォルダ直下に GenerateCoverage.build というビルドファイルを作成します。中身は下記の通り。

<Project ToolsVersion="3.5" DefaultTargets="Coverage" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--Jenkins ジョブのワークスペースディレクトリ-->
    <WorkspacePath>F:\Sample</WorkspacePath>

    <!--カスタムタスクのアセンブリのパス-->
    <TaskAssemblyPath>$(WorkspacePath)\CI.MSBuild.Tasks\CI.MSBuild.Tasks.dll</TaskAssemblyPath>

    <!--変換対象のファイル-->
    <CoverageFilePath>$(WorkspacePath)\TestResults\TestResult\In\$(ComputerName)\data.coverage</CoverageFilePath>

    <!--出力先-->
    <OutputDirPath>$(WorkspacePath)\TestResults\TestResult\Out</OutputDirPath>
  </PropertyGroup>

  <UsingTask TaskName="ConvertVSCoverageToXml"
             AssemblyFile="$(TaskAssemblyPath)" />

  <Target Name="Coverage">
    <Message Text="Processing code coverage results..." />
    <ConvertVSCoverageToXml CoverageFiles="$(CoverageFilePath)"
                            SymbolsDirectory="$(OutputDirPath)" />
  </Target>
</Project>

このビルドファイルで使っているカスタムタスクは、下記 URL から入手できます。

このビルドファイルを MSBuild で実行するように、Jenkins にビルド項目を追加します。
f:id:griefworker:20110727140507p:image

さらに Emma 形式に変換

Emma プラグインで読み込めるように、XSL 変換するビルドファイルを作成します。

<Project ToolsVersion="3.5" DefaultTargets="Convert" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--MSXSL のパス-->
    <MsXslPath>"C:\Program Files\MSXsl\msxsl.exe"</MsXslPath>

    <!--Jenkins ジョブのワークスペースディレクトリ-->
    <WorkspacePath>F:\Sample</WorkspacePath>

    <!--変換意使う XSL ファイルのパス-->
    <XslFilePath>$(WorkspacePath)\MSTestCoverageToEmma.xsl</XslFilePath>

    <!--カバレッジデータ(XML)のパス-->
    <CoverageFilePath>$(WorkspacePath)\TestResults\TestResult\In\$(ComputerName)\data.xml</CoverageFilePath>

    <!--Emma に変換したカバレッジデータの出力先-->
    <OutputFilePath>$(WorkspacePath)\coverage.xml</OutputFilePath>
  </PropertyGroup>

  <Target Name="Convert">
    <Exec Command="$(MsXslPath) $(CoverageFilePath) $(XslFilePath) -o $(OutputFilePath)" />
  </Target>
</Project>

上記の内容を ConvertToEmma.build という名前で、ソリューションフォルダ直下に保存。

使用している XSL ファイルは下記 URL から入手できます。

実行には MSXML と MSXSL が必要です。MSXML はすでにインストールされていたので、MSXSL をダウンロードして適当な場所にインストールします。

このビルドファイルも、MSBuild で実行するよう、Jenkins に追加します。
f:id:griefworker:20110726221101p:image

Jenkis でコードカバレッジを表示

まず、[Emmaカバレッジレポートの記録] にチェックを付け、先ほどのビルドファイルで出力される XML ファイルのパスを指定します。
f:id:griefworker:20110726222000p:image

次に、[Publish MSTest test result reposrt] にチェックを付け、MSTest で出力される拡張子 TRX のファイルを指定します。
f:id:griefworker:20110726222001p:image

これで完了

Jenkins のジョブを実行し、成功すれば、テスト結果とコードカバレッジが表示されるはずです。
f:id:griefworker:20110726222002p:image

まとめ

テストやコードカバレッジ診断の結果を Jenkins 上に表示することで、いつでもブラウザで最新のレポートが見れるようになりました。このレポートを見ればテスト漏れは一目瞭然。品質向上に役立こと間違いなしです。

あ、テストの目的が「コードカバレッジを100%にすること」にすり替わってしまわないよう、くれぐれも注意を。