Test Lab を CI/CD システムに統合する

1. はじめに

最終更新日: 2022 年 4 月 7 日

CI/CD システムでモバイルテストを実行する方法

多くのアプリは、さまざまなプラットフォーム、デバイス、API バージョンで実行されるため、モバイルテストの実行は簡単ではありません。アプリ デベロッパーは、できるだけ多くの構成をテストし、ユーザーが問題を未然に防ぐことを望んでいます。しかし、コストとリソースの制約により、テストデバイスの数や、個々のデベロッパーが投資できる手動メンテナンスの量は限られています。特に継続的インテグレーション/継続的開発(CI/CD)システムの場合、開発プロセスがスケールアップする場合は、メンテナンスの費用と労力を最小限に抑えながらテストプロセスを自動化する必要があります。

ユーザーのデバイスでのアプリのパフォーマンスを把握できるように、Firebase Test Lab は Google のデータセンターでさまざまなモバイル 物理および仮想デバイスをホストしています。また、Google は、プラットフォームに依存しないコマンドライン ツールである Google Cloud CLI も提供しています。このツールは、データセンター内のデバイスでのテスト実行をオーケストレートします。gcloud CLI を使用すると、Test Lab のクラウドベースのテスト ソリューションを既存の CI/CD ワークフローに簡単に統合できます。

クロス プラットフォーム サポート

Test Lab は、Android および iOS アプリのテスト ソリューションと、Unity などのモバイルゲーム向けの特別なサポートを提供します。テスト オプションは、Android Espresso、UI Automator、iOS XCTest などの一般的なテスト フレームワークに対応しています。また、Google の自動クローラーである Robo を使用して、テストコードなしでテストを実行することもできます。

ハードウェア要件なし

Test Lab は Google データセンターで物理デバイスをホストし、Google Cloud で仮想デバイスをホストします。必要な作業は、テストを Test Lab に送信して結果を待つことだけです。

高速、高信頼性

多数のテストケースを同時に実行すると時間がかかり、CI/CD プロセスが妨げられる可能性があります。Test Lab を使用すると、テストを簡単にシャーディングして、複数のデバイスで並行して実行できます。また、モバイルテストでよく見られる問題点である不安定性も検出できます。

学習内容

  • テスト アーティファクトをビルドする方法
  • gcloud CLI を使用してモバイルテストを実行する方法
  • Jenkins CI の設定方法
  • Jenkins CI を使用してモバイルテストを実行する方法
  • CI システムでスケールアップするようにテストを構成する方法

この Codelab では、テストの実行に焦点を当てます。関連のない概念やコードブロックについては詳しく触れず、コードはコピーして貼るだけの状態で提供されています。

必要なもの

ゼロからビルドする場合は、Android テストを実行する Android Studio か、iOS テストを実行する XCode が必要です。もしくは、ご自身でお持ち込みください。アーティファクトを提供いたします。

2. gcloud CLI を使用してテストを実行する

Android アプリ APK とテスト APK をビルドする

Test Lab でテストを実行するには、まず Android アプリの APK とテスト APK を作成します。この APK には、ハードウェア デバイスまたはエミュレータで実行するインストルメンテーション テストが含まれています。すでに機能するコードベースがある場合は、独自の APK をビルドするか、Espresso 用の BasicSample を使用できます。

Gradle コマンドを使用して APK をビルドするには、Android SDK をインストールする必要があります。マシンに Android Studio がインストールされていない場合は、Android Studio と Android SDK をインストールし、Android SDK ディレクトリで ANDROID_HOME 環境を設定します。たとえば、~/.bash_profile ファイルに次の行を追加します。

export ANDROID_HOME=~/Android/Sdk # For linux
export ANDROID_HOME=~/Library/Android/sdk  # For MacOS

次に、以下のコマンドを実行してコードのクローンを作成し、APK をビルドします。

git clone https://github.com/android/testing-samples.git
cd testing-samples/ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

クローン作成コマンドとビルドコマンドを実行すると、アプリ APK とテスト APK が次の場所に表示されます。

app/build/outputs/apk/debug/app-debug.apk
app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

または、次の方法を使用してテスト APK とアプリ APK を取得することもできます。

  • Android Studio で APK をビルドするには、Android Studio でテストするの手順に沿って操作します。
  • サンプルのメモ帳アプリをダウンロードします。NotePad/app/build/outputs/apk/ にあるバイナリ ファイル app-debug-unaligned.apk とインストルメンテーション テスト ファイル app-debug-test-unaligned.apk を使用します。

iOS アプリ用のソースコードがある場合は、XCTest を作成し、アプリとテストから ZIP ファイルをビルドできます。

gcloud CLI を使用して Test Lab でテストを実行する

このセクションでは、Firebase プロジェクトを作成し、ローカルの Google Cloud SDK 環境を構成します。詳細については、gcloud CLI でテストを開始する をご覧ください。

gcloud CLI を設定する

  1. gcloud CLI ツールを含む Google Cloud SDK をダウンロードします。
  2. インストールが最新であることを確認します。
gcloud components update
  1. Google アカウントを使用して gcloud CLI にログインします。
gcloud auth login
  1. gcloud CLI で Firebase プロジェクトを設定します。ここで、PROJECT_ID は Firebase プロジェクト ID です。プロジェクト ID は Firebase コンソールの URL で確認できます。この命名規則では https://console.firebase.google.com/project/[PROJECT_ID]/... を使用しています。
gcloud config set project PROJECT_ID

Firebase プロジェクトがない場合は、Firebase コンソールで作成します。

ビルドされた APK を使用してテストを実行する

このセクションでは、Test Lab のデフォルト デバイス(API レベル 28 の Google Pixel 3)でインストルメンテーション テストを実行します。別のデバイスを使用する場合は、利用可能なデバイスをご確認ください

「Android アプリ APK のビルド」とテスト APK でビルドしたアプリとテスト用 APK を使用して、次のコマンドを使用して Android インストルメンテーション テストを実行します。

gcloud firebase test android run \
  --type instrumentation \
  --app app/build/outputs/apk/debug/app-debug.apk \
  --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

テスト結果を分析する

テスト結果は、次のいずれかのオプションを使用して分析できます。

  • gcloud summary - テストが終了すると、gcloud CLI によってテスト結果の基本的な概要が出力されます。
  • gcloud 終了コード - テストが完了した後、テストに合格するとコマンドは 0 で終了します。テストに失敗した場合、コマンドはゼロ以外の終了コードで終了します。
  • Firebase コンソール - gcloud CLI によって Firebase コンソールへのリンクが出力されます。リンクは命名規則 https://console.firebase.google.com/project/PROJECT_ID/testlab/... に従っています。詳細については、単一のテスト実行の結果を解釈するをご覧ください。
  • JUnit XML ファイル - gcloud CLI によって次の内容が表示されます。
Raw results will be stored in your Cloud Storage bucket at [https://console.developers.google.com/storage/browser/test-lab-xxxxx/xxxxx/]

test-lab-xxxxx/xxxxx は、テスト アーティファクトと結果を保存する Cloud Storage バケットです。テスト結果を含む JUnit XML ファイルを見つけるには、リンクを開いて blueline-28-en-portrait/test_result_1.xml に移動します。

3. Jenkins CI で設定する

このセクションでは、一般的な CI システムである Jenkins CI を使用して Test Lab でテストを実行します。別の CI システムを使用する場合は、大規模なテストスイートを実行するための高度なベスト プラクティスと、BitriseCircle CI などの他の CI システムに関するドキュメントをご覧ください。gcloud CLI の代わりに Flank を使用することもできます。

Jenkins 用に gcloud CLI を有効にする

Jenkins で Test Lab を使用するには、必要な API を有効にし、Jenkins が gcloud CLI での認証に使用できるサービス アカウントを設定する必要があります。

Jenkins 用の Google Cloud サービス アカウントを追加する

サービス アカウントは、サービスの統合を目的とした制限付きアカウントです。このアカウントを使用すると、特定のサービスをきめ細かく制御できます。また、CI ビルドをブロックする可能性のあるスパムチェックやキャプチャ プロンプトの対象にはなりません。

サービス アカウントを作成するには、次の操作を行います。

  1. Google Cloud コンソールで [サービス アカウント] ページを開きます。
  2. [サービス アカウントを作成] をクリックし、[名前] と [説明] を追加して、[作成して続行] をクリックします。
  3. [ロールを選択] プルダウンから [基本]、[編集者] の順に選択します。
  4. [続行]、[完了] の順にクリックします。

次に、Jenkins が作成したサービス アカウントとしての認証に使用できる認証キーを作成してダウンロードします。

サービス アカウント キーを作成してダウンロードする手順は次のとおりです。

  1. Google Cloud コンソールの [サービス アカウント] ページで、作成したアカウントに関連付けられたメールアドレスをクリックします。
  2. [] を選択し、[鍵を追加]、[新しい鍵を作成] の順にクリックします。
  3. [JSON] を選択し、[作成] をクリックします。
  4. ファイルをダウンロードするよう求められたら、[OK] をクリックします。ファイルをパソコンの安全な場所にダウンロードします。このファイルは、後で Jenkins を構成するときに必要になります。

サービス アカウントの作成の詳細については、サービス アカウントの作成をご覧ください。

必要な Google Cloud API を有効にする

Cloud Testing API を使用すると、Google インフラストラクチャでテストを実行できます。この API は、「gcloud CLI を使用してテストを実行する」を完了したときに有効にしました。Cloud Tool Results API を使用すると、プログラムでテスト結果にアクセスできます。

  1. Google Developers Console API ライブラリを開きます。
  2. Firebase コンソールの上部にある検索バーに、必要な各 API の名前を入力します(Cloud Testing APICloud Tool Results API)。リクエストされた API の概要ページが表示されます。
  3. 各 API の概要ページで [API を有効にする] をクリックします。

Jenkins をインストールして設定する

Jenkins CI は、Linux、macOS、Windows など、さまざまな環境にインストールして設定できます。この Codelab の具体的な内容は、ファイルパスでのスラッシュ(/)の使用など、Linux に Jenkins CI をインストールして実行するためのものです。

Linux または Windows を実行しているコンピュータに Jenkins をダウンロードしてインストールするには、Jenkins のインストールの手順に沿って操作します。Jenkins をインストールしたら、同じ Jenkins のインストール手順に沿って設定を完了し、http://localhost:8080 を使用して Jenkins ダッシュボードにアクセスします。

インストールされているプラグインを確認する

Jenkins はさまざまなバージョン管理システムをサポートしています。この Codelab では、Git を使用して前のテストを実行します。gcloud CLI をより快適に実行するには、GCloud SDK プラグインをインストールする必要があります。

  1. Jenkins ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Manage Plugins(プラグインの管理)] の順にクリックします。
  2. Git プラグインと GCloud SDK プラグインを検索し、インストールします(まだインストールされていない場合)。

Android SDK と Google Cloud SDK の場所を構成する

次に、Google Cloud SDK と Android SDK の場所を Jenkins に指示します。

Jenkins 用に Google Cloud SDK と Android SDK を構成するには、次の操作を行います。

  1. Jenkins ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Global Tool Configuration](グローバル ツール構成)の順にクリックします。
  2. [Google Cloud SDK] セクションで、[Add Google Cloud SDK] をクリックします。
  3. [名前] フィールドに、覚えやすい Google Cloud SDK インスタンスの名前を入力します(例: GCloud-SDK)。
  4. Google Cloud SDK のホーム ディレクトリを入力します(例: /opt/google-cloud-sdk)。
  5. [保存] をクリックします。
  6. [Dashboard] > [Manage Jenkins] > [Configure System] を開いて、Android SDK と Google Cloud SDK のシステム全体のプロパティを設定します。
  7. [環境変数] チェックボックスをオンにして、[追加] をクリックします。
  8. [名前] フィールドに「ANDROID_HOME」と入力します。[Value] フィールドに、Android SDK の場所を入力します(例: /opt/Android/Sdk)。
  9. [Tool Locations] チェックボックスをオンにして、[Add] をクリックします。[名前] プルダウンで、グローバル ツールの構成で追加した Google Cloud SDK インスタンスの名前を選択します。
  10. [Home] フィールドに、Google Cloud SDK の場所を入力します(例: /opt/google-cloud-sdk)。
  11. [保存] をクリックします。

サービス アカウントの認証情報を Jenkins に追加する

Jenkins が gcloud CLI コマンドを認証して正常に実行できるように、gcloud CLI サービス アカウントの認証情報を Jenkins に追加します。

  1. Jenkins ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Manage Credentials(認証情報を管理)] の順にクリックします。
  2. [Stores Scopes to Jenkins](Jenkins をスコープとするストア)セクションで、[(global)] ドメインリンクをクリックし、[Add Credentials] をクリックします。
  3. [種類] プルダウンから、[秘密鍵からの Google サービス アカウント] を選択します。
  4. [プロジェクト名] フィールドに、Firebase プロジェクト名を入力します。
  5. [JSON キー] を選択し、[参照] をクリックして、サービス アカウント キーを保存した場所を参照します。
  6. [作成] をクリックします。

これで Test Lab の Jenkins 自動ビルドを構成する準備が整いました。

4. Jenkins CI を使用して Test Lab テストを実行する

Jenkins を設定したので、すべてをまとめ、Jenkins を使用して同じテストを実行してみましょう。

アプリケーションのアップデートがチェックインされるたびに自動ビルドとテストを実行するように、Jenkins を構成できます。ビルドを定期的に実行するように Jenkins を構成することもできます。Jenkins でビルドを構成する方法については、自動ビルドを構成するをご覧ください。

Jenkins プロジェクトを作成して構成する

Test Lab でアプリの継続的インテグレーション テストを実行するプロジェクトを作成します。

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

  1. http://localhost:8080 を参照して Jenkins ダッシュボードを開きます。
  2. Jenkins ダッシュボードで [新規ジョブ作成] をクリックします。
  3. [Item name] フィールドにプロジェクトの名前を入力し、[Freestyle project] をクリックして、単一のビルド構成を使用するプロジェクトを作成します。
  4. [OK] をクリックします。プロジェクトの構成を完了するには、残りのセクションを順番に完了します。

ソースコード管理を構成する

  1. [ソースコード管理] タブで、[Git] を選択します。
  2. [リポジトリの URL] フィールドに「https://github.com/android/testing-samples.git」と入力します。

ビルド環境を構成する

[Build Environment] セクションでは、ビルドの特性を構成できます。次の手順で Google Cloud 認証を有効にします。

  1. [Build Environment] タブで [GCloud SDK authentication] チェックボックスをオンにして、Google Cloud のインストール情報を追加したときに選択したインストール名を選択します。
  2. [Google Credentials] プルダウンから、構成したサービス アカウントの認証情報を選択します。

APK パッケージを再ビルドするための Gradle ビルドステップを追加する

  1. [Build] セクションまで下にスクロールし、[Add build step] をクリックし、[Execute shell] を選択します。
  2. アプリケーションのメイン ディレクトリに次のコマンドを実行するビルドステップを追加します。
cd ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

Jenkins に gcloud CLI ビルドステップを追加する

これで、gcloud CLI コマンドラインを使用して Test Lab を実行するビルドステップを Jenkins に追加する準備が整いました。

gcloud CLI ビルドステップを追加するには、新しい [シェルを実行] ビルドステップを追加して次のコマンドを入力します。

gcloud config set project PROJECT_ID
gcloud firebase test android run \
--app ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/debug/app-debug.apk
--test ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

プロジェクトの設定が完了したら、ページの一番下までスクロールして構成を保存します。新しいプロジェクトのホームページにリダイレクトされます。

Jenkins でテストを実行する

これで、Jenkins プロジェクトをビルドし、gcloud CLI で実行した手動テストのようなテストを実行する準備が整いました。

Jenkins でテストを実行する手順は次のとおりです。

  1. ビルドを手動でトリガーするには、[Build Now] をクリックします。
  2. 新しいビルド > [Console Output(コンソール出力)] をクリックして進行状況と結果を確認します。

エラーが表示されなければ、成功です。ワンクリックでプロジェクトを設定し、Pixel 2 デバイスでテストを実行できました。エラーが発生した場合は、トラブルシューティングをご覧ください。

5. 大規模なテストスイートを実行するための高度なベスト プラクティス

多数のテストを同時に実行する場合は、次のベスト プラクティスに沿って、テストを迅速かつ確実に実行するようにします。

複数のデバイス設定でカバレッジを拡大

gcloud CLI ビルドステップに複数のデバイスを簡単に追加できます。利用可能なデバイス、バージョン、言語 / 地域、画面の向きを確認して選択することもできます。たとえば、次のコマンドは 2 つのデバイスでテストを実行します。

  • API レベル 30 の仮想 Google Pixel 2(縦向き、英語 / 地域)
  • API レベル 29 の物理的な Samsung Galaxy S20(横向き、フランス語 / 地域)
gcloud firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --device model=Pixel2,version=30,locale=en,orientation=portrait  \
  --device model=x1q,version=29,locale=fr,orientation=landscape

gcloud CLI YAML 構成ファイルを使用する

引数を 1 か所またはソース管理システムで管理したい場合は、これらの引数を YAML 形式の引数ファイルで指定できます。この機能の使用方法を確認するには、gcloud topic arg-files を実行します。

テストをシャーディングして並行して実行する

テストのシャーディングにより、一連のテストがサブグループ(シャード)に分割され、それぞれ独立して実行されます。Test Lab は、複数のデバイスを使用して各シャードを自動的に並列実行するため、Test Lab は一連のテストをより迅速に完了できます。詳細については、シャーディングを有効にするをご覧ください。

シャーディングを有効にするには、gcloud beta チャネルを使用し、gcloud CLI ビルドステップに –num-uniform-shards フラグまたは –test-targets-for-shard フラグを追加します。たとえば、テストを 5 つの実行にシャーディングして並行して実行するには、次のコマンドを実行します。

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-uniform-shards 5

脆弱性検出を有効にする

モバイルのテストは、しばしば不安定になることがあります。同じセットアップでも、テストに合格することもあれば、不合格になることもあります。失敗したテストが不安定だったかどうかを確認するには、gcloud CLI フラグの –num-flaky-test-attempts フラグを使用します。このフラグは、なんらかの理由で 1 つ以上のテストケースが失敗した場合に、テスト実行を再試行する回数を指定します。

たとえば、失敗したテストケースを最初に失敗した後、さらに 3 回再実行するには、次のように指定します。

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-flaky-test-attempts 3

6. 完了

これで、CI システムを使用して最初の Test Lab テストを実行できました。

アプリとテスト用 APK を作成し、gcloud CLI を使用して Test Lab でインストルメンテーション テストを実施しました。また、同じテストを自動化する Jenkins プロジェクトもセットアップしました。

ここでは、Test Lab を CI/CD システムに統合するための主な手順を学びました。

次のステップ

Firebase Emulator Suite を使用して CI を設定する方法を確認する

関連情報

リファレンス ドキュメント