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に書くと通知が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()
    $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 ***}と囲むことでパスできます。

参考記事

コメントを残す

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