Firebase Test LabでのAndroidアプリのテストをCLIから実行する


# 概要
Firebase Test Labはクラウドベースのアプリテスト基板で、その機能は[gcloud command-line client](https://cloud.google.com/sdk/gcloud/)から利用可能です。したがって、`gcloud`コマンドを使用してFirebase Test Lab上でのAndroidアプリのテストの実行をスケジューリングできます。

公式にFirebase Test Labが公開される前、Cloud Test Lab時代からテストをCLIから実行するためのドキュメントはありましたが、正式にリリースされたので試して見ようと思います。

以下のドキュメントを参考に作業を進めます。

https://firebase.google.com/docs/test-lab/command-line

# Firebaseプロジェクトの作成と課金

Firebaseのプロジェクトをまだ作成していないのであれば[Firebase console](https://console.firebase.google.com/)から作成します。「新規プロジェクトを作成」をクリックし、プロジェクト名と国を選択し、「プロジェクトを作成」をクリックします。

![test_lab_1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/65ff9dec-2a64-b7d3-c958-47b94d1cddb1.png "test_lab_1.png")


メニューからTest Labを選択します。

![test_lab_2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/fae090ce-49c7-fbf2-4c85-a5b87fb0a896.png "test_lab_2.png")


Test Labを利用するためには、「[Blazeプラン](https://firebase.google.com/pricing/)」を選択する必要があるので選択します。

![test_lab_3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/3a4b745f-6f8e-db19-8297-46bc017b1a41.png "test_lab_3.png")


課金処理が完了すると以下のような画面になり、これでFirebase Test Labを利用する準備ができました。

![test_lab_4.png](https://qiita-image-store.s3.amazonaws.com/0/43438/36d19ed2-3997-3066-98fd-fd885fe80469.png "test_lab_4.png")


# Google Cloud SDKの実行環境の設定

## Google Cloud SDKのインストール

Google Cloud SDKをインストールしていないのであれば以下のページからインストールします。これでgcloudコマンドを使用できるようになります。

https://cloud.google.com/sdk/

## gcloudコマンドでのSDKのアップデート

デフォルトでSDKに含まれているコマンドにTest Labのコマンドは含まれていないためgcloudコマンドを使用してbetaコンポーネントをアップデートする必要があります。

```bash
$ gcloud components update beta
```

## プロジェクトIDのセット

gcloudにプロジェクトIDをセットします。

```bash
$ gcloud config set project <YOUR-PROJECT-ID>
```

プロジェクトIDは[Firebase console](https://console.firebase.google.com/)から先ほど作成したプロジェクトを開き、プロジェクト名横の設定ボタンをクリックすることで確認できます。

![test_lab_5.png](https://qiita-image-store.s3.amazonaws.com/0/43438/a7ba3e99-1aff-e9fb-693a-6cc6d67c2d11.png "test_lab_5.png")

  
## ログイン

gcloud authコマンドを利用してログインします。以下のコマンドを実行するとブラウザでGoogleアカウントを選択する画面が開くので、Blazeプランを課金したアカウントを選択しログインします。

```bash
$ gcloud auth login
```

以下のような文言が表示されればOKです。

![test_lab_6.png](https://qiita-image-store.s3.amazonaws.com/0/43438/05997473-0c2a-8e7f-764c-3ba85f82548c.png "test_lab_6.png")


# テストの実行

## サンプルアプリ

サンプルアプリとして[ドキュメントで紹介](https://firebase.google.com/docs/test-lab/command-line#choosing_test_configurations)されている`Notepad app`を使用します。

## テストを実行可能なAndroidデバイスのリストを取得

以下のコマンドを実行しデバイスリストを取得します。

```bash
$ gcloud beta test android devices list
```
  
コマンドを実行することで以下のようにデバイスのリストが表示されます。

![test_lab_7.png](https://qiita-image-store.s3.amazonaws.com/0/43438/809d84fe-8644-3bb5-323d-8fa367173a45.png "test_lab_7.png")

  
各カラムの意味は以下の通りです。

|カラム名|意味|備考|
|:--|:--|:--|
|DEVICE_ID|テストを実行する端末を指定する際に使用
|MAKE|デバイスメーカー
|MODEL_NAME|モデル名
|FORM|デバイスの種類|エミュレータ or 実機であると思われる|
|RESOLUTION|解像度
|OS_VERSION_IDS|デバイスによってサポートされているOSのバージョン|
|TAGS|DEVICE_IDを指定しないに場合にdefaultタグが指定してあるデバイスでテストを実行|betaについては現時点で不明|

## テストで利用可能なAndroid OSのバージョンリストを取得

以下のコマンドを実行しOSのバージョンリストを取得します。

```bash
$ gcloud beta test android versions list
```

コマンドを実行することで以下のようにデバイスリストが表示されます。

![test_lab_8.png](https://qiita-image-store.s3.amazonaws.com/0/43438/f2500cce-e234-41f7-65fa-f9b23cf63b85.png "test_lab_8.png")


最初の２つのカラム`OS_VERSION_ID`、`VERSION`で表示されている識別子は、テストを実行する際に使用できます。OSバージョンを明示的に指定しない場合、`TAGS`カラムのdefaultタグが指定してあるOSのバージョンがdefaultで使用されます。

## テストで利用可能なロケールの取得

以下のコマンドを実行しロケールのリストを取得します。

```bash
$ gcloud beta test android locales list
```

最初のカラム`LOCALE`で表示されている識別子をテストを実行する際に使用できます。ロケールを指定しない場合defaultで`en`が使用されます。

![test_lab_9.png](https://qiita-image-store.s3.amazonaws.com/0/43438/99bfa609-4fdd-f34e-4ae7-e4054451673f.png "test_lab_9.png")


# Roboテストの実行

Instrumentationテストを用意していないのであれば代わりにRoboテストを利用でき、UIのテストを自動的に実行可能です。Roboテストは、アプリのUIの静的解析を通してアプリをクロールすることでクラッシュや他の潜在的な問題を発見します。Google Play Developer Consoleのリリース前レポートではRoboテストが実行されています。

gcloudコマンドでは以下のようなコマンドを実行することでRoboテストを実行できます。

```bash
$ 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形式で表現できます。

```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`を実行することで確認できます。

```bash
$ 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`以下に出力されます。

```bash
$ ./gradlew assembleDebugTest
```

Instrumentationテストの実行には、`app-debug.apk`も必要になるのでInstrumentationテストの実行を行う前に予めビルドしておきます。

```bash
$ ./gradlew assembleDebug assembleDebugTest
```

`app-debug.apk`と`app-debug-androidTest.apk`を用意し、Instrumentationテストを実行します。

```bash
$ 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](https://cloud.google.com/sdk/gcloud/reference/beta/test/android/run)をご覧ください。

# テスト結果の確認

コマンドを実行するとFirebase Test Lab上でのテストがスケジューリングされ、CLI上に以下のように情報が表示されます。

```bash
$  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にアクセスするとコンソール上のテスト結果画面にアクセスできます。

![test_lab_10.png](https://qiita-image-store.s3.amazonaws.com/0/43438/55f43d46-1248-6fe8-f18c-ec64539485c6.png "test_lab_10.png")


テスト結果にはログ、スクリーンショット、動画でのテスト実行の様子を確認できます。

![test_lab_11.png](https://qiita-image-store.s3.amazonaws.com/0/43438/d93161ac-9e9b-3eb4-cca3-6c71f2d08311.png "test_lab_11.png")


テスト結果の見方ついての詳細は[Analyze Firebase Test Lab for Android Results](https://firebase.google.com/docs/test-lab/analyzing-results)を御覧ください。

# CIサービスからのテスト実行

CircleCIからFirebase Test Labでのテストを実行する方法についてまとめました。

- http://qiita.com/Horie1024/items/3c22b67634deb0dd4645

# まとめ
CLIからFirebase Test Labでのテストを実行できました。ドキュメントにしたがってコマンドを入力することで問題なく実行できたので良かったです。ただ、ドキュメントで紹介されているサンプルアプリのGradle Pluginバージョン、SDKバージョン、ライブラリバージョンが古いため注意が必要です。

# 参考
- https://firebase.google.com/docs/test-lab/command-line