この記事はモバイルファクトリー Advent Calendar 2020 23日目の記事です。
こんにちは、id:nesh です。
はじめに
今回の記事は2年前の記事と関連して、モバイルアプリのテストを自動化する話です。過去の記事 AppiumでAndroidアプリの自動テストをPerlで書いてみた - Mobile Factory Tech Blog では、Perl + Appium を使ったAndroidアプリのテストについて書きました。
今回の記事には、Appium + AWS Device Farm + Jenkins を使い、Androidのモバイルアプリの動作確認を複数端末における自動化について書きます。
背景
運用中サービスのアプリに変更を入れる場合、当サービスがサポートする端末でアプリの動作確認をするのが理想的だと思います。 コロナ禍前は、会社に検証用の端末があるため、サポートする端末や問題がありそうな端末を複数台確保して、動作確認を行いやすかったです。 しかし、2月からフルリモートで働くようになってから、手元に検証用の端末は(複数台)ない状態になっています。
手軽に複数端末で、モバイルアプリのテストをしたいので、今回目をつけたのは AWS Device Farm です。
AWS Device Farm
Device Farm は、実際に Amazon Web Services (AWS) によりホストされている電話やタブレットで、Android や iOS、およびウェブアプリを物理的にテストしてやり取りできるアプリテストサービスです。(AWS公式サイトより引用)
モバイルアプリの開発における様々な端末での動作確認を楽にしてくれるAWSのサービスです。 このサービスの使い方は2つあります。
- 自動アプリテスト
- リモートアクセスの操作
今回は様々の端末での動作確認を自動化したいので、自動アプリテストを使います。
自動アプリテスト
事前準備
まずやっておくことは、AWS Device Farm上の準備ですが、上記のブログ記事を参考に作業します。
- テストするアプリを用意
- 動作確認をAppium (Node.js) のテストで実装
- AWS Device Farm上で設定し、自動テストアプリを実行
テストするアプリを用意
テストするアプリはAWS Device FarmやAppiumが用意してくれたサンプルアプリを使うのもできますが、今回は自分で作ったHelloWorldを表示するアプリを使います。
app/outputs └── app-debug.apk
動作確認をAppium (Node.js) のテストで実装
テストしたいことは、アプリを起動できるかどうかだけにします。
// テストフレームワーク var expect = require('chai').expect; // node.js でappiumを使う var wd = require('wd'); var driver = wd.promiseChainRemote({ host: 'localhost', port: 4723 }); var assert = require('assert'); describe('AWSDeviceFarmReferenceAppTest', function () { before(function () { this.timeout(300 * 1000); return driver.init(); }); after(function () { console.log("quitting"); }); // アプリが起動できて、'Hello World!!' が表示されるテスト it('test_app_is_loaded', async function () { const element = await driver.elementById("com.example.nesh.helloworld:id/change"); expect(element).to.exist; }); });
このテストをそのままローカルで実行すると失敗します。
driver.init()
に必要なデバイスの情報が足りないからです。
ただ、AWS Device Farm上で実行される時、これらの情報がよしなに補完されます。
このテストファイルをAWS Device Farmで使うために、 npm-bundle
と zip化する必要があります。
AWS Device Farm上で設定し、自動テストアプリを実行
- 新しくプロジェクトを作成
- 新しいrunを作成して、必要な項目を設定
- アプリの
*.apk
ファイルをアップロード - zip化されたテストファイルをアップロード
- デバイスを選択
- アプリの
- 必要設定を埋めたら、自動アプリテストを実行
必要な作業は大体上記の通りです。
ここまでの作業で、モバイルアプリを複数端末で手軽に自動テストできるようになりました。 しかし、AWS Device Farm上の操作自体が手間になると思います。 この手間を無くし、継続的にテストを回せたいと思っているので、Jenkins で自動化することにしました。
Jenkinsで自動化
自動化するのは、 AWS Device Farm上で設定し、自動テストアプリを実行
の操作です。
操作自体は単純で手間ではないのですが、自動にできる部分は自動化したい気持ちです。
自動化するといっても、JenkinsにAWS Device Farm用のプラグインが用意されてるので、簡単に自動化できます。
AWS Device Farm の Jenkins CI プラグイン - AWS Device Farm
Jenkinsで使うプラグインは aws-device-farm | Jenkins plugin です。 この記事は上記に用意したサンプルリポジトリを使った場合、設定のスクリーンショットをいくつか貼ります。
Project
と Device Pool
はAWS Device Farm上に設定されてるものを参照します。Application
はサンプルリポジトリ上のアプリファイルのパス
今回のテストは Appium (Node.js) を使うので、該当テストファイルのパスを入力します。
テスト環境の設定は、AWS Device Farm上に手動で自動アプリテストを実行した時のものをそのまま使います。
これで、Jenkinsでの自動化のための設定ができて、実行して成功できました。
試してみた所感
- AWS Device Farm の自動アプリテストはアプリ開発時の動作確認に便利
- 最初の設定も簡単で、テストするアプリさえあればすぐにできる
- テストデバイスの起動時間が合計1,000分まで無料なので、気楽に試せる
- アプリ開発時のサポート端末での起動確認などで使えそう
- 自動化に関しては、アプリのビルドやテストファイルの
npm-bundle + zip
などの作業も自動化すれば理想的
日々の面倒な作業を自動化して、快適な開発ライブを充実しましょう。
明日の記事は id:kfly8 さんです!