iOS Simulatorを管理するsimctl
にはスクリーンショットやビデオ録画を行えるオプションio
が存在します。
スクリーンショットについてはXCTestがXCode9でサポートしているため、あまりsimctl
で行うことはないかもしれません。
しかし、画面のスクリーンショットでは画面遷移時などのアニメーションについてどのように表示されたか分かりにくいという点があります。
そこでUI Test時の画面をビデオ録画する方法を試してみました。
simctl io
コマンドについて
具体的にsimctl
を使った録画の方法は以下のようになります。
$ xcrun simctl io デバイス名 recordVideo 動画ファイル名
コマンドを実行後録画が始まり、録画を終了する際はCTRL+C
で録画を終わります。
// 実行例
$ xcrun simctl io 'iPhone SE' recordVideo uitest.mov
...
pics: 357, gop size in sec: 30.000000
Recording... (Press CTRL+C to stop)
^C
Recording completed.
UI Testの動画を撮影する
次に実際にxcodebuild test
を実行し、その際の動画を撮影してみます。
ざっくり言えば以下の手順をコードに落とし込む必要があります。
-
simctl
で録画開始 - UI Test実行
- テスト完了後に録画終了
今回は私はPythonで書いてみました。
# uitest_with_video_record.py
import subprocess
import signal
video_record = subprocess.Popen("xcrun simctl io 'iPhone SE' recordVideo uitest.mov", shell=True)
xcodebuild_test = subprocess.run("xcodebuild test -scheme VideoRecordingOfUITestUITests -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone SE,OS=11.1'", shell=True)
video_record.send_signal(signal.SIGINT)
これを実行するとUI Testが始まり、完了後にsimctl
の録画が終了され、uitest.mov
という動画ファイルが生成されるわけです。
$ python uitest_with_video_record.py
生成された動画
課題🤔
かなり適当にpython書いてしまったのでシミュレータの起動中も動画が録画されてしまってます。
xcodebuild
の標準出力を監視してテストが開始される適切なタイミングで録画開始が出来るように改善したい。
デバイス名やファイル名などもちゃんとパラメタで受け取ったり出来るようにしたいですね。