gcloud CLI でテストを開始する

このガイドでは、gcloud CLI を使用してインストルメンテーション テスト、Robo テスト、ゲームループ テストを行う方法について説明します。

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

始める前に‏

まだ Firebase を Android プロジェクトに追加していない場合は追加します。

ステップ 1. 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
    

ステップ 2. 利用可能なテストデバイスを確認する

以下の gcloud コマンドを使用して、テストで利用可能なテストデバイスとロケールを確認します。

オプションとして、サンプルの Notepad アプリをダウンロードして、コマンドの実行をすぐに開始することもできます。バイナリ ファイル app-debug-unaligned.apk とインストルメンテーション テスト ファイル app-debug-test-unaligned.apk を使用してください。これらは NotePad/app/build/outputs/apk/ にあります。

  • models list: テストで利用可能な Android デバイスの最新のリストを取得します。

    gcloud firebase test android models list
    

    コマンド出力で:

    • MODEL_ID 列には、後でデバイスモデルでのテストで使用する識別子が含まれています。
    • OS_VERSION_ID 列には、デバイスがサポートするオペレーティング システムのバージョンが含まれています。

    出力例

    gcloud firebase test android models list の出力

  • models describe: 特定の Android MODEL_ID に関する詳細情報を取得します。

    gcloud firebase test android models describe MODEL_ID
    

    出力には、デバイスモデルのブランド、メーカー、OS バージョン、サポートされている API レベル、サポートされているアプリケーション バイナリ インターフェース(ABI)、リリース日、デバイスが物理か仮想かの情報が含まれます。

  • versions list: 現在テストで利用可能な OS バージョンのリストを取得します。

    gcloud firebase test android versions list
    

    コマンド出力の最初の 2 つの列(OS_VERSION_IDVERSION)に示されるいずれかの識別子を使用して、後で Android OS の特定のバージョンを使用してテストを行うことができます。テストで使用する Android OS バージョンを指定しない場合は、TAGS 列に示すデフォルトが使用されます。

    出力例

    gcloud Android バージョン リスト

  • locales list: テストで使用可能なロケールの最新のリストを取得します。

    gcloud firebase test android versions list
    

    コマンド出力の最初の列(LOCALE)には、後でロケールのテストに使用できる識別子が含まれます。テストで使用するロケールを指定しない場合は、デフォルトのロケールとして英語が使用されます。

ステップ 3. テストを実行する

アプリのテストに使用できるデバイスモデル、ロケール、OS バージョンの範囲がわかったので、gcloud firebase test android run コマンドと --device フラグを使用して、Robo テストまたはインストルメンテーション テストを行うデバイスを指定できます。

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 \
  --client-details matrixLabel="Example matrix label"
  • --type 値が指定されない場合、--type robo パラメータが暗黙のうちに適用されます。
  • Firebase コンソールでテスト マトリックスを見つけやすくするために、テスト マトリックスにラベルを付けるには、オプションの --client-details matrixLabel="Example matrix label" フラグを使用します。
  • 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
  --client-details matrixLabel="Example matrix label"
  • --test でテスト APK が指定された場合、--type インストルメンテーション パラメータが暗黙のうちに指定されます。
  • Firebase コンソールでテスト マトリックスを見つけやすくするために、テスト マトリックスにラベルを付けるには、オプションの --client-details matrixLabel="Example matrix label" フラグを使用します。
  • gcloud help firebase test android run」を入力すると、テストを実行するためのコマンドライン オプションをすべて表示できます。

コマンドラインにこれらの引数を指定する代わりに、オプションで YAML 形式の引数ファイルに引数を指定することができます。gcloud topic arg-files を実行すると、この機能の使用方法を確認できます。

gcloud CLI では、Android Test Orchestrator がサポートされています。Orchestrator には AndroidJUnitRunner v1.1 以降が必要です。これを有効にするには、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 テストのコード カバレッジ レポートを取得できます。Android Test Orchestrator が有効になっていない場合は、次のように使用します。

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/Download/coverage.ec" \
  --directories-to-pull /sdcard/Download

Android Test Orchestrator を使用しているときにコード カバレッジ レポートを生成する場合は、環境変数を次のように変更します。

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

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

  1. gcloud ツールによってテスト結果表の上に出力された Firebase コンソール リンクをターミナルで開きます。
  2. このリンク先のリストからテスト実行をクリックして、実行の詳細ページを開きます。
  3. [テスト結果] をクリックして、この実行のテスト結果が含まれている 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 のコマンドとフラグを使用すると、異なる仕様のテストを行うことができます。

  • Android Test Orchestrator フラグ: Orchestrator を有効にするためのフラグです。Orchestrator は、アプリのテストごとに Instrumentation を呼び出して、各テストを実行できるツールです。Test Lab では常に Orchestrator の最新バージョンが実行されます。

  • ゲームループ テストフラグ: ゲームアプリでプレーヤーの動作をシミュレートする「デモモード」を有効にして制御する一連の構成フラグ。詳しくは、Test Lab でゲームループ テストを行うをご覧ください。

  • 均一シャーディング フラグ(ベータ版): テストケースを均等に配信するためのシャード数を指定するフラグ。シャードは別々のデバイスで並行して実行されます。

  • 手動シャーディング フラグ(ベータ版): シャード(テストケースのグループ)で実行するパッケージ、クラス、テストケースのグループを指定するフラグです。シャードは別々のデバイスで並行して実行されます。

  • ネットワーク トラフィック プロファイル フラグ(ベータ版): テスト中に物理デバイスで使用するネットワーク プロファイルを指定するフラグです。ネットワーク プロファイルによってさまざまなネットワーク条件がエミュレートされるため、信頼できないネットワークや予測不可能なネットワークでのアプリのパフォーマンスをテストすることができます。

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 テスト インフラストラクチャでエラーが発生しました。