TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

GHUnitのテストカバレッジをJenkinsで表示する はてなブックマーク - GHUnitのテストカバレッジをJenkinsで表示する

Permalink

概要

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

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

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

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

事前準備

Jenkinsの導入

GHUnitの導入

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

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

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

  • Generate Test Coverage Files
  • Instrument Program Flow

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

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

1
2
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 に以下コードを追記しておく必要があります。

1
2
3
4
5
6
7
8
9
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)に

  • *.gcda
  • *.gcno

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

gcovrの設置

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

Jenkinsのジョブの設定

必要なPlugin

  • Git plugin
  • Cobertura plugin

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

ジョブの設定

  • Source Code Management
    • Repositories: 対象となるGitリポジトリのURL

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

  • BuildにGHUnit実行用の Execute Shell を追加
1
GHUNIT_CLI=1 WRITE_JUNIT_XML=YES xcodebuild -target Tests -configuration Debug -sdk iphonesimulator clean build
  • Buildeにgcovr実行用の Excute Shell を追加
1
gcovr -r . --object-directory build/CodeCoverageWithGHUnit.build/Debug-iphonesimulator/Tests.build/Objects-normal/i386 --exclude '.*Tests.*' --exclude '.*ExternalFrameworks.*' --xml > build/coverage.xml

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

  • Post-build Actionsに Publish JUnit test result report を追加
1
build/test-results/*.xml
  • Post-build Actionsに Publish Cobertura Coverage Report を追加
    • Consider only stable builds: On
    • Source Encoding: UTF-8
    • Cobertura xlm report pattern
1
build/coverage.xml

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

以上で設定は完了です。

あとは実行するだけ!

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

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

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

Comments