スマホのE2Eテストでクラウド上の実機を利用する

kicchan
WingArc1st Inc.
Published in
Sep 1, 2022

こんにちは。QAをやっている kicchanです。

最近はIT人材の不足が叫ばれていますよね。

そんな中、効果的だと言われている打ち手の一つに、作業の効率化が見込める自動化があります。私が携わっているプロダクトでも積極的にテストの自動化を進めています。

スマホのテストの様子 photo by Kichima

スマホのE2Eテストの課題として「スマホをどう調達するか?」、「CIにどのように組み込むか」というものがあります。今回の記事では、この2点に着目してノウハウを共有します。

先に述べたいことを書いておきますね。

  • スマホはRemote TestKitというサービスを利用する
  • スマホの利用にはThriftAPIを利用したプログラムを自作する
  • CIから利用するマシン(踏み台)はMacを使おう

では、本題に入っていきます。

クラウド上の実機を利用する

スマホのE2Eテストを始めようとすると、次のような点が求められます。

  • Android/iOSのテストができること
  • バージョン違いのOSのテストができること

しかし、たくさんのスマホを調達するのは大変ですし場所も取りますよね。

これらのことを解決するために現在はRemote TestKit(以下RTK)という、クラウドでスマホをレンタルできるサービスを利用しています。700機種が利用できるそうです。

スマホをレンタルするプログラムの作成について

RTKにてスマホをレンタルするには、ブラウザもしくは、Windows/Macの「ソフトウエア版」アプリケーションから行います。しかしこれでは手動の操作を伴うため、CIに組み込めません。

ですので自動化に向けて、RTKのスマホを自動レンタルするプログラムを作成します。

手順は公式サイトが詳しいのでご覧ください。具体的にはApache Thriftを利用します。

Apache Thrftを利用したプログラミングはいくつかの言語から選択することができますが、説明にならいJava言語で作成しました。執筆時点の説明ではJava7となっていますが、バージョンを上げてJava8にしても大丈夫でした。

作成時にハマった点として、thriftコンパイラは説明にあるバージョン(v0.9.1)でないとコードの生成ができないことがあげられます。どうやら新しいバージョン(v0.16.0)には対応していないようです。

スマホをレンタルするプログラムの注意点

スマホをレンタルするプログラムを作成するときは、いくつか注意する点があります。

  • APIリファレンスに詳細が記載されていないので、トライアンドエラーを繰り返す必要があります。
    特にエラー処理を作るのには時間がかかりました。例外が発生した際に利用されるクラス(ServiceException)からスタックトレースが取得できずに、エラーコードしかわかりません。そのため原因を特定するために環境を変えながら実際に動かして確認しました。例えば別PCからレンタルしておいてエラーを発生させるなどです。
  • 作成するプログラムの引数には、レンタルしたいスマホを複数指定できるよう作るのをお勧めします。RTKのスマホは利用者間で共用しているためレンタルできないことがあるのですが、レンタルできないことでE2Eテストが止まってしまうのを防ぐためです。
    特定の端末やOSバージョンを指定したい場合は、スマホを1つだけ指定して呼び出し側でエラー処理をすればよいです。

続いてCIへ組み込むことを想定した、考慮点について示します。

  • プログラムでRTKに接続している間のみadbコマンドが使えます。そのためセッションをキープする仕組みが必要です。
  • スマホのレンタルは規定の時間(30分)単位であり、プログラムでセッションをキープしている間は自動的に延長します。またプログラムが終了しても規定の時間の超過を待たないと返却されません。
    そのため、他の端末を利用してE2Eテストを連続してテストしたいというケースに対応できません。
  • 上記の2つの特性から、スマホをレンタルするプログラムと、E2Eテストを並行して実行する必要があります。そのためCIに組み込む場合は工夫が必要となります。
    私は、レンタルするプログラムに特定のファイルを監視させ、存在する間はレンタルを継続するようにしました。そしてE2Eテスト終了後にCIからそのファイルを削除して、レンタルを終了させるという工夫をしました。
  • ThriftAPIを使っている関係上、スマホをレンタルするプログラムを実行するときには「ソフトウエア版」アプリケーションに内包されるThriftサーバを起動しておく必要があります。

これらのことを考慮して、スマホを自動でレンタルすルプログラムが完成しました。ずいぶんニッチな話になってしまいましたね。

作成したプログラムを単体で動作させた様子

CIへ組み込みについて

先程作成したプログラムをCIから呼び出して、E2Eテストが可能な状態を作っていきます。はじめに考えた構成は次のような形です。

CIの構成図

私はレンタルする踏み台にWindowsを選択しましたが、構築するにつれ、Macを使用したほうが良いとの結論に至りました。

Windowsの踏み台の注意点

スマホをレンタルするために、「ソフトウエア版」アプリケーションをインストールしたWindowsを用意し踏み台とします。CIからはWindwosにSSHしてレンタルするプログラムを起動しています。

このようにWindowsを踏み台にした場合の注意点について示します。

  • レンタルをするプログラムに必要なThriftサーバは、SSHの接続を閉じると終了してしまいます。
    回避する方法はタスクスケジューラーから実行することです。「ユーザーがログオンしているかどうかに関わらず実行する」を選択し、起動時間を指定します。
    なおタスクスケジューラーからThriftサーバを起動した場合は、止める手段がありません。2回目以降の起動はポート重複で起動失敗を期待しています。
    Macであれば nohupが使えますのでこのような問題は起きません。
  • レンタルをするプログラムやAppiumサーバーも同様にSSHの接続を閉じると終了してしまいます。よってタスクスケジューラーから起動します。
タスクを利用して必要な処理を実行します。

Windowsの踏み台を用意することでCL環境の構築が完了し、RTKのスマホが自動選択されレンタルされるようになりました。これにより、RTKのスマホを自動操作するE2Eテストを行うことができるようになります。

次回に向けた改善点

Windowsの踏み台を用意してCI環境の構築をすませましたが、タスクスケジューラーを時間指定で起動するのは柔軟性がなく、いまいちです。
そのため、踏み台はMacをおすすめします。

もしRTKにLinux系のソフトウェア版があれば、CI上で完結できるので早期のリリースを望んでいます。

最後に

スマホのE2Eテストでクラウド上の実機を使ったノウハウを共有しました。お役に立てれば幸いです。
今回共有した内容を纏めまして終わりとします。

  • スマホはRemote TestKitというサービスを利用する
  • スマホの利用にはThriftAPIを利用したプログラムを自作する
  • CIから利用するマシン(踏み台)はMacを使おう

それではどこかでお会いしましょう。

--

--

kicchan
WingArc1st Inc.

エンジニア。QA、Webのバックエンド、CI/CDのインフラ構築などをやっています。Certified ScrumMaster/ 2nd class Qualified Certified Electrician