Help us understand the problem. What is going on with this article?

simctlでXcodeのUI Testの画面を録画する

More than 1 year has passed since last update.

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を実行し、その際の動画を撮影してみます。
ざっくり言えば以下の手順をコードに落とし込む必要があります。

  1. simctlで録画開始
  2. UI Test実行
  3. テスト完了後に録画終了

今回は私は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

生成された動画

uitest_half.gif

課題🤔

かなり適当にpython書いてしまったのでシミュレータの起動中も動画が録画されてしまってます。
xcodebuildの標準出力を監視してテストが開始される適切なタイミングで録画開始が出来るように改善したい。
デバイス名やファイル名などもちゃんとパラメタで受け取ったり出来るようにしたいですね。

tamaki
普段はiOSエンジニアしてます。最近はサーバサイドもやりたいのでNode.jsをいじってます。その他IoTやVRに興味あり。
littleBits
littleBitsに知り、littleBitsが好きになった人たちが交流し、littleBitsのいろいろな楽しみ方や活かし方を共有していくユーザーグループです。
https://www.facebook.com/groups/littlebitsugjp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away