C#でAppVeyorとCoverallsを使う(xUnit.net)

C#のライブラリで自動テスト・デプロイをするCIサービスとしてAppVeyorを使っていますが、コードカバレッジの結果もバッヂで表示したいと思いました。今まで見たことがあったサービスにCoverallsがあったので、実際に使ってみることにしました。

Coverallsの.NETに関するライブラリのドキュメントは古いようで、設定に時間がかかってしまったため備忘録として残しておきます。

概要

今回使ったライブラリ・サービスは下のとおりです。

AppVeyor
.NET向けのContinuous Integrationサービス。
Coveralls
コードカバレッジを表示するサービス。GitHubではこのサービスのバッヂを見かける。
xUnit.net
単体テストライブラリ。Visual Studioのテストエクスプローラからも実行可能。
OpenCover
コードカバレッジを測定するライブラリ。他の単体テストライブラリと合わせて利用する。

実行手順は以下のようになります。

  1. GitHubにPush
  2. AppVeyorでビルド
  3. 単体テスト時の処理をカバレッジ付きの処理内容に上書き
  4. Coverallsへ情報の送信

NuGetでの準備

xUnit.netのテスト機構もカバレッジの調査プログラムもCoverallsへの送信プログラムも、すべてNuGetにて入手します。

xUnit.net
xunit.netxunit.runner.consoleを追加する。Visual Studioを使っているならxunit.runner.visualstudioも追加すると便利。
Getting Started with xUnit.net (desktop)
OpenCover
“OpenCover”と検索すると出てくるはず。緑のアイコン。
coveralls.net
“coveralls”と検索すると、coveralls.net(アイコン付き)とcoveralls.ioが出てくる。今回は前者を使用。

処理のための記述

続いて、appveyor.ymlに処理を書いていきます。

下のスクリプトは、test_scriptに指定するものです(powershellとして:- ps >-の次の行か)。これで単体テストのデフォルト処理を上書きします。今回はカバレッジを調べる際に、テスト結果がAppVeyorに通知されるので問題ありません。(after_testに書くと通知が2重に…)
appveyor.ymlの全体

    $opencover = (Resolve-Path "src/packages/OpenCover.*/tools/OpenCover.Console.exe").ToString()
    $runner = (Resolve-Path "src/packages/xunit.runner.console.*/tools/xunit.console.x86.exe").ToString()
    $coveralls = (Resolve-Path "src/packages/coveralls.net.*/tools/csmacnz.coveralls.exe").ToString()
    $targetargs = """Analyzer1.Test.dll"" -noshadow -appveyor"
    $filter = "+[Analyzer1*]* -[Analyzer1.Test*]*"

    & $opencover -register:user -target:$runner "-targetargs:$targetargs" -targetdir:$env:test_dll_dir "-filter:$filter" -returntargetcode -hideskipped:All -output:opencoverCoverage.xml
    & $coveralls --opencover -i opencoverCoverage.xml --repoToken $env:COVERALLS_REPO_TOKEN --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_JOB_ID

スクリプトに関して注意など

  • Coverallsへ送信する際にはトークン(ここではCOVERALLS_REPO_TOKEN)が必要なので、事前に取得し、appveyor.ymlに書く際には、AppVeyorの機能で暗号化したものを記述してください。
  • 環境変数$env:test_dll_dirは、テストクラスのdllがあるディレクトリの文字列です。例ではappveyor.ymlでsrc\Analyzer1\Analyzer1.Test\bin\Releaseとしています。
  • サンプルではNuGetから取得したxunit.console.x86を探索して実行していますが、%xunit20%\xunit.console.x86としても実行されるはずです。

結果

このプロジェクトこう処理されてこう表示される。

バッヂをGitHubのreadme.mdに加えれば、コードカバレッジの自動測定と表示は完了です。

補足

Coverallsに情報を送信するライブラリの公式サンプルでは、appveyor.ymlのスクリプトで、OpenCoverの-targetargsに対して、アセンブリの指定に関しては***.Test.dllだけ書いています。ただ、手元でこのように書いても***.Test.dllのコードでカバレッジが測定されて、被テストのコードは単体テストのみが動いた状態でした(Coverallsでの表示)。そのため、-targetargsに***.dllも追加したところ、望み通りに測定されました。
原因は不明ですが、***.dllの記述を消しても動くようになりました。

また、検査されなかったコードについては、-hideskipped:AllとすることでXMLに書かれないように変えました。

Coveralls内でコードファイルを選択しても何も表示されない場合(SOURCE NOT AVAILABLE)は、ディレクトリの起点(Git repo root Ddrectory)を確認してください。

参考記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です