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 に書くと通知が二重に…)
‘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” )を確認してください。

参照記事