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

1. はじめに

最終更新日: 2022-04-07

CI/CD システムを使用してモバイル テストを実行する方法

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

ユーザーのデバイス上でアプリがどのように動作するかを理解できるように、Firebase Test Lab はさまざまなモバイル物理デバイスおよび仮想デバイスをデータセンターでホストしています。また、データセンター内のデバイスでのテストの実行を調整する、プラットフォームに依存しないコマンドライン ツールである Google Cloud CLI も提供しています。 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 システムでスケールアップするようにテストを構成する方法

このコードラボはテストの実行に焦点を当てています。関連性のない概念やコード ブロックは省略されており、簡単にコピーして貼り付けることができます。

必要なもの

何かを最初から構築したい場合は、Android テストを実行するには Android Studio が必要で、iOS テストを実行するには XCode が必要です。または、ご自身でご持参いただければ、アーティファクトを提供いたします。

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

Android アプリ APK のビルドと APK のテスト

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

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 で確認できます。この URL は、https: 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/...詳細については、 「単一のテスト実行の結果を解釈する」を参照してください。
  • 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 Console で[サービス アカウント]ページを開きます。
  2. [サービス アカウントの作成]をクリックし、名前説明を追加して、 [作成して続行]をクリックします。
  3. [役割の選択]ドロップダウンから、 [基本]を選択し、次に[エディター]を選択します。
  4. 「続行」をクリックし、 「完了」をクリックします。

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

サービス アカウント キーを作成してダウンロードするには、次の手順に従います。

  1. Google Cloud Console の[サービス アカウント]ページで、作成したアカウントに関連付けられたメールをクリックします。
  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、その他多くの環境にインストールしてセットアップできます。このコードラボの特定の詳細は、ファイル パスでのスラッシュ (/) の使用など、Linux での Jenkins CI のインストールと実行に固有のものです。

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

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

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

  1. Jenkins ダッシュボードで、 「Jenkins の管理」をクリックし、 「プラグインの管理」をクリックします。
  2. GitおよびGCloud SDKプラグインを検索し、インストールします (まだインストールされていない場合)。

Android および Google Cloud SDK の場所を構成する

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

Jenkins 用に Google Cloud および Android SDK を構成するには、次の手順に従います。

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

サービス アカウントの資格情報を Jenkins に追加します

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

  1. Jenkins ダッシュボードで、 「Jenkins の管理」をクリックし、 「資格情報の管理」をクリックします。
  2. [Jenkins にスコープされたストア]セクションで、 (グローバル)ドメイン リンクをクリックし、 [資格情報の追加]をクリックします。
  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. [項目名]フィールドにプロジェクトの名前を入力し、 [フリースタイル プロジェクト]をクリックして、単一のビルド構成を使用するプロジェクトを作成します。
  4. 「OK」をクリックします。プロジェクトの構成を完了するには、残りのセクションを順番に完了してください。

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

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

ビルド環境を構成する

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

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

Gradle ビルドステップを追加して APK パッケージを再構築する

  1. [ビルド]セクションまで下にスクロールし、 [ビルド ステップの追加]をクリックして、 [シェルの実行]を選択します。
  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 ビルド ステップを追加するには、新しいシェル実行ビルド ステップを追加し、次のコマンドを入力します。

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. ビルドを手動でトリガーするには、 「今すぐビルド」をクリックします。
  2. [新しいビルド] > [コンソール出力]をクリックして、進行状況と結果を確認します。

エラーが表示されなければ、おめでとうございます!プロジェクトをセットアップし、ワンクリックで 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チャネルを使用し、 –num-uniform-shardsまたは–test-targets-for-shardフラグを gcloud CLI ビルドステップに追加します。たとえば、テストを 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 をセットアップする方法を確認してください。

参考文献

参考資料