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.net` と `xunit.runner.console` を追加する。 Visual Studio を使っているなら `xunit.runner.visualstudio` も追加すると便利。
[Getting Started with xUnit.net (desktop)](http://xunit.github.io/docs/getting-started-desktop.html)
OpenCover
"OpenCover" と検索すると出てくるはず。緑のアイコン。
coveralls.net
"coveralls" と検索すると、 `coveralls.net` (アイコン付き)と `coveralls.io` が出てくる。今回は前者を使用。

処理のための記述

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

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

1
2
3
4
5
6
7
8
$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” )を確認してください。

参照記事