CI上でしか再現していないUnit Testの問題を調査している時に調べたメモを共有しておきます。
xcprettyを使うとxcodebuildが出力するログを色付きで綺麗に表示することができたり、結果を整形済みhtmlとして出力してくれるので、Xcodeによるログ出力より見やすく開発効率が上がるかもしれません。
- macOS High Sierra 10.13.2
- Xcode 9.2
iOSシミュレータ一覧表示
$ xcrun instruments -s
シミュレータ一覧がそれぞれのIDや名称とともに表示されます。
目当てのシミュレータが表示されない場合、xcode-selectが別のバージョンを指している可能性があります。
$ sudo xcode-select --switch /Applications/Xcode9.2.app
もしくは、Xcode > Preferences > Locations > Command Line Tools
で選択変更してください。
テスト開始
シミュレータ起動
open "/Applications/Xcode9.2.app/Contents/Developer/Applications/Simulator.app" "--args" "-CurrentDeviceUDID" "<simulator_id>"
Xcodeのバージョン, <simulator_id>
は環境に合わせて変更してください。
-
<simulator_id>
... シミュレータのID
テスト実行
$ set -o pipefail && env "NSUnbufferedIO=YES" xcodebuild "-workspace" "<path_to_workspace>" "-scheme" "<scheme_name>" "build" "test" "-destination" "id=<simulator_id>" | xcpretty "--color" "--report" "html" "--output" "<path_to_result_file>"
以下は環境に合わせて変更してください。
-
<path_to_workspace>
... xcworkspaceのパス -
<scheme_name>
... スキーム名 -
<simulator_id>
... シミュレータのID -
<path_to_result_file>
... テスト結果ファイルの書き出し先パス
例:
$ set -o pipefail && env "NSUnbufferedIO=YES" xcodebuild "-workspace" "myapp.xcworkspace" "-scheme" "myapp" "build" "test" "-destination" "id=57616E4F-D952-48AB-8F52-F0BF0BF3C1FF" | xcpretty "--color" "--report" "html" "--output" "xcode-test-results-myapp.html"
説明
set
変数の値を設定する。
-o pipefail
If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands in the pipeline exit successfully. This option is disabled by default.
途中のコマンドが異常終了したときにコマンド全体の返り値がその値となるよう設定。
env
NSUnbufferedIO=YES
If set to YES, Foundation will use unbuffered I/O for stdout (stderr is unbuffered by default)
FoundationがstdoutにバッファされていないI / Oを使用する設定。
他にも NSZombieEnabled
NSDeallocateZombies
など昔世話になったことがあるやつが設定可能なようです。
https://developer.apple.com/library/content/technotes/tn2239/_index.html
xcodebuild
-workspace
workspaceのパスを指定します。
-workspace
か -project
どちらかを指定する必要があります。
-scheme
指定可能な一覧は以下で確認できます。
$ xcodebuild -list -workspace <project_name>.xcworkspace
$ xcodebuild -list -project <project_name>.xcodeproj
-destination
key=valueを,(カンマ)区切りで指定します。 id
を指定するのが手っ取り早い。
他には、platform
OS
name
arch
などが指定できるようです。
xcpretty
詳細はこちら
--color
--report
html以外のスタイルはよくわからんので試していません。
-
junit
... JUnit-style XML -
html
... simple HTML
-
json-compilation-database
... JSON compilation database
--output
reportを保存するパス