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

Coveralls の場合について記事を書きましたが、調べているとテストカバレッジ取得CIサービスの比較 (Coveralls.ioとCodecov.io)が見つかり、 Codecov に関しても備忘録を残そうと思いました。

色合いだけ見ると個人的に Coveralls が共産主義圏っぽくて好きですが、 Codecov の方が高機能できれいだと思います。

ドキュメントも公式でしっかりしているみたいです。

概要

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


AppVeyor
.NET 用の Continuous Integration サービス。

Codecov
コードカバレッジを表示するサービス。 GitHub でこれのバッヂをたまに見かける。

xUnit.net
単体テストライブラリ。 Visual Studio のテストエクスプローラからも実行可能。

OpenCover
コードカバレッジを測定するライブラリ。他の単体テストライブラリと併用する。

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

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

NuGet での準備

xUnit.net のテスト機構とカバレッジの調査プログラムは NuGet にて入手します。


xUnit.net
xunit.netxunit.runner.console を追加する。 Visual Studio を使っているなら xunit.runner.visualstudio も追加すると便利。
Getting Started with xUnit.net (desktop)

OpenCover
“OpenCover” と検索すると出てくるはず。緑のアイコン。

Codecov へ送るプログラムは Python の pip コマンドでインストールできるので、それは ‘appveyor.yml’ のスクリプトなどに記述すればいいです。

処理のための記述

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

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

1
2
3
4
5
6
7
8
9
10
11
$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()
$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

$env:Path = "C:\Python34;C:\Python34\Scripts;$env:Path"
python -m pip install --upgrade pip
pip install codecov
&{codecov -f "opencoverCoverage.xml"}

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

  • AppVeyor から Codecov へ送信する際には、トークンなどの長い設定は必要ありません。( 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’ に加えれば、コードカバレッジの自動測定と表示は完了です。

補足

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

公式のサンプルでは CMD で動かすためのバッチが書かれています。最後の codecov が出すエラー( “codecov : File not found – ‘*.gcno’” )は、そのまま書くとビルド失敗と判定されますが、 &{codecov ***} と囲むことでパスできます。

参照記事