1. はじめに
最終更新日: 2022 年 4 月 7 日
CI/CD システムでモバイルテストを実行する方法
モバイルテストの実行は難しい場合があります。多くのアプリは、さまざまなプラットフォーム、デバイス、API バージョンで実行されるためです。アプリ デベロッパーは、ユーザーが問題に遭遇する前に問題を検出するため、できるだけ多くの構成でテストを実施したいと考えています。しかし、費用とリソースの制約により、個々のデベロッパーが投資できるテストデバイスの数と手動メンテナンスの量には限界があります。開発プロセスがスケールアップする場合、特に継続的インテグレーション/継続的開発(CI/CD)システムでは、メンテナンスの費用と労力を最小限に抑えながら、テストプロセスを自動化する必要があります。
ユーザーのデバイスでアプリがどのように動作するかを把握できるように、Firebase Test Lab では、データセンターでさまざまなモバイルの実機と仮想デバイスをホストしています。また、Google Cloud CLI というプラットフォームに依存しないコマンドライン ツールも提供しています。このツールは、Google のデータセンター内のデバイスでテストを実行するオーケストレーションを行います。gcloud CLI を使用すると、Test Lab のクラウドベースのテスト ソリューションを既存の CI/CD ワークフローに簡単に統合できます。
クロス プラットフォームのサポート
Test Lab は、Android アプリと iOS アプリのテスト ソリューションを提供し、Unity などのモバイルゲームの特別なサポートを提供します。テスト オプションには、Android Espresso、UI Automator、iOS XCTest などの一般的なテスト フレームワークが含まれています。Test Lab では、自動クローラー 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 アプリをダウンロードします。
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 を設定する
- gcloud CLI ツールを含む Google Cloud SDK をダウンロードします。
- インストールが最新であることを確認します。
gcloud components update
- Google アカウントを使用して gcloud CLI にログインします。
gcloud auth login
- gcloud CLI で Firebase プロジェクトを設定します。ここで、
PROJECT_ID
は Firebase プロジェクト ID です。プロジェクト ID は、Firebase コンソールの URL で確認できます。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
サマリー - テストが終了すると、gcloud CLI によってテスト結果の基本サマリーが表示されます。gcloud
終了コード - テストが完了すると、テストに合格した場合はコマンドが 0 で終了します。テストが失敗した場合、コマンドは 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 システムを使用する場合は、大規模なテストスイートを実行するための高度なベスト プラクティスと、Bitrise や Circle CI などの他の CI システムのドキュメントをご覧ください。gcloud CLI の代わりに Flank を使用できます。
Jenkins 用の gcloud CLI を有効にする
Jenkins で Test Lab を使用する前に、必要な API を有効にして、Jenkins が gcloud CLI で認証に使用できるサービス アカウントを設定する必要があります。
Jenkins 用の Google Cloud サービス アカウントを追加する
サービス アカウントは、サービス統合を目的とした制限付きアカウントです。これらのアカウントは、特定のサービスをきめ細かく制御でき、スパムチェックやキャプチャ プロンプトの対象になりません。対象にすると、CI ビルドがブロックされる可能性があります。
サービス アカウントを作成するには、次の操作を行います。
- Google Cloud コンソールで [サービス アカウント] ページを開きます。
- [サービス アカウントを作成] をクリックし、名前と説明を追加して、[作成して続行] をクリックします。
- [ロールを選択] プルダウンから [基本] を選択し、[編集者] を選択します。
- [続行]、[完了] の順にクリックします。
次に、作成したサービス アカウントとして認証するために Jenkins が使用できる認証キーを作成してダウンロードします。
サービス アカウント キーを作成してダウンロードするには、次の操作を行います。
- Google Cloud コンソールの [サービス アカウント] ページで、作成したアカウントに関連付けられているメールアドレスをクリックします。
- [鍵] を選択し、[鍵を追加]、[新しい鍵を作成] の順にクリックします。
- [JSON] を選択し、[作成] をクリックします。
- ファイルのダウンロードを求めるメッセージが表示されたら、[OK] をクリックします。ファイルをパソコンの安全な場所にダウンロードします。このファイルは、後で Jenkins を構成するときに必要になります。
サービス アカウントの作成の詳細については、サービス アカウントの作成をご覧ください。
必要な Google Cloud API を有効にする
Cloud Testing API を使用すると、Google インフラストラクチャでテストを実行できます。この API は、gcloud CLI でテストを行うを完了したときに有効にしました。Cloud Tool Results API を使用すると、テスト結果にプログラムでアクセスできます。
- Google Developers Console API ライブラリを開きます。
- Firebase コンソール上部の検索バーに、必要な各 API(Cloud Testing API と Cloud Tool Results API)の名前を入力します。リクエストされた API の概要ページが表示されます。
- 各 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 プラグインをインストールする必要があります。
- Jenkins ダッシュボードで、[Jenkins の管理] をクリックし、[プラグインの管理] をクリックします。
- Git プラグインと GCloud SDK プラグインを検索してインストールします(まだインストールされていない場合)。
Android SDK と Google Cloud SDK の場所を構成する
これで、Jenkins に Google Cloud SDK と Android SDK の場所を指示しました。
Jenkins 用に Google Cloud SDK と Android SDK を構成する手順は次のとおりです。
- Jenkins ダッシュボードで [Jenkins の管理] をクリックし、次に [グローバル ツール構成] をクリックします。
- [Google Cloud SDK] セクションで、[Add Google Cloud SDK] をクリックします。
- [名前] フィールドに、覚えやすい Google Cloud SDK インスタンスの名前(GCloud-SDK など)を入力します。
- Google Cloud SDK のホーム ディレクトリ(
/opt/google-cloud-sdk
など)を入力します。 - [保存] をクリックします。
- [Dashboard] > [Manage Jenkins] > [Configure System] を開いて、Android SDK と Google Cloud SDK のシステム全体のプロパティを構成します。
- [環境変数] チェックボックスをオンにして、[追加] をクリックします。
- [名前] フィールドに「ANDROID_HOME」と入力します。[値] フィールドに、Android SDK の場所(例:
/opt/Android/Sdk
)を入力します。 - [ツールの場所] チェックボックスをオンにして、[追加] をクリックします。[名前] プルダウンから、[Global Tool Configuration] で追加した Google Cloud SDK インスタンスの名前を選択します。
- [Home] フィールドに、Google Cloud SDK の場所(
/opt/google-cloud-sdk
など)を入力します。 - [保存] をクリックします。
Jenkins にサービス アカウントの認証情報を追加する
これで、Jenkins が認証して gcloud CLI コマンドを正常に実行できるように、gcloud CLI サービス アカウントの認証情報を Jenkins に追加します。
- Jenkins ダッシュボードで、[Jenkins の管理] をクリックし、[認証情報の管理] をクリックします。
- [Stores scoped to Jenkins] セクションで、[(global)] ドメインリンクをクリックし、[Add Credentials] をクリックします。
- [種類] プルダウンから、[秘密鍵からの Google サービス アカウント] を選択します。
- [Project Name] フィールドに Firebase プロジェクト名を入力します。
- [JSON key] を選択し、[Browse] をクリックして、サービス アカウント キーを保存した場所に移動します。
- [作成] をクリックします。
これで、Test Lab 用の Jenkins 自動ビルドを構成する準備が整いました。
4. Jenkins CI で Test Lab テストを実行する
Jenkins を設定したので、すべてをまとめて Jenkins を使用して同じテストを実行してみましょう。
アプリにアップデートが追加されるたびにビルドとテストの実行を自動的に行うように Jenkins を設定できます。定期的にビルドを実行するように Jenkins を構成することもできます。Jenkins でのビルドの設定について詳しくは、自動ビルドの設定をご覧ください。
Jenkins プロジェクトを作成して構成する
Test Lab でアプリの継続的インテグレーション テストを実施するためのプロジェクトを作成します。
Jenkins プロジェクトを作成する
- http://localhost:8080 を参照して、Jenkins ダッシュボードを開きます。
- Jenkins ダッシュボードで [新規ジョブ作成] をクリックします。
- [アイテム名] フィールドにプロジェクトの名前を入力し、[フリースタイル・プロジェクトのビルド] をクリックして、単一のビルド設定を使用するプロジェクトを作成します。
- [OK] をクリックします。プロジェクトの構成を完了するには、残りのセクションを順番に完了します。
ソースコード管理を構成する
- [Source Code Management] タブで、[Git] を選択します。
- [Repository URL] フィールドに「https://github.com/android/testing-samples.git」と入力します。
ビルド環境を構成する
[ビルド環境] セクションでは、ビルドの特性を構成できます。Google Cloud 認証を有効にする手順は次のとおりです。
- [ビルド環境] タブで、[GCloud SDK 認証] チェックボックスをオンにし、Google Cloud のインストール情報を追加したときに選択したインストール名を選択します。
- [Google Credentials] プルダウンから、構成したサービス アカウントの認証情報を選択します。
APK パッケージを再作成する Gradle ビルド手順を追加する
- [ビルド] セクションまで下にスクロールし、[ビルド手順の追加] をクリックして、[シェルの実行] を選択します。
- アプリケーションのメイン ディレクトリで以下のコマンドを実行するビルド手順を追加します。
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 ビルドステップを追加するには、新しい [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 でテストを実行する手順は次のとおりです。
- ビルドを手動でトリガーするには、[Build Now] をクリックします。
- 新しいビルド > [コンソール出力] をクリックして、進行状況と結果を確認します。
エラーが表示されなければ、おめでとうございます。プロジェクトを設定し、Google 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 構成ファイルを使用する
引数を一元管理する場合や、ソース管理システムで管理する場合は、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
不安定なテストの検出を有効にする
モバイルテストは不安定になることがよくあります。同じ設定でも、テストが合格したり不合格になったりすることがあります。失敗したテストが不安定だったかどうかを検出するには、–num-flaky-test-attempts gcloud CLI フラグを使用します。このフラグは、なんらかの理由で 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 を設定する方法をご覧ください。