C# のライブラリで自動テスト・デプロイをするCIサービスとして AppVeyor を使っていますが、コードカバレッジの結果もバッヂで表示したいと思いました。今まで見たことがあったサービスに Coveralls があったので、実際に使ってみることにしました。
Coveralls の .NET に関するライブラリのドキュメントは古いようで、設定に時間がかかってしまったため備忘録として残しておきます。
概要
今回使ったライブラリ・サービスは下のとおりです。
- AppVeyor
- .NET 向けの Continuous Integration サービス。
- Coveralls
- コードカバレッジを表示するサービス。 GitHub ではこのサービスのバッヂを見かける。
- xUnit.net
- 単体テストライブラリ。 Visual Studio のテストエクスプローラからも実行可能。
- OpenCover
- コードカバレッジを測定するライブラリ。他の単体テストライブラリと合わせて利用する。
実行手順は以下のようになります。
- GitHub に Push
- AppVeyor でビルド
- 単体テスト時の処理をカバレッジ付きの処理内容に上書き
- 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 | $opencover = (Resolve-Path "src/packages/OpenCover.*/tools/OpenCover.Console.exe").ToString() |
スクリプトに関して注意など
- 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 の
原因は不明ですが、 ‘***.dll’ の記述を消しても動くようになりました。-targetargs
に対して、アセンブリの指定に関しては ‘***.Test.dll’ だけ書いています。ただ、手元でこのように書いても ‘***.Test.dll’ のコードでカバレッジが測定されて、被テストのコードは単体テストのみが動いた状態でした(Coverallsでの表示)。そのため、 -targetargs
に ‘***.dll’ も追加したところ、望み通りに測定されました。
また、検査されなかったコードについては、 -hideskipped:All
とすることで XML に書かれないように変えました。
Coveralls 内でコードファイルを選択しても何も表示されない場合( “SOURCE NOT AVAILABLE” )は、ディレクトリの起点( “Git repo root Ddrectory” )を確認してください。