Coveralls の場合について記事を書きましたが、調べているとテストカバレッジ取得CIサービスの比較 (Coveralls.ioとCodecov.io)が見つかり、 Codecov に関しても備忘録を残そうと思いました。
色合いだけ見ると個人的に Coveralls が共産主義圏っぽくて好きですが、 Codecov の方が高機能できれいだと思います。
ドキュメントも公式でしっかりしているみたいです。
概要
今回使ったライブラリ・サービスは下のとおりです。
- AppVeyor
- .NET 用の Continuous Integration サービス。
- Codecov
- コードカバレッジを表示するサービス。 GitHub でこれのバッヂをたまに見かける。
- xUnit.net
- 単体テストライブラリ。 Visual Studio のテストエクスプローラからも実行可能。
- OpenCover
- コードカバレッジを測定するライブラリ。他の単体テストライブラリと併用する。
実行手順は以下のようになります。
- GitHub に Push
- AppVeyor でビルド
- 単体テスト時の処理をカバレッジ付きの処理内容に上書き
- Codecov へ情報の送信
NuGet での準備
xUnit.net のテスト機構とカバレッジの調査プログラムは 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" と検索すると出てくるはず。緑のアイコン。
Codecov へ送るプログラムは Python の pip コマンドでインストールできるので、それは ‘appveyor.yml’ のスクリプトなどに記述すればいいです。
処理のための記述
続いて、 ‘appveyor.yml’ に処理を書いていきます。
下のスクリプトは、 test_script
に指定するものです( powershell として:- ps >-
の次の行か)。これで単体テストのデフォルト処理を上書きします。今回はカバレッジを調べる際に、テスト結果が AppVeyor に通知されるので問題ありません。( after_test
に書くと通知が二重に…)
‘appveyor.yml’ の全体
1 | $opencover = (Resolve-Path "src/packages/OpenCover.*/tools/OpenCover.Console.exe").ToString() |
スクリプトに関して注意など
- 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 ***}
と囲むことでパスできます。