Azure Pipelinesでappium screen recordingを試してみた

先日の日記でAzure Pipelinesを使ってAppiumの試験を走らせてみました。

siro-uma.hatenablog.com

Azure Pipelines便利に使わせてもらっていたのですが、テストが失敗したときのデバッグが辛かったので(あるある過ぎますが)、AppiumのScreen recordingの機能を使って失敗後に何が問題だったかデバッグできるようにしてみました。

テストスクリプト側の実装

まずはテストスクリプト側からAppiumのScreen recordingのAPIを叩いて画面を録画しましょう。

Start Screen Recording - Appium

Stop Screen Recording - Appium

appiumのscreen recordingのAPIはとっても簡単に扱えます。基本的に、録画開始時と終了時にAPIを叩くのみ。で、終了時に叩くAPIの返り値であるBase64 String formatをデコードしてファイルに書き出すだけです。

録画開始時と終了時に呼ぶ必要があるので、それぞれをpytestのsetup/teardown method内で呼ぶのが簡単で良いかと思います。さっそく書いてみたのが以下のコードになります。

順に説明していきますと、

  • 10行目: setup関数内で start_recording_screen を呼び録画開始。
  • 13行目: teardown関数内で stop_recording_screen を呼び録画終了。返り値をresultとして保存。
  • 14~20行目: pythonのファイル保存のためのお作法ですね。getcwdで現在の作業ディレクトリを取得し、screen_recording というフォルダを掘り、その中に screen_recording_{current_time}.mp4なファイルパスを作っています。
  • 21行目: base64.b64decodeを使ってstop_recording_screenで取得したBase64 stringをデコードし、ファイルに保存しています。

TestVolleyBall はPytestのテストクラスで、上記に記述されているsetup/teardown以外にも実際のテストケースがいくつか存在しています。なので、上記の処理がテストの初めと最後で都度実施され、それぞれのテストの実行画面が動画として保存されることになります。

テストスクリプト側は上記で完了となります。(簡単!)

Azure Pipelines側の対応

続いてAzure Pipelines側( azure-pipelines.yml に対する修正)についてです。

ベースとなるazure-pipelines.yml は前回の記事で使ったものとします。そのベースに対して、今回は

  • 必要なパッケージ (ffmpeg) のインストール
  • 録画データの保存

を追加していきます。

ffmpegのインストール

appiumのscreen recordingのAPIを使うにはffmpegがインストールされている必要がありますが、Azure Pipelinesで提供されているmacOSのイメージにはffmpegが入っていないようです。なので別途インストールが必要になります。

macではbrewを使って簡単にインストールが可能なので、そのようなステップをazure-pipelines.ymlに追加します。

  - bash: |
      brew install ffmpeg

上記だけで、必要なパッケージが揃うはずです。

録画データの保存

録画データの保存のためには Azure Pipelinesのタスクである Publish Build Artifacts task を使うことになります。

Publish Build Artifacts task - Azure Pipelines | Microsoft Docs

このタスクでは保存したいファイル (or フォルダ) を指定するだけで良いです。

  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: 'tests/screen_recording'

私のアプリのレポジトリの関係で、testsというフォルダの下に(上述の通り)screen_recordingというフォルダを掘って録画ファイルを保存するので、そのフォルダを PathtoPublishinputsとして指定します。

設定は以上のみとなります。

結果

上記の実装を施したazure-pipelines.ymlがこちらになります。

ffmpegのインストール部分が37行目、録画ファイルの保存の箇所が48行目あたりにあるのがわかると思います。

一点注意して欲しいのが43行目。continueOnError というoptionをbashのタスク内で有効にしているのがわかると思います。Azure PipelinesのPipelineでは、Pipeline内のTaskが失敗するとその後の処理をスキップしてしまう仕様のようなので、このoptionを有効にすることで、bash内のpytestでテストが失敗するケースでも動画を保存するようにすることができます。

実際にAzure Pipelinesを上記のymlを使って走らせビデオの保存に成功したときのスクリーンショットが以下になります。

f:id:siro_uma:20190508221327p:plain

保存した動画は画面右上のArtifactsのボタンからダウンロード可能です。

f:id:siro_uma:20190508221618p:plain

まとめ

今回はAzure Pipelinesからappiumで提供されているScreen recordingのAPIを使ってテスト実施中のデバイス(Simulator)の画面を録画・保存を試してみました。

便利に使わせてもらっているAzure Pipelinesですが、まだまだ遊ぶ余地がありそうなので、今後もがっつり遊び倒していきたいと思います。なんて言ったって無料ですし!

乞うご期待。