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
これをやるだけで、ビルドのログとテスト結果がとても読みやすくなる。
さらに、–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
という形で使う必要があることを頭に入れておくとよい。(参考)
次のポストでは、申請用ビルドのアップロードを見ていこう。
「macOSアプリのCI事情3 – xcodebuildを使ってテストする」への2件のフィードバック