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 で確認できます。この ID は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 を実行している PC に Jenkins をダウンロードしてインストールするには、Jenkins のインストールの手順に沿って操作します。Jenkins をインストールしたら、Jenkins のインストール手順に沿って設定を完了し、http://localhost:8080 を使用して Jenkins ダッシュボードにアクセスします。
インストールされているプラグインを確認する
Jenkins はさまざまなバージョン管理システムをサポートしています。この Codelab では、Git を使用して前のテストを実行します。gcloud CLI をより快適に実行するには、GCloud SDK プラグインをインストールする必要があります。
- Jenkins ダッシュボードで [Manage 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
)。 - [保存] をクリックします。
- [ダッシュボード] >Jenkins を管理する >システムを構成します。
- [環境変数] チェックボックスをオンにして、[追加] をクリックします。
- [名前] フィールドに「ANDROID_HOME」と入力します。[Value] フィールドに、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] をクリックし、[Manage Credentials] をクリックします。
- [Stores Scopes to Jenkins](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 ダッシュボードで [新規ジョブ作成] をクリックします。
- [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 ビルド手順を追加する
- [Build] セクションまで下にスクロールし、[Add build step] をクリックし、[Execute shell] を選択します。
- アプリケーションのメイン ディレクトリで以下のコマンドを実行するビルド手順を追加します。
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] をクリックします。
- 新しいビルド > [Console Output] をクリックして、進行状況と結果を確認します。
エラーが表示されない場合は、問題ありません。プロジェクトをセットアップし、Google Pixel 2 デバイスでテストを 1 クリックで実行しました。エラーが発生した場合は、トラブルシューティングをご覧ください。
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 を設定する方法を確認する