macOSアプリのCI事情3 – xcodebuildを使ってテストする

macアプリのCIを構築していく上で、xcodebuildの基本的な使い方を押さえておく必要がある。
xcodebuildはXcodeをインストールすると使えるようになるコマンドで、プロジェクトのビルドやテストの実行などに使われる。JenkinsのXcodeプラグインや、fastlaneのgymなどのサードパーティ製のビルド補助ツールも、基本的には内部的にはxcodebuildを使っている。macOSアプリ、iOSアプリ、tvOSアプリなど、Xcodeが対応している各種プロジェクトは共通してxcodebuildを使ってビルド・テストできる。まずは、テストを実行してみよう。

Xcode上でテストを実行できることを確認しておく

xcodebuildでテストを実行する前に、Xcode上でテストを正しく実行できることを確認しておく。Xcodeでプロジェクトファイルを開いたら、テストを実行可能なSchemeを選択し、Cmd + U(あるいは、ProductメニューからTestを選ぶ)でテストを実行し、Succeededになることを確認しておく。成功しない場合(特に、ビルド・実行自体に失敗してしまう場合)は、Xcode上で直しておく。実行を確認できたら、実行時に選択したSchemeの名前を確認して、Xcodeは終了しておこう。

Xcodebuildで実行する。

同じテストをxcodebuildで実行してみる。
xcodebuildコマンド、ビルド・テストしたいプロジェクトのルートディレクトリにて実行する必要があるので、移動する。

cd projectDirectory/

そして、xcodebuildを実行する。xcodebuildには、いくつかパラメータを指定する。

xcodebuild -workspace gpx-to-movie.xcworkspace -scheme "gpx-to-movie" test

この例では、workspaceとschemeを指定した上で、testアクションを実行してテストを走らせている。
Workspace(xcworkspace)を使わずに、プロジェクト単体でビルドやテストをしている場合はworkspaceではなくprojectを指定する。

xcodebuild -project gpx-to-movie.xcodeproj -scheme "gpx-to-movie" test

schemeには、先ほどXcode上でテストの実行の確認に使用したSchemeを指定する。Scheme名がわからない場合は、下記のコマンドで利用可能なSchemeの一覧を確認することもできる。

xcodebuild -list

テストに成功すると、下記のようなログが出るはずだ。

Test Suite 'All tests' passed at 2016-10-02 21:52:14.048.
 Executed 2 tests, with 0 failures (0 unexpected) in 0.293 (0.295) seconds
** TEST SUCCEEDED **

Xcode上で実行した時と、テストの数、結果が同じになっていればOK。違う場合は、指定するSchemeが間違っているか、Workspaceを指定しなければいけないところをProjectを指定してしまっていないか確認する。

xcprettyを使って出力を綺麗にする

xcodebuildでテストを走らせた場合のログは非常に読みにくい。また、上記のログを直接使って「テストに成功したかどうか」を判断するのは面倒臭い。サードパーティ製のxcprettyというツールを使うと、この二つの問題を解決できる。
https://github.com/supermarin/xcpretty
インストールはgemから。

gem install xcpretty

使い方は至って簡単。xcodebuildコマンドとパイプで繋ぐだけ。

xcodebuild -workspace gpx-to-movie.xcworkspace -scheme "gpx-to-movie" test | xcpretty

これをやるだけで、ビルドのログとテスト結果がとても読みやすくなる。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-02-21-59-29
さらに、–report junitオプションを加えると、テスト結果をxmlファイルにしてbuild/reports/junit.xmlというファイルに書き出してくれる。

xcodebuild -workspace gpx-to-movie.xcworkspace -scheme "gpx-to-movie" test | xcpretty --report junit

出力されたxmlファイル

<?xml version='1.0' encoding='UTF-8'?>
<testsuites tests='2' failures='0'>
 <testsuite name='gpx_to_movieTests.gpx_to_movieTests' tests='2' failures='0'>
 <testcase classname='gpx_to_movieTests.gpx_to_movieTests' name='testExample' time='0.000'/>
 <testcase classname='gpx_to_movieTests.gpx_to_movieTests' name='testPerformanceExample' time='0.292'/>
 </testsuite>
</testsuites>

このJUnit形式のxmlがあると、JenkinsなどのCIツールで、テスト結果に応じて処理を分けたりすることができるようになる。なお、ビルド失敗時にそこで処理を中断したい場合は

set -o pipefail && xcodebuild [flags] | xcpretty

という形で使う必要があることを頭に入れておくとよい。(参考)
次のポストでは、申請用ビルドのアップロードを見ていこう。

Pocket

「macOSアプリのCI事情3 – xcodebuildを使ってテストする」への2件のフィードバック

macOSアプリのCI事情2 – なんてこったいブログ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です