はじめまして。ピグエデンでアウトゲームを担当している植木です。
今までピグエデンに関する話は、このブログでも紹介されており、

の記事があります。

ピグでのテストについて

今までのピグのテストは、テスト項目書を用意して、リリース前のアプリにデバッガーの方にお願いしてみてもらって、報告を受ける形を取っています。いわば最終防衛ラインところなので、そんな頻繁にお願いできません。また、スマホになると、各デバイスやバージョン違いも見ながらのテストになってくるので、工数も膨らんできます。そこで、ピグエデンでは、基本動作のテストは自動化したいと考えていました。

Unity上でのテストも可能ですが、できれば実機にインストールした形でテストできる方法がないかと調べていたところ、Firebase Test Labで、Unityで作成したアプリでもテストができることを知りました。

今回は、ピグエデンでFirebase Test Labを導入して、運用するところまでを説明します。

Firebase Test Labとは

端末のテストをクラウド上で行えるサービスで、実機または仮想端末を複数指定して、実行できます。テストの種類は、Androidで3種類、iOSはβで用意されています。

  • Android
    • Instrumentation tests
    • Robo test
    • Game Loop test
  • iOS
    • XCTests

Unityで作成したアプリのテストは、Game Loop testを使います。このテストは、実機の想定動作のアプリ内で実装して、その流れの中で、ログをはき出して、実行に問題ないかをテストします。テストしたい内容のシナリオを複数定義し、テスト時には、指定したシナリオの番号が渡されるので、それに従って実行するように実装します。

シナリオの呼び出し準備

Firebase Test Labでテスト実行される際には決められたインテントで呼び出されるので、そのインテントに従って、アプリを実行するようにします。

AndroidManifestの設定

Game Loop testの呼び出しを受け取れるようにAndroidManifestにintent-filterを追加します。

<intent-filter>
<action android:name=”com.google.intent.action.TEST_LOOP”/>
<category android:name=”android.intent.category.DEFAULT”/>
<data android:mimeType=”application/javascript”/>
</intent-filter>

ただし、これは通常のアプリでは不要な内容ですので、Unityでテスト用アプリをビルドするときのみに追加するように、エディタスクリプトを用意します。InsertTestLabIntent.AddSettingをビルド前に呼び出すようにして、AndroidManifest.xmlを書き換えます。

インテントを受け取る

インテントの受け取りにはAndroid用の処理を足す必要がありますが、Unity用ライブラリが公開されているので、これを利用します。
ttps://github.com/googlecodelabs/unity-firebase-test-lab-game-loop
unity-firebase-test-lab-game-loop-project.unitypackageをダウンロードしてインストールしてください。

インストールしたライブラリのTestLabManager.Instantiateを呼び出すと、TestLabManagerの実態を返すので、どのシナリオの実行か判断できます。以下のコードでは、UniRxでScenarioNumberが帰ってくるのを監視し、指定されたScenarioNumberに合ったシナリオを実行するようにしています。

シナリオを作成する

シナリオの作成するには、通常シーンに合わせて、シナリオの実行を監視するスクリプトを常駐させます。このスクリプトが画面の遷移を監視し、タップ処理を発生させて、アプリが進行するようにします。以下のコードは基本クラスで、各シナリオのベースとなるスクリプトで、継承して使っています。

主な処理としては以下の内容になっています。

画面遷移の監視

_watchObjectCoroutineメソッドが画面遷移の監視をしているメソッドです。指定されたクラスが読み込まれたのを監視し、完了するとそのインスタンスを返します。

タップの発生

_tapメソッドは、遷移の監視と合わせて、タップ処理を実行します。タップが完了すると戻ります。

ログの出力

TestLabManager.LogToResultsを呼び出すと、ログをファイルに出力できます。出力したログはテスト後、ダウンロードして確認できます。

テストの終了

TestLabManager.NotifyHarnessTestIsCompleteを呼び出すと、シナリオの実行を完了したことを通知します。これを呼び出さないと、Firebase Test Labはタイムアウトするまで続けられます。

AnrdoidManifestの設定

シナリオが用意できたら、インテントの情報として、シナリオの数と種類の定義を追加します。これも、テスト時以外は不要なので、先ほどのInsertTestLabIntent.csに処理を追加して、ビルド前に追記されるようにします。Firebase Test Labではこの情報を読み取って、シナリオを呼び出します。
<meta-data android:name=”com.google.test.loops” android:value=”シナリオ数”/>
<meta-data android:name=”com.google.test.loops.シナリオの種類” android:value=”シナリオ番号” />

Unity上でテスト

インストールしたUnity用ライブラリは、Unity上では何も動作しないので、ピグエデンではUnity上で起動された場合は、アプリ本体の前にテスト用のシーンを挟み、シナリオの数だけボタンを自動生成して、自分で任意のシナリオをテストできるようにしています。

実機テスト

Unity上での動作確認ができたら、次は実機でテストを行います。

Test Loop Managerのインストール

実機テストには専用のアプリがあり、事前に端末にインストールします。アプリはTest Labのヘルプページからダウンロードできます。

テスト用アプリをインストール

テスト用アプリをインストールし、Test Loop Managerを起動すると、テスト用アプリの情報が読み込まれ、メニューにアプリ名が表示されます。

テスト実行

アプリ名をタップすると、シナリオの一覧が表示されるので、実行したいテストを選択します。下段の「RUN DEFAULT TEST LOOP」をタップするとテストを開始します。テストが終了すると、元のTest Loop Managerに戻ります。結果のテキストファイルも保存されるので、Firebase Test Labを使わなくてもテスト可能です。

Firebase上で実行する

Firebase上で実行するには、プロジェクトが必要です。アプリ内でFirebaseを採用していない場合は、別途Firebaseのプロジェクトを作成してください。Firebase Test Labは1日の制限はありますが、無料でテスト実行可能です。

テスト内容を選択

Firebaseのコンソールより、Test Labの画面を開き、「テストを実行」をクリックすると、メニューが開かれるので、「ゲームループを実行」を選択してください。

アプリをアップロード

アプリをアップロードする画面になるので、ビルド済みのapkをアップロードしてください。アプリをアップロードできると、右下の「次へ」ボタンが有効になります。

テストする端末を選択

テストを実行する端末を選択します。一度にテストする端末を複数選択できますが、その分、時間はかかります。また、アップロードするアプリのAPIバージョンを正しく選ばないと実行できないので、対応するAPIレベルにあった端末を選択してください。端末を選択したら、一番右下にある「テストを開始」をクリックしてください。

テスト

テストできるかどうか検証後、実際のテストに入ります。テストは終了するとメールで通知されます。

テスト結果

テストが完了すると、先ほどの画面が完了の画面切り替わり、テストした結果を確認できます。テスト実行は端末単位で行われ、リストに表示されます。

結果の詳細画面では、出力したログファイルの他、動画が撮影されており、パフォーマンスでは、動画の動きに合わせて、CPU、GPU、メモリ、ネットワークの推移を確認できます。

Jenkinsから実行する

ビルドして自分でアップロードするのでは手間がかかるので、Jenkinsを使ってテストを自動化します。Firebase Test Labは、Cloud SDKから呼び出して実行できます。

Cloud SDKをインストール

Cloud SDKのサイトより、パッケージをダウンロードしてインストールしてください。

サービスアカウントキーを作成

JenkinsからAPIを呼び出せるようにサービスアカウントキーを作成します。認証情報のサイトに移動します。

  1. 認証情報を作成をクリックし、サービスアカウントキーを選択してください。
  2. サービスアカウントは、編集者を設定してしてください。キータイプは、JSONを選択してください。
  3. 作成するとJSONがダウンロードされるので保存してください。

Cloud SDKからtest labを実行

ダウンロードしたJSONで認証できるか確認します。メールアドレスは、ダウンロードしたJSONに書かれているclient_emailの内容を入力してください。
gcloud auth activate-service-account メールアドレス --key-file JSONファイルへのパス

認証後、Cloud SDKからFirebase Test Labを呼び出します。
gcloud firebase test android run --app APKのパス --type game-loop --device-ids テスト端末

実行すると、ファイルがアップロードされ、テストが開始されます。

参考にテスト端末の一覧は、以下のコマンドより確認できます。
gcloud firebase test android models list

出力された結果のMODEL_IDを指定してください。

必要なコマンドは2つなので、設定自体は難しいことはありません。アプリのビルドと組み合わせれば、自動でテストが可能になります。

まとめ

一通りの流れを全て説明したために長くなりましたが、一度ベースを作っておけば、シナリオを増やすのは難しくありません。運用するサービスでは、テストは非常に大事な作業です。この機会に是非、Firebase Test Labでテスト環境を構築しましょう。

  1. Firebase Test Labを使うと、UIテストが実行可能
  2. シナリオをちゃんと用意し、運用する
  3. テストの工数を減らして、開発に集中できる
  4. Jenkinsを使えば自動化できる