概要
Firebase Test Labはクラウドベースのアプリテスト基板で、その機能はgcloud command-line clientから利用可能です。したがって、gcloud
コマンドを使用してFirebase Test Lab上でのAndroidアプリのテストの実行をスケジューリングできます。
公式にFirebase Test Labが公開される前、Cloud Test Lab時代からテストをCLIから実行するためのドキュメントはありましたが、正式にリリースされたので試して見ようと思います。
以下のドキュメントを参考に作業を進めます。
Firebaseプロジェクトの作成と課金
Firebaseのプロジェクトをまだ作成していないのであればFirebase consoleから作成します。「新規プロジェクトを作成」をクリックし、プロジェクト名と国を選択し、「プロジェクトを作成」をクリックします。
メニューからTest Labを選択します。
Test Labを利用するためには、「Blazeプラン」を選択する必要があるので選択します。
課金処理が完了すると以下のような画面になり、これでFirebase Test Labを利用する準備ができました。
Google Cloud SDKの実行環境の設定
Google Cloud SDKのインストール
Google Cloud SDKをインストールしていないのであれば以下のページからインストールします。これでgcloudコマンドを使用できるようになります。
gcloudコマンドでのSDKのアップデート
デフォルトでSDKに含まれているコマンドにTest Labのコマンドは含まれていないためgcloudコマンドを使用してbetaコンポーネントをアップデートする必要があります。
$ gcloud components update beta
プロジェクトIDのセット
gcloudにプロジェクトIDをセットします。
$ gcloud config set project <YOUR-PROJECT-ID>
プロジェクトIDはFirebase consoleから先ほど作成したプロジェクトを開き、プロジェクト名横の設定ボタンをクリックすることで確認できます。
ログイン
gcloud authコマンドを利用してログインします。以下のコマンドを実行するとブラウザでGoogleアカウントを選択する画面が開くので、Blazeプランを課金したアカウントを選択しログインします。
$ gcloud auth login
以下のような文言が表示されればOKです。
テストの実行
サンプルアプリ
サンプルアプリとしてドキュメントで紹介されているNotepad app
を使用します。
テストを実行可能なAndroidデバイスのリストを取得
以下のコマンドを実行しデバイスリストを取得します。
$ gcloud beta test android devices list
コマンドを実行することで以下のようにデバイスのリストが表示されます。
各カラムの意味は以下の通りです。
カラム名 | 意味 | 備考 |
---|---|---|
DEVICE_ID | テストを実行する端末を指定する際に使用 | |
MAKE | デバイスメーカー | |
MODEL_NAME | モデル名 | |
FORM | デバイスの種類 | エミュレータ or 実機であると思われる |
RESOLUTION | 解像度 | |
OS_VERSION_IDS | デバイスによってサポートされているOSのバージョン | |
TAGS | DEVICE_IDを指定しないに場合にdefaultタグが指定してあるデバイスでテストを実行 | betaについては現時点で不明 |
テストで利用可能なAndroid OSのバージョンリストを取得
以下のコマンドを実行しOSのバージョンリストを取得します。
$ gcloud beta test android versions list
コマンドを実行することで以下のようにデバイスリストが表示されます。
最初の2つのカラムOS_VERSION_ID
、VERSION
で表示されている識別子は、テストを実行する際に使用できます。OSバージョンを明示的に指定しない場合、TAGS
カラムのdefaultタグが指定してあるOSのバージョンがdefaultで使用されます。
テストで利用可能なロケールの取得
以下のコマンドを実行しロケールのリストを取得します。
$ gcloud beta test android locales list
最初のカラムLOCALE
で表示されている識別子をテストを実行する際に使用できます。ロケールを指定しない場合defaultでen
が使用されます。
Roboテストの実行
Instrumentationテストを用意していないのであれば代わりにRoboテストを利用でき、UIのテストを自動的に実行可能です。Roboテストは、アプリのUIの静的解析を通してアプリをクロールすることでクラッシュや他の潜在的な問題を発見します。Google Play Developer Consoleのリリース前レポートではRoboテストが実行されています。
gcloudコマンドでは以下のようなコマンドを実行することでRoboテストを実行できます。
$ gcloud beta test android run \
--type robo \
--app app-debug.apk \
--device-ids Nexus5 \
--os-version-ids 21 \
--locales ja_JP \
--orientations portrait \
--timeout 90s
--type
パラメーターが指定されていない場合--type robo
が使用されます。その他のオプションについての詳細はgcloud help beta test android run
で確認できます。また、指定するオプションはYAMLファイルで管理することができます。上記のオプションは以下のようにYAML形式で表現できます。
robo-test:
type: robo
app: app-debug.apk
device-ids: Nexus5
os-version-ids: 21
locales: ja_JP
orientations: portrait
timeout: 90s
そして、以下の様にYAMLファイルをテスト実行時のオプションと指定することができます。これらについてのマニュアルはgcloud topic arg-files
を実行することで確認できます。
$ gcloud beta test android run test_settings.yml:robo-test
Instrumentationテストの実行
サンプルとして使用しているNotepadアプリは、Espressoによるテストが予め用意されています。typeオプションにinstrumentation
を指定しInstrumentationテストを実行します。Instrumentationテストでは、app-debug-test.apk
をテストに使用します。
app-debug-androidTest.apk
はassembleDebugTest
を実行することでls app/build/outputs/apk
以下に出力されます。
$ ./gradlew assembleDebugTest
Instrumentationテストの実行には、app-debug.apk
も必要になるのでInstrumentationテストの実行を行う前に予めビルドしておきます。
$ ./gradlew assembleDebug assembleDebugTest
app-debug.apk
とapp-debug-androidTest.apk
を用意し、Instrumentationテストを実行します。
$ gcloud beta test android run \
--type instrumentation \
--app app-debug.apk \
--test app-debug-androidTest.apk \
--device-ids Nexus5 \
--os-version-ids 21 \
--locales ja_JP \
--orientations portrait
--test
パラメーターが指定されいてる場合--type instrumentation
パラメーターが使用されます。また、Roboテストと同様YAMLで指定するオプションを管理できます。
上記のコマンドで使用していないオプションについては、gcloud beta test android runをご覧ください。
テスト結果の確認
コマンドを実行するとFirebase Test Lab上でのテストがスケジューリングされ、CLI上に以下のように情報が表示されます。
$ gcloud beta test android run \
--type instrumentation \
--app app-debug.apk \
--test app-debug-androidTest.apk \
--device-ids Nexus5 \
--os-version-ids 21 \
--locales ja_JP \
--orientations portrait
Have questions, feedback, or issues? Please let us know by using this Google Group:
https://groups.google.com/forum/#!forum/google-cloud-test-lab-external
Uploading [app-debug-unaligned.apk] to the Cloud Test Lab...
Uploading [app-debug-test-unaligned.apk] to the Cloud Test Lab...
Raw results will be stored in your GCS bucket at [https://console.developers.google.com/storage/browser/test-lab-12345678910abcdfeg/]
Test [matrix-u5z3rglvh75t] has been created in the Google Cloud.
Cloud Test Lab will execute your instrumentation test on 1 device(s).
Creating individual test executions...done.
Test results will be streamed to [https://console.developers.google.com/project/test-project-1234/testlab/mobile/histories/bh.12345678910abcdfeg/executions/12345678910abcdfeg].
12:00:00 Test is Pending
12:00:01 Starting attempt 1
12:00:02 Test is Running
12:00:03 Installing APK: com.example.android.notepad
12:00:04 Installing APK: com.example.android.notepad.test
12:00:05 Running instrumentation test. Package: com.example.android.notepad.test testrunner: android.support.test.runner.AndroidJUnitRunner options: []
12:00:06 Instrumentation test has finished
12:00:07 Retrieving test artifacts
12:00:08 Retrieving any crash results
12:00:09 Retrieving logcat
12:00:10 Done. Test time=30 (secs)
12:00:11 Test is Finished
Instrumentation testing complete.
More details are available at [https://console.developers.google.com/project/test-project-1234/testlab/mobile/histories/bh.12345678910abcdfeg/executions/12345678910abcdfeg].
┌─────────┬──────────────────────────┬─────────────────────┐
│ OUTCOME │ TEST_AXIS_VALUE │ TEST_DETAILS │
├─────────┼──────────────────────────┼─────────────────────┤
│ Passed │ Nexus5-21-ja_JP-portrait │ 1 test cases passed │
└─────────┴──────────────────────────┴─────────────────────┘
テストは成功しました。ここで、Test results will be streamed to...
の部分で出力されいてるURLにアクセスするとコンソール上のテスト結果画面にアクセスできます。
テスト結果にはログ、スクリーンショット、動画でのテスト実行の様子を確認できます。
テスト結果の見方ついての詳細はAnalyze Firebase Test Lab for Android Resultsを御覧ください。
CIサービスからのテスト実行
CircleCIからFirebase Test Labでのテストを実行する方法についてまとめました。
まとめ
CLIからFirebase Test Labでのテストを実行できました。ドキュメントにしたがってコマンドを入力することで問題なく実行できたので良かったです。ただ、ドキュメントで紹介されているサンプルアプリのGradle Pluginバージョン、SDKバージョン、ライブラリバージョンが古いため注意が必要です。