GHUnitのテストカバレッジをJenkinsで表示する

2012年9月2日
ios / jenkins /

概要

設定が完了すると、JenkinsでGHUnitのテストが実行された後に以下のようにテストカバレッジが参照できます。

ghunit-coverage

設定がちょっとだけ面倒ですが、一度やって慣れてしまえばなんてことありません。

実際に動かしてみたサンプルプロジェクトは Github に置いてあります。
うまく動かない場合の設定の比較などにご参照ください。

なお、ここではiOSアプリ開発用としての紹介をさせていただきます。

事前準備

Jenkinsの導入

GHUnitの導入

GHUnitのiOS用frameworkをビルドするのが面倒な場合は、Github にビルド済みのものを置いてあるのでこれを使っていただいても構いません(2012/9/2時点でXcode 4.4.1 では問題なく利用できました)。

テストカバレッジを出力するためのプロジェクトの設定を変更する

GHUnitを使っている場合はテスト用のターゲットにのみ設定すればOKです。
具体的には、以下のように

test-coverage-setting

の2つに YES を設定します。

本来であれば上記だけで完了とできるのですが、現状だとXcodeにバグがあるというこでこのままだとJenkinsでのジョブ実行時に

Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
fopen$UNIX2003 called from function llvm_gcda_start_file in image Tests.

というエラーが出ることになります。

この対処として、 main.m に以下コードを追記しておく必要があります。

FILE *fopen$UNIX2003(const char *filename, const char *mode)
{
  return fopen(filename, mode);
}
 
size_t fwrite$UNIX2003(const void *ptr, size_t size, size_t nitems, FILE *stream)
{
  return fwrite(ptr, size, nitems, stream);
}

最後に、テスト用のターゲットの info.plistApplication does not run in background を加え、ここに YES を設定します。

ここまででXcode側の設定は完了なので、GHUnitのテストを実行するとbuildディレクトリ以下(自分の場合は build/CodeCoverageWithGHUnit.build/Debug-iphonesimulator/Tests.build/Objects-normal/i386)に

といったテストカバレッジの結果を出力したファイルが確認できるはずです。
Jenkinsを使わずローカルでこの結果を確認したい場合は、 CoverStory などでこれらのファイルを開けばローカルで確認することも可能です。

gcovrの設置

上記で出力したテストカバレッジの結果をJenkinsのCobertura pluginで読める形式に変換するために、 gcovr というPythonスクリプトを利用します。
具体的には、ココ からダウンロードしてPathの通った場所にこれを設置します。

Jenkinsのジョブの設定

必要なPlugin

をJenkinsにインストールしてください。

ジョブの設定

※ サンプルをそのまま利用したい場合は git://github.com/tokorom/CodeCoverageWithGHUnit.git をご利用ください

GHUNIT_CLI=1 WRITE_JUNIT_XML=YES xcodebuild -target Tests -configuration Debug -sdk iphonesimulator clean build
gcovr -r . --object-directory build/CodeCoverageWithGHUnit.build/Debug-iphonesimulator/Tests.build/Objects-normal/i386 --exclude '.*Tests.*' --exclude '.*ExternalFrameworks.*' --xml > build/coverage.xml

※ テストターゲットやプロジェクト名は適宜変更してください

build/test-results/*.xml
build/coverage.xml

※ この他、Coverage Metrics Targets で特定のカバレッジを下回った場合にはジョブ失敗とみなすなどの設定ができるようです。

以上で設定は完了です。

あとは実行するだけ!

テストカバレッジが複数回取られると、Jenkins上で

coverage-graph

のようにカバレッジの変化をグラフで確認することもできるようになります。

参照させていただいたブログ記事へのリンク

Related Entries
Latest Entries