gcloud CLI でテストを開始する

Firebase Test Lab は、gcloud コマンドライン インターフェース(CLI)との完全な統合を含む、Android アプリをテストするためのクラウドベースのインフラストラクチャを提供します。このドキュメントでは、gcloud CLI から Test Lab を使用してテストを行う際に必要なインストールと構成について説明します。

Test Lab で Android アプリに使用できる gcloud コマンドの一覧については、gcloud firebase test android のリファレンス ドキュメントをご覧ください。

Firebase プロジェクトを作成する

アプリの Firebase プロジェクトがない場合は、Firebase コンソールで [新規プロジェクトを作成] をクリックし、プロジェクトを作成します。テストを実行するには、プロジェクトの所有権または編集権限が必要です。

Spark プランと Flame プランをご利用の場合、Test Lab で 1 日あたり限られた数のテストを実施できます。1 日の割り当て上限なしで Test Lab を使用するには、Firebase Blaze プランにアップグレードする必要があります。

gcloud CLI を設定する

  1. Google Cloud SDK をダウンロードします
  2. これには gcloud CLI ツールが含まれます。

  3. インストールが最新であることを確認します。
    gcloud components update
    
  4. Google アカウントを使用して gcloud CLI にログインします。
    gcloud auth login
    
  5. gcloud で Firebase プロジェクトを設定します。PROJECT_ID は Firebase プロジェクトの ID です。
    gcloud config set project PROJECT_ID
    

テストを構成する

この例では、Notepad というシンプルなメモ作成 Android アプリのテストを実行します。

  1. notepad.zipNotePad/app/build/outputs/apk/ ディレクトリから、Notepad アプリのバイナリ APK ファイル(app-debug-unaligned.apk)と、それに対応するインストゥルメンテーション テスト(app-debug-test-unaligned.apk)をダウンロードします。

  2. 次のコマンドを使用して、テストを実施できる Android デバイスの最新のリストを取得します。

    
    $ gcloud firebase test android models list
    
    gcloud firebase test android models list の出力 コマンド出力の最初の列(MODEL_ID)に示される ID を使用して、後で特定のモデルのテストを実行できます。OS_VERSION_ID 列には、デバイスがサポートするオペレーティング システムのバージョンが表示されます。テストする MODEL_ID を指定しない場合は、TAGS 列のデフォルト値が使用されます。

  3. firebase test android models describe コマンドを実行して、特定の Android MODEL_ID の情報を確認します。

    
    $ gcloud firebase test android models describe Nexus5
    
    上のコマンドの例では、Nexus5 モデルに関する詳細が表示されます。たとえば、ブランド、製造元、対応の API レベル、モデルが物理か仮想か、などの情報が表示されます。

  4. 次のコマンドを使用して、テストを実施できる Android OS バージョンの最新のリストを取得します。

    
    $ gcloud firebase test android versions list
    
    gcloud Android バージョン リスト コマンド出力の最初の 2 つの列(OS_VERSION_IDVERSION)に示されるいずれかの ID を使用して、後で Android OS の特定のバージョンに対してテストを実行できます。テストする Android OS バージョンを指定しない場合は、TAGS 列に示すデフォルトが使用されます。

  5. テストに使用可能なロケールの最新のリストを取得します。

    
    $ gcloud firebase test android locales list
    
    コマンド出力の最初の列(LOCALE)には、後でロケールのテストに使用できる ID が表示されます。テストするロケールを指定しない場合は、デフォルトのロケールとして英語が使用されます。数百のロケールがあるので、ここではコマンド出力を掲載しません。

テストの実施

アプリのテストで使用できるデバイスモデル、OS のバージョン、ロケールの範囲がわかりました。これらの情報を基に、gcloud firebase test android run コマンドと --device フラグを使用してテストデバイスを指定できます。このコマンドとフラグは、Robo テストを使用してアプリを自動的にテストする場合にも、アプリのテスト用に作成したインストゥルメンテーション テストを実施する場合にも使用できます。

Robo テストの実施

インストゥルメンテーション テストがない場合でも、アプリのバグを探すことができます。Robo テストを使用するとアプリのユーザー インターフェースを自動的に確認できます。Robo テストは、アプリのユーザー インターフェースを通してさまざまなパスの静的分析を実行してからアプリをクロールすることによって、クラッシュなどの問題の可能性がないかどうかを検出します。

まず次のコマンドを実行しましょう。

gcloud firebase test android run \
  --type robo \
  --app app-debug-unaligned.apk \
  --device model=Nexus6,version=21,locale=en,orientation=portrait  \
  --device model=Nexus7,version=19,locale=fr,orientation=landscape \
  --timeout 90s

--type 値が指定されない場合、--type robo パラメータが暗黙のうちに適用されます。「gcloud help firebase test android run」を入力すると、テストを実行するためのコマンドライン オプションをすべて表示できます。コマンドラインにすべての引数を指定する代わりに、オプションで YAML 形式の引数ファイルに引数を指定することができます。gcloud topic arg-files を実行すると、この機能の使用方法を確認できます。

Robo テストの結果を調べる方法については、テスト結果を分析する方法をご覧ください。

インストゥルメンテーション テストの実施

次に、gcloud コマンドライン ツールを使用して、特定の Android デバイス構成で Notepad アプリの Espresso テストを実行します。ここでは、次のように instrumentation テストタイプを使用して app-debug-test-unaligned.apk でテストを行います。

gcloud firebase test android run \
  --type instrumentation \
  --app app-debug-unaligned.apk \
  --test app-debug-test-unaligned.apk \
  --device model=Nexus6,version=21,locale=en,orientation=portrait  \
  --device model=Nexus7,version=19,locale=fr,orientation=landscape

--test でテスト APK が指定された場合、--type instrumentation パラメータが暗黙のうちに適用されます。コマンドラインにすべての引数を指定する代わりに、オプションで YAML 形式の引数ファイルに引数を指定することができます。gcloud topic arg-files を実行すると、この機能の使用方法を確認できます。

gcloud CLI では、Android Test Orchestrator がサポートされています。Orchestrator には AndroidJUnitRunner v1.0 以降が必要です。これを有効にするには、gcloud firebase test android run
--use-orchestrator フラグを指定します。無効にするには、--no-use-orchestrator フラグを使用します。

注: 上記以外の追加のフラグを使用して、Test Lab がインストゥルメンテーション テストを実行する方法を制御することもできます。たとえば、--test-targets フラグを使用すると、テスト APK で使用する 1 つのクラスまたはクラス メソッドをテストできます。また、--num-flaky-test-attempts フラグを使用すると、失敗したテストが不安定だったのかどうかを確認できます。このフラグには、1 つ以上のテストケースがなんらかの理由で失敗した場合にテストを再試行する回数を指定します。詳しくは、gcloud firebase test android run をご覧ください。

インストゥルメンテーション テストのコード カバレッジ レポート

Test Lab は、コード カバレッジ レポート ツールの EMMAJaCoCo をサポートしています。いずれかのツールがアプリのビルドに統合されている場合は、次の引数を指定して gcloud firebase test android run コマンドを実行すると、Test Lab テストのコード カバレッジ レポートを取得できます。

gcloud firebase test android run \
  --type instrumentation \
  --app your-app.apk \
  --test your-app-test.apk \
  --device model=TestDevice,version=AndroidVersion  \
  --environment-variables coverage=true,coverageFile="/sdcard/coverage.ec" \
  --directories-to-pull /sdcard

Test Lab でテストの実行が終了したら、Google Cloud Storage 内でコード カバレッジ レポートを探します。

  1. gcloud ツールによってテスト結果表の上に出力された Firebase コンソール リンクをターミナルで開きます。
  2. このリンク先のリストからテスト実行をクリックして、実行の詳細ページを開きます。
  3. [テスト結果] をクリックして、この実行のテスト結果が含まれている Google Cloud Storage バケットに移動します。
  4. artifacts/coverage.ec を開いて、コード カバレッジ レポートを表示します。

テスト結果を分析する

数分後に gcloud ツールによってテスト結果の基本サマリーが表示されます。

コマンドテストの結果

コマンドライン テストの出力には、テスト結果を表示するためのリンクも含まれます。これらの結果の解釈方法については、Firebase Test Lab for Android の結果を分析するをご覧ください。

Robo テストでのカスタム ログインとテキスト入力

Robo テストでは、--no-auto-google-login パラメータを使用しない限り、Google アカウントのログイン画面に認証情報が自動的に入力されます。カスタム ログイン画面を使用してテスト アカウントの認証情報を入力することもできます。また、このパラメータを使用して、アプリの他のテキスト フィールドにカスタム テキストを入力することもできます。

アプリのテキスト フィールドに入力するには、--robo-directives パラメータを使用し、key-value ペアのカンマ区切りリストを指定します。key は対象となる UI 要素の Android リソース名、value はテキスト文字列です。このフラグを使用して、特定の UI 要素を無視するように Robo に指示できます(例:"logout" ボタンなど)。EditText のフィールドには対応していますが、WebView の UI 要素に含まれるテキスト フィールドには対応していません。

たとえば、カスタム ログインに次のパラメータを使用できます。

--robo-directives username_resource=username,password_resource=password

使用可能なコマンドとフラグ

Test Lab gcloud CLI のコマンドとフラグを使用すると、異なる仕様のテストを行うことができます。

Test Lab で gcloud コマンドのスクリプトを作成する

シェル スクリプトまたはバッチファイルを使用してモバイルアプリのテストコマンドを自動化することができます。自動化しない場合は gcloud コマンドラインを使用して実行します。次の bash スクリプトの例では、インストゥルメンテーション テストをタイムアウト 2 分で実行し、テストが正常に完了したかどうかを報告します。

if gcloud firebase test android run --app my-app.apk --test my-test.apk --timeout 2m
then
    echo "Test matrix successfully finished"
else
    echo "Test matrix exited abnormally with non-zero exit code: " $?
fi

スクリプト終了コード

Test Lab にはいくつかの終了コードが用意されており、スクリプトまたはバッチファイルを使用して実行したテストの結果を詳細に把握することができます。

Test Lab のスクリプト終了コード

終了コード 説明
0 すべてのテスト実行が成功しました。
1 一般的なエラーが発生しました。ファイル名が存在しないか HTTP エラーやネットワーク エラーの可能性があります。
2 不明なコマンドまたは引数が指定されたため、テストが終了しました。
10 テスト実行内の 1 つ以上のテストケース(テストしたクラスまたはクラスメソッド)が成功しませんでした。
15 テスト マトリックスが成功したのか、または予期しないエラーで失敗したのかを Firebase Test Lab が判断できませんでした。
18 このテスト実行のテスト環境は、テスト ディメンションに互換性がないためサポートされません。このエラーは、選択した Android API レベルが、選択したデバイスタイプでサポートされない場合に発生することがあります。
19 ユーザーがテスト マトリックスをキャンセルしました。
20 テスト インフラストラクチャでエラーが発生しました。