Software Engineer in Testチーム(通称:SET)でスマホアプリの自動化をすすめている笠間です。現在、SETチームでは、スマホアプリの自動化をすすめています。
現在は、Android、iOSともにAppium を使い、アプリの肝となるシナリオ30〜40件をターゲットにしており、その作成コストや運用コストを確認しながら、その範囲を広げていこうとしています。
輝く未来を抱きしめて。Software Engineer in Testチーム(通称:SET)で技術支援を行っている daipresents です。
自動化されたエンドツーエンドのテスト(E2Eテスト)を運用していると、そのテストを実行し、失敗したときの原因究明にかかる運用コストは馬鹿にできません。
なぜなら、テストの自動化によって、大量のテストを何回も自動実行できるようになると、その結果を確認するコストも同時に大きくなるからです。
そのために、テストや環境を安定化したり(実はこれが自動化にとって一番大切な仕事かもしれない)、失敗したときの原因究明スピードを速くしたりと、各現場で改善されているのだと思います。
この記事では、失敗したテストの原因究明として一番使いやすい「テスト実行時に動画撮影する方法」を、Appiumを使って実現したいと思います。なお、解説に使う言語は Ruby を利用していますが、Appiumが対応している各種言語で実装されています。
Appium には start_recording_screen / stop_recording_screen というメソッドが用意されています。Macで動かしてみたところ、メソッドを利用するには brew install ffmpeg が必要みたいです。動作確認は Android は Emulator、 iOS は Simulatorでしています。
参考: recording-screen – appium/appium GitHub
Ruby の例だと以下のように解説されています。
# 録画開始
# Ruby
# ruby_lib example
start_recording_screen
start_recording_screen video_size: '1280x720', time_limit: '180', bit_rate: '5000000' # Android
start_recording_screen video_type: 'h264', time_limit: '260' # iOS
# ruby_lib_core example
@driver.start_recording_screen
@driver.start_recording_screen video_size: '1280x720', time_limit: '180', bit_rate: '5000000' # Android
@driver.start_recording_screen video_type: 'h264', time_limit: '260' # iOS
# 録画終了
# Ruby
# ruby_lib example
stop_recording_screen
stop_recording_screen remote_path: 'https://example.com', user: 'example', pass: 'pass', method: 'POST'
# ruby_lib_core example
@driver.stop_recording_screen
@driver.stop_recording_screen remote_path: 'https://example.com', user: 'example', pass: 'pass', method: 'POST'
とても簡単ですね。
ただ、この例を参考に試したところ、Androidは .mp4 形式で録画できたのですが、 iOS だとうまく録画できませんでした。 video_type: 'h264' だと以下のエラーが出るのです。
Selenium::WebDriver::Error::UnknownError: An unknown server-side error occurred while processing the command. Original error: The screen capture process 'ffmpeg' died unexpectedly. Check server logs for more details
from UnknownError: An unknown server-side error occurred while processing the command. Original error: The screen capture process 'ffmpeg' died unexpectedly. Check server logs for more details
ここをみると video_type: 'libx264' という指定ができるようですが、これも同じエラー。JSON Prameters には以下のように書かれていますがどれもだめ・・・。
options.videoType string (iOS Only) The format of the screen capture to be recorded. Available formats "h264", "mp4" or "fmp4". Default is "mp4". Only works for Simulator.
Appiumサーバのログを見ると、どうも、ffmpegを実行するときのパラメタの指定方法が間違ってるかもよ?とメッセージが。だとすればAppium内のパラメタ指定方法が怪しいかもしれない。
困ったので iOS のソースを見てみると、デフォルト値が video_type: 'mjpeg' だったので試してみると、おお! ファイルができた!!! しかし、QuickTimeで開けず、なにか壊れているような・・・。
最後にたどり着いたのがGitHubのこのIssue (Can’t play screen recorded video)。やさしい人が「mpeg4を使えばいけるよ!」と書いていたので試してみたらうまく動きました。さらに iOSは video_fps パラメタによってタイムラプスみたいな動画も作成可能。ファイル容量も圧縮できて便利です。
完成形はこんな感じです。
# iOS
@driver.start_recording_screen video_type: 'mpeg4', video_fps: 5, video_quality: 'low', force_restart: true, time_limit: '300'
# Android
@driver.start_recording_screen video_size: '1280x720', bit_rate: '1000000', force_restart: true, time_limit: '300'
StopするとBase64変換されたデータがかえってくるので、これをそのままファイルにする必要があるのですが、GitHubで調べてみると stop_and_save_recording_screen というメソッドが存在したので、これを活用できます。
@driver.stop_and_save_recording_screen '/Users/dai/sample.mp4'
以上、Appiumを使った動画撮影の解説でした。Emulator や Simulator で動くので(XcodeやiOSのバージョンには依存するらしい) 、実機を使わず並列実行するときなどにぴったりです。
さらにこのメソッドを使うと、Android/iOSともに動画撮影できるので、誰でも簡単に失敗原因を特定できます。ぜひご活用ください!
Mobility Technologies では共に日本のモビリティを進化させていくエンジニアを募集しています。話を聞いてみたいという方は、是非 募集ページ からご相談ください!