techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Cloud Test Labを使ってテストしてみる

Androidのアプリを開発するうえで様々な端末やバージョンに対応する必要があります。
しかし、端末とバージョンを網羅的にテストするには費用がかかってしまうため基本的に個人の力で網羅するのは現実的ではありません。
そこでGoogleが提供しているCloud Test Labの使い方についてご紹介します。
これを利用するとよく使われる端末でテストすることが可能です。
今回はチュートリアルを実施する上でトラブった内容などもご紹介します。

Cloud Test Labとは

Googleが提供している複数の端末およびバージョン、言語設定を総当りで同一のテストを実施することができるサービスになります。
Roboというテストコード無しでもある程度実施してくれるテストとJUnitのテストapkを実行してくれるInstrumentの2種類の実行方法が用意されており、ユーザーが選択できるようになっています。
またAndroid Studioではデフォルトでサポートされているためテストの実行時の設定を行うと自動的にJunitテストapkのアップロードや実行を行ってくれる機能を持っています。

今回の紹介ではInstrumentでの実行を試してみました。

準備

Cloud Test LabはGoogle Cloud Platform(GCP)の1サービスになります。
そのためGCPでプロジェクトを作成し、そのプロジェクトにCloud Test Labのプロジェクトを作成し実行することになります。 まずはGCPプロジェクトを作ります。 コンソール画面に入ると下図のような表示が右上に表示されていると思います。

f:id:muchiki0226:20160514235157p:plain

そのMy Projectをクリックしてプロジェクトの作成を選択すると下図のような項目が表示されると思います。

f:id:muchiki0226:20160514235240p:plain

プロジェクト名を記入すると下にプロジェクトIDが自動的に生成されると思います。
これを控えておきます。 これでCloud Test Labの準備は整いました。

Android Studioで実行してみる

今回はCloud Test Labのチュートリアルそのまま動かしてみます。
まずはnodepad.zipをダウンロードします。
それを解凍しAndoridStudioで「Open an existing Android Studio project」でnodepad.zipを解凍したフォルダを指定して開きます。
プロジェクトを開くとAndoridTestにテストコードが記載されているのが確認できます。
テストコードにはrobotiumとespressoが利用されています。
これをCloud Test Labで実行するには実行タスクを作成する必要があります。
Android Studioの実行ボタンの左側にある「Select Run/Debug Configuration」という項目があるのでそれを選択し、「Edit Configurations…」を選択すると下記のような画面が表示されると思います。

f:id:muchiki0226:20160515000418p:plain

左上の+ボタンをクリックしAndroid Testを選択すると下記のような画面が表示されます。

f:id:muchiki0226:20160515000651p:plain

ここで次の項目を設定します。

  • Modules:app
  • Test:Class
  • Class:com.example.android.notepad.NotePadTest
  • Target:Cloud Test Lab Devices Matrix
  • Matrix configuration:Sample configration(12)
  • Cloud project:青色の枠横の設定ボタンから準備の時に作成したプロジェクトIDを選択する

ここで実行されるデバイスはMatrix configurationで設定した内容で実施されます。 デフォルトでは次の設定がされています。 - 端末:Nexus5,Nexus4 -プラットフォーム:API Level21,22,23 - Locale:Japanese(何を参照しているか不明) - Orientation:Landscape,Portrait

Matrix configrationのプルダウンリストの右にある「…」を選択すると独自のテストデバイス設定を行うことができます。

それでは準備出来たので実行してみます。
OKボタンを押し、「Select Run/Debug Configuration」で作成したConfigurationを選択し実行します。

そうすると下図のようなテストの実行画面が表示されます。

f:id:muchiki0226:20160515001929p:plain

ログ上の「https://console.developers.google.com/project/XXXXXXXX」というところをクリックするとブラウザが立ち上がり、テストの進行状況や結果をブラウザで確認することができます。 f:id:muchiki0226:20160515002824p:plain この状態で数分待っていると下記の様になります。

f:id:muchiki0226:20160515002236p:plain

テストに失敗しているのがわかります。
理由としてはMatrix configrationのLocaleがJapaneseになっているデバイスでテストを実行したためにエラーになっています。
このnotepadというアプリは文字入力してその文字列を保存する機能を持っており、テストとしてはその文字列が正しく保存されているかを確認しています。
端末のLocaleがJapaneseになっているためIMEが日本語入力なってしまっており、漢字変換されて保存されてしまってエラーになっています。
そこでAndroid StudioのMatrix configrationでLocaleをen設定にできれば対応できるのですが下図のようになっておりJapanese以外を選択することができませんでした。(どこを参照しているかも現時点ではわかっておりません。)

f:id:muchiki0226:20160515002824p:plain

そこでTerminalから実行することにしました。

Terminalで実行してみる

まずはGoogle Cloud SDKをダウンロードします。 ダウンロードしたファイルを解凍し、下記のコマンドを実行しインストールします。

$ ./google-cloud-sdk/install.sh

インストールが完了したら次のコマンドを実行しbetaの機能をインストールします。

$ gcloud components update beta

次にgcluodコマンドで利用するプロジェクトを設定します。

$ gcloud config set project <準備の時に作成したプロジェクトID>

最後に認証を行います。

$ gcloud auth login

これでTerminalで実施する準備が整いました。
それでは実行してみましょう。 まずは先程のAndroidStudioで実行して作成されたapkがおいてあるフォルダに移動し下記のように実行してみましょう。

$ gcloud beta test android run --type instrumentation --app app-debug-unaligned.apk --test app-debug-androidTest-unaligned.apk --device-ids shamu,flo --os-version-ids 19,21 --locales en --orientations portrait,landscape

このコマンドはinstrumentationでテストを実行し、apkをapp-debug-unaligned.apkとapp-debug-androidTest-unaligned.apk を利用して実行する設定になっています。
また、実行するデバイスはNexus6,Nexus7、OSバージョンを19,21、言語設定をEnglish、縦横に関しては両方実施する設定になります。 これらを実行すると次のような結果になります。

$ gcloud beta test android run --type instrumentation --app app-debug-unaligned.apk --test app-debug-androidTest-unaligned.apk --device-ids shamu,flo --os-version-ids 19,21 --locales en --orientations portrait,landscape

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-androidTest-unaligned.apk] to the Cloud Test Lab...
Raw results will be stored in your GCS bucket at [https://console.developers.google.com/storage/browser/XXXXXXXXXXXXXXXXXX]

Test [matrix-vaxcm5tqpaiz] has been created in the Google Cloud.
Some device dimensions are not compatible and will be skipped:
  [OS-version 19 on Nexus6]
Cloud Test Lab will execute your instrumentation test on 6 device(s).
Creating individual test executions...done.

Test results will be streamed to [https://console.developers.google.com/project/XXXXXXXXXXXXXXXXXX].
23:25:16 Test matrix status: Finished:6 Unsupported:2           
Instrumentation testing complete.

More details are available at [https://console.developers.google.com/project/XXXXXXXXXXXXXXXXXX].
┌─────────┬───────────────────────┬────────────────────────────────────┐
│ OUTCOME │    TEST_AXIS_VALUE    │            TEST_DETAILS            │
├─────────┼───────────────────────┼────────────────────────────────────┤
│ Passed  │ flo-19-en-landscape   │ 1 test cases passed                │
│ Passed  │ flo-19-en-portrait    │ 1 test cases passed                │
│ Passed  │ flo-21-en-landscape   │ 1 test cases passed                │
│ Passed  │ flo-21-en-portrait    │ 1 test cases passed                │
│ Passed  │ shamu-21-en-landscape │ 1 test cases passed                │
│ Passed  │ shamu-21-en-portrait  │ 1 test cases passed                │
│ Skipped │ shamu-19-en-landscape │ Incompatible device/OS combination │
│ Skipped │ shamu-19-en-portrait  │ Incompatible device/OS combination │
└─────────┴───────────────────────┴────────────────────────────────────┘

device-idsは次のコマンドを実行したら確認することができます。

$ gcloud beta test android devices list

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

┌─────────────┬──────────┬────────────────────┬──────────┬─────────────┬────────────────┬─────────┐
│  DEVICE_ID  │   MAKE   │     MODEL_NAME     │   FORM   │  RESOLUTION │ OS_VERSION_IDS │   TAGS  │
├─────────────┼──────────┼────────────────────┼──────────┼─────────────┼────────────────┼─────────┤
│ condor_umts │ Motorola │ Moto E             │ PHYSICAL │  960 x 540  │ 19             │         │
│ falcon_umts │ Motorola │ Moto G (1st Gen)   │ PHYSICAL │ 1280 x 720  │ 19             │         │
│ flo         │ ASUS     │ Nexus 7 (2013)     │ PHYSICAL │ 1920 x 1200 │ 19,21          │         │
│ flounder    │ HTC      │ Nexus 9            │ PHYSICAL │ 2048 x 1536 │ 21             │         │
│ g3          │ LG       │ LG G3              │ PHYSICAL │ 2560 x 1440 │ 19             │         │
│ hammerhead  │ LG       │ Nexus 5            │ PHYSICAL │ 1920 x 1080 │ 19,21,22       │ default │
│ hlte        │ Samsung  │ Galaxy Note 3 Duos │ PHYSICAL │ 1920 x 1080 │ 19             │         │
│ htc_m8      │ HTC      │ HTC One (M8)       │ PHYSICAL │ 1920 x 1080 │ 19             │         │
│ ja3g        │ Samsung  │ Galaxy S4 (3G)     │ PHYSICAL │ 1920 x 1080 │ 19             │         │
│ mako        │ LG       │ Nexus 4            │ PHYSICAL │ 1280 x 768  │ 19,22          │         │
│ serranolte  │ Samsung  │ Galaxy S4 mini     │ PHYSICAL │  960 x 540  │ 19             │         │
│ shamu       │ Motorola │ Nexus 6            │ PHYSICAL │ 2560 x 1440 │ 21,22          │         │
│ t03g        │ Samsung  │ Galaxy Note 2      │ PHYSICAL │ 1280 x 720  │ 19             │         │
│ titan_umts  │ Motorola │ Moto G (2nd Gen)   │ PHYSICAL │ 1280 x 720  │ 19             │         │
│ victara     │ Motorola │ Moto X             │ PHYSICAL │ 1920 x 1080 │ 19             │         │
│ zeroflte    │ Samsung  │ Galaxy S6          │ PHYSICAL │ 2560 x 1440 │ 22             │         │
└─────────────┴──────────┴────────────────────┴──────────┴─────────────┴────────────────┴─────────┘

os-version-idsは次のコマンドを実行したら確認することができます。

$ gcloud beta test android versions list

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

┌───────────────┬─────────┬─────────────┬───────────┬──────────────┬─────────┐
│ OS_VERSION_ID │ VERSION │  CODE_NAME  │ API_LEVEL │ RELEASE_DATE │   TAGS  │
├───────────────┼─────────┼─────────────┼───────────┼──────────────┼─────────┤
│       17      │  4.2.x  │ Jelly Bean  │     17    │  2013-02-11  │         │
│       18      │  4.3.x  │ Jelly Bean  │     18    │  2013-10-03  │         │
│       19      │  4.4.x  │ KitKat      │     19    │  2014-06-02  │         │
│       21      │  5.0.x  │ Lollipop    │     21    │  2014-12-19  │ default │
│       22      │  5.1.x  │ Lollipop    │     22    │  2015-04-21  │         │
│       23      │  6.0.x  │ Marshmallow │     23    │  2015-10-05  │         │
└───────────────┴─────────┴─────────────┴───────────┴──────────────┴─────────┘

あと同様にlocalesも下記のコマンドで確認できます。 すごく量が多いので割愛しますが、興味がある人は実行してみてください。

$  gcloud beta test android locales list

それでは実行結果を確認してみましょう。
下記のログの部分にあるURLをブラウザで確認すると結果を確認することができます。

More details are available at [https://console.developers.google.com/project/XXXXXXXXXXXXXXXXXX].

URLを表示すると下図のような画面が表示されます。

f:id:muchiki0226:20160515005808p:plain

8件中6件が成功し、2件が実行できなかったという状態になっているのがわかります。
実行した端末を選択するとその詳細を確認することができます。 Nexus6のAPI Level 21の項目を選択したら下図のような画面が表示されます。

f:id:muchiki0226:20160515005811p:plain

どのテストケースが成功したか失敗したかがわかります。 スクリーンショットという項目を選択すると実行時のスクリーンショットを確認することができます。

f:id:muchiki0226:20160515005815p:plain

動画を選択するとテスト開始時から終了時までの画面をキャプチャした動画を確認することができます。

f:id:muchiki0226:20160515005818p:plain

動画が確認できるので何で失敗したかなどが一目瞭然で、デバッグもはかどります。

所感

使ってみたところ一番新しい端末などはないよう見受けられるため最新の端末に関しては実機を用意して確認するようにしたほうが良いと思います。
また、各国の人気のある端末がすべてフォローされているわけではないのでそうったものは独自に用意する必要がありますが、一般的なNexus機のテストは実行できるため実施することに効果があるように見受けられました。