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

この記事は投稿日から1年以上が経過しています。

概要

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

ghunit-coverage

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

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

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

事前準備

Jenkinsの導入

GHUnitの導入

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

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

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

test-coverage-setting

  • Generate Test Coverage Files
  • Instrument Program Flow

の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*)に

  • *.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 を追加
GHUNIT_CLI=1 WRITE_JUNIT_XML=YES xcodebuild -target Tests -configuration Debug -sdk iphonesimulator clean build
  • Buildeにgcovr実行用の Excute Shell を追加
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 を追加
build/test-results/*.xml
  • Post-build Actionsに Publish Cobertura Coverage Report を追加
    • Consider only stable builds: On
    • Source Encoding: UTF-8
    • Cobertura xlm report pattern build/coverage.xml ※ この他、Coverage Metrics Targets で特定のカバレッジを下回った場合にはジョブ失敗とみなすなどの設定ができるようです。

以上で設定は完了です。

あとは実行するだけ!

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

coverage-graph

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

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

所の執筆・監修した書籍

iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川 克己,所 友太,永野 哲久,加藤 寛人,
  • 製本版,電子版
  • PEAKSで購入する