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

1. はじめに

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

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

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

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

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

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

ハードウェア要件なし

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

高速、高信頼性

多数のテストケースを同時に実行すると、CI/CD プロセスを妨げるため、長い時間がかかる可能性があります。Test Lab を使用すると、テストを簡単にシャーディングし、複数のデバイスで並行して実行できます。モバイルテストの一般的な課題である、不安定さを検出することもできます。

学習内容

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

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

必要なもの

ゼロからビルドする場合は、Android Studio で Android テストを実行するか、XCode で iOS テストを実行する必要があります。お客様自身で撮影していただければ、Google がアーティファクトを提供します。

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_HOME 環境を Android SDK ディレクトリに設定します。たとえば、~/.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

clone コマンドと build コマンドを実行すると、アプリ 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 でテストするの手順に沿って操作します。
  • メモ帳アプリのサンプルをダウンロードします。バイナリ ファイル app-debug-unaligned.apk とインストルメンテーション テスト ファイル app-debug-test-unaligned.apk を使用します。これらのファイルは NotePad/app/build/outputs/apk/ にあります。

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

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

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

gcloud CLI を設定する

  1. Google Cloud SDK をダウンロードします。この SDK には gcloud CLI ツールが含まれています。
  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 の 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/... です。詳細については、1 回のテスト実行の結果を解釈するをご覧ください。
  • JUnit XML file - 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] をクリックし、[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] をクリックし、[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. [ダッシュボード] > [Manage Jenkins] > [Configure System] を開き、Android SDK と Google Cloud SDK のシステム全体のプロパティを構成します。
  7. [環境変数] チェックボックスをオンにして、[追加] をクリックします。
  8. [Name] フィールドに「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 に追加する

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

  1. Jenkins ダッシュボードで [Manage Jenkins] をクリックし、[Manage Credentials] をクリックします。
  2. [Jenkins をスコープとするストア] セクションで、(グローバル)ドメイン リンクをクリックし、[認証情報を追加] をクリックします。
  3. [Kind(種類)] プルダウンから [Google Service Account from private key] を選択します。
  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. [アイテム名] フィールドにプロジェクトの名前を入力し、[フリースタイルのプロジェクト] をクリックして、単一のビルド構成を使用するプロジェクトを作成します。
  4. [OK] をクリックします。プロジェクトの構成を完了するには、残りのセクションを順番に完了してください。

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

  1. [Source Code Management] タブで、[Git] を選択します。
  2. [リポジトリの URL] 欄に「https://github.com/android/testing-samples.git」と入力します。

ビルド環境を構成する

[ビルド環境] セクションでは、ビルドの特性を構成できます。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

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

これで、gcloud CLI コマンドラインを使用して Test Lab を実行するビルドステップを Jenkins に追加できるようになりました。

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

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 は、複数のデバイスを使用して各シャードを自動的に並行して実行するため、テストセット全体をより迅速に完了できます。詳細については、シャーディングを有効にするをご覧ください。

シャーディングを有効にするには、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 を設定する方法を確認する

関連情報

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