1. はじめに
最終更新日: 2022 年 4 月 7 日
CI / CD システムでモバイルテストを実行する方法
多くのアプリは、さまざまなプラットフォーム、デバイス、API バージョンで実行されるため、モバイルテストの実行は簡単ではありません。アプリ デベロッパーは、ユーザーが認識する前に問題を検出するために、できるだけ多くの構成でテストしたいと考えています。しかし、コストとリソースの制約により、テストデバイスの数と、個々のデベロッパーが投資できる手作業のメンテナンス量は制限されます。特に継続的インテグレーション/継続的開発(CI/CD)システムの場合、開発プロセスがスケールアップする場合は、メンテナンスの費用と労力を最小限に抑えながらテストプロセスを自動化する必要があります。
Firebase Test Lab では、ユーザーのデバイスでアプリがどのように動作するかを把握できるように、さまざまなモバイル実機と仮想デバイスを Google のデータセンターでホストしています。また、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/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 で確認できます。この命名規則では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 システムを使用する場合は、大規模なテストスイートを実行するための高度なベスト プラクティスと、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 ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Manage Plugins(プラグインの管理)] の順にクリックします。
- Git プラグインと GCloud SDK プラグインを検索してインストールします(まだインストールされていない場合)。
Android SDK と Google Cloud SDK の場所を構成する
次に、Google Cloud SDK と Android SDK の場所を Jenkins に指示します。
Jenkins 用に Google Cloud SDK と Android SDK を構成するには、次の操作を行います。
- Jenkins ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Global Tool Configuration](グローバル ツール構成)の順にクリックします。
- [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
)。 - [ツールの場所] チェックボックスをオンにして、[追加] をクリックします。[名前] プルダウンから、[グローバル ツールの構成] で追加した Google Cloud SDK インスタンスの名前を選択します。
- [Home] フィールドに、Google Cloud SDK の場所を入力します(例:
/opt/google-cloud-sdk
)。 - [保存] をクリックします。
サービス アカウントの認証情報を Jenkins に追加する
Jenkins が gcloud CLI コマンドを認証して正常に実行できるように、gcloud CLI サービス アカウントの認証情報を Jenkins に追加します。
- Jenkins ダッシュボードで [Manage Jenkins(Jenkins の管理)]、[Manage Credentials(認証情報を管理)] の順にクリックします。
- [Stores scope to Jenkins](Jenkins をスコープとするストア)セクションで、[(global)] ドメインリンクをクリックし、[Add Credentials] をクリックします。
- [種類] プルダウンから、[秘密鍵からの Google サービス アカウント] を選択します。
- [Project Name] フィールドに Firebase プロジェクト名を入力します。
- [JSON キー] を選択し、[参照] をクリックして、サービス アカウント キーを保存した場所を参照します。
- [作成] をクリックします。
これで、Test Lab 用の Jenkins 自動ビルドを構成する準備が整いました。
4. Jenkins CI で Test Lab テストを実行する
Jenkins をセットアップしたので、すべてをまとめ、Jenkins を使用して同じテストを実行しましょう。
アプリの更新がチェックインされるたびに自動ビルドとテストを実行するように Jenkins を設定できます。定期的にビルドを実行するように Jenkins を構成することもできます。Jenkins でのビルドの設定について詳しくは、自動ビルドの設定をご覧ください。
Jenkins プロジェクトを作成して構成する
Test Lab でアプリの継続的インテグレーション テストを実行するプロジェクトを作成します。
Jenkins プロジェクトを作成する
- http://localhost:8080 にブラウジングして、Jenkins ダッシュボードを開きます。
- Jenkins ダッシュボードで [新規ジョブ作成] をクリックします。
- [Item name] フィールドにプロジェクトの名前を入力し、[Freestyle project] をクリックして、単一のビルド構成を使用するプロジェクトを作成します。
- [OK] をクリックします。プロジェクトの構成を完了するには、残りのセクションを順番に完了します。
ソースコード管理を構成する
- [ソースコード管理] タブで、[Git] を選択します。
- [リポジトリ URL] フィールドに「https://github.com/android/testing-samples.git」と入力します。
ビルド環境を構成する
[ビルド環境] セクションでは、ビルド特性を構成できます。Google Cloud 認証を有効にする手順は次のとおりです。
- [Build Environment] タブで、[GCloud SDK authentication] チェックボックスをオンにして、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 ビルドステップを追加するには、新しい [シェルを実行] ビルドステップを追加して次のコマンドを入力します。
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] をクリックします。
- 新しいビルド > [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 を設定する方法を確認する