Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

ゲームループテストを開始する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

ゲーム アプリがさまざまな UI フレームワークで構築されている場合、ゲームのテストを自動化するのは難しい場合があります。ゲーム ループ テストを使用すると、ネイティブ テストを Test Lab と統合し、選択したデバイスで簡単に実行できます。ゲーム ループ テストは、実際のプレーヤーのアクションをシミュレートしながら、ゲーム アプリを通じてテストを実行します。このガイドでは、ゲーム ループ テストを実行し、Firebase コンソールでテスト結果を表示および管理する方法について説明します。

ゲーム エンジンに応じて、単一または複数のループでテストを実装できます。ループは、ゲーム アプリでのテストの完全または部分的なランスルーです。ゲーム ループは次の目的で使用できます。

  • エンド ユーザーがプレイするのと同じ方法でゲームのレベルを実行します。ユーザーの入力をスクリプト化するか、ユーザーをアイドル状態にするか、ゲームで意味がある場合はユーザーを AI に置き換えることができます (たとえば、レース カー ゲーム アプリがあり、すでに AI が実装されているとします。 AI ドライバーにユーザーの入力を簡単に任せることができます)。
  • 最高品質の設定でゲームを実行して、デバイスがサポートしているかどうかを確認します。
  • 技術テストを実行します (複数のシェーダーをコンパイルして実行し、出力が期待どおりであることを確認するなど)。

ゲーム ループ テストは、単一のテスト デバイス、一連のテスト デバイス、または Test Lab で実行できます。ただし、物理デバイスよりもグラフィックス フレーム レートが低いため、仮想デバイスでゲーム ループ テストを実行することはお勧めしません。

あなたが始める前に

テストを実装するには、まずゲーム ループ テスト用にアプリを構成する必要があります。

  1. アプリ マニフェストで、アクティビティに新しいインテント フィルタを追加します。

    <activity android:name=".MyActivity">
       <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>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>
    

    これにより、Test Lab は特定のインテントでゲームをトリガーしてゲームを起動できます。

  2. コード ( onCreateメソッド宣言内をお勧めします) に、次を追加します。

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    Kotlin+KTX

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    これにより、アクティビティはそれを起動するインテントを確認できます。必要に応じて、後でこのコードを追加することもできます (たとえば、最初にゲーム エンジンをロードした後)。

  3. 推奨: テストの最後に、次を追加します。

    Java

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    ゲーム ループ テストが完了すると、アプリが閉じます。テストはアプリの UI フレームワークに依存して次のループを開始し、アプリを閉じるとテストが終了したことが通知されます。

ゲーム ループ テストを作成して実行する

ゲーム ループ テスト用にアプリを構成したら、すぐにテストを作成してゲーム アプリで実行できます。 Firebase コンソールまたはgcloud コマンドライン インターフェース (CLI)を使用して Test Lab でテストを実行するか、Test Loop Manager を使用してローカル デバイスでテストを実行するかを選択できます。

ローカル デバイスで実行する

Test Lab のTest Loop Managerは、Game Loop テストを統合してローカル デバイスで実行するのに役立つオープン ソース アプリです。また、品質保証チームがデバイスで同じゲーム ループを実行することもできます。

Test Loop Manager を使用してローカル デバイスでテストを実行するには:

  1. テスト ループ マネージャーを電話またはタブレットにダウンロードし、
    adb install testloopmanager.apk
    を実行してインストールします。
  2. デバイスで、携帯電話またはタブレットのTest Loop Appsアプリを開きます。アプリは、ゲーム ループで実行できるデバイス上のアプリのリストを表示します。ここにゲーム アプリが表示されない場合は、インテント フィルタが「始める前に」セクションの最初のステップで説明されているものと一致していることを確認してください。
  3. ゲーム アプリを選択し、実行するループの数を選択します。注: このステップでは、ループを 1 つだけ実行するのではなく、ループのサブセットを実行することを選択できます。一度に複数のループを実行する方法について詳しくは、オプション機能を参照してください。
  4. [テストを実行] をクリックします。テストの実行がすぐに開始されます。

テスト ラボで実行

Firebase コンソールまたはgcloud CLI を使用して、Test Lab でゲーム ループ テストを実行できます。開始する前に、まだFirebase コンソールを開いてプロジェクトを作成していない場合は、作成します。

Firebase コンソールを使用する

  1. Firebase コンソールで、左側のパネルから [ Test Lab ] をクリックします。
  2. [最初のテストを実行] (プロジェクトで以前にテストを実行したことがある場合は、[テストを実行]) をクリックします。
  3. テスト タイプとして [ゲーム ループ] を選択し、[続行] をクリックします。
  4. [参照] をクリックし、アプリの.apkファイルを参照します。注: このステップでは、ループを 1 つだけ実行するのではなく、ループのサブセットを実行することを選択できます。一度に複数のループを実行する方法について詳しくは、オプション機能を参照してください。
  5. [続行]をクリックします。
  6. アプリのテストに使用する物理デバイスを選択します。
  7. [テストの開始] をクリックします。

Firebase コンソールの使用を開始する方法の詳細については、「Firebase コンソールでテストを開始する」を参照してください。

gcloud コマンドライン (CLI) を使用する

  1. Google Cloud SDK をまだダウンロードしていない場合は、ダウンロードしてインストールします。

  2. Google アカウントを使用して gcloud CLI にログインします。

    gcloud auth login

  3. gcloud で Firebase プロジェクトを設定しますPROJECT_IDは Firebase プロジェクトの ID です。

    gcloud config set project PROJECT_ID
    
  4. 最初のテストを実行します。

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI の使用を開始する方法の詳細については、gcloud コマンドラインからテストを開始するをご覧ください。

オプション機能

Test Lab には、出力データを書き込む機能、複数のゲーム ループのサポート、関連するループのラベルなど、テストをさらにカスタマイズできるオプション機能がいくつか用意されています。

出力データの書き込み

ゲーム ループ テストは、 launchIntent.getData()メソッドで指定されたファイルに出力を書き込むことができます。テストを実行した後、Firebase コンソールの [テスト ラボ] セクションでこの出力データにアクセスできます (「ゲーム ループ テスト出力ファイルの例」を参照)。

Test Lab は、ファイルの共有 で説明されているアプリ間でファイルを共有するためのベスト プラクティスに従います。インテントが配置されているアクティビティのonCreate()メソッドで、次のコードを実行してデータ出力ファイルを確認できます。

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

ゲーム アプリの C++ 側からファイルに書き込みたい場合は、ファイル パスの代わりにファイル記述子を渡すことができます。

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
                .openAssetFileDescriptor(logFile, "w")!!
                .parcelFileDescriptor
                .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

C++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

出力ファイルの例

出力データ ファイル (以下の例のような形式) を使用して、Firebase コンソールの [テスト ラボ] セクションにゲーム ループ テストの結果を表示できます。 /.../として表示される領域には、このファイルで使用される他のフィールドの名前と競合しない限り、必要なカスタム フィールドを含めることができます。

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

複数のゲームループ

アプリで複数のゲーム ループを実行すると便利な場合があります。ループとは、ゲーム アプリを最初から最後まで完全に実行することです。たとえば、ゲームに複数のレベルがある場合、すべてのレベルを反復する 1 つのループではなく、各レベルを起動する 1 つのゲーム ループが必要になる場合があります。これにより、アプリがレベル 32 でクラッシュした場合、そのゲーム ループを直接起動してクラッシュを再現し、バグ修正をテストできます。

アプリで一度に複数のループを実行できるようにするには:

  • テスト ループ マネージャーでテストを実行している場合:

    1. 次の行をアプリのマニフェストの<application>要素内に追加します:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />
      

      この起動インテントには、ターゲット ループが整数パラメーターとして含まれています。 android:valueフィールドには、1 から 1024 までの整数を指定できます (1 回のテストで許容されるループの最大数)。ループのインデックスは 0 ではなく 1 から始まることに注意してください。

    2. テスト ループ マネージャー アプリでは、実行するループを選択できる選択画面が表示されます。複数のループを選択すると、前のループが完了した後で、各ループが順番に開始されます。

  • Firebase コンソールでテストを実行している場合は、[シナリオ]フィールドにループ番号のリストまたは範囲を入力します。

  • gcloud CLI でテストを実行している場合は、 --scenario-numbersフラグを使用してループ番号のリストを指定します。たとえば、 --scenario-numbers=1,3,5は、ループ 1、3、および 5 を実行します。

  • C++ を作成していて、ループの動作を変更したい場合は、次のエクストラをネイティブ C++ コードに渡します。

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    Kotlin+KTX

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    結果のint値に基づいて、ループの動作を変更できるようになりました。

ゲームループにラベルを付ける

ゲーム ループに 1 つまたは複数のシナリオ ラベルを付けると、QA チームは関連する一連のゲーム ループ (「すべての互換性ゲーム ループ」など) を簡単に起動して、1 つのマトリックスでテストできます。独自のラベルを作成するか、Test Lab が提供する定義済みのラベルを使用できます。

  • com.google.test.loops.player_experience : ゲームをプレイするときの実際のユーザー エクスペリエンスを再現するために使用されるループ用。これらのループを使用したテストの目的は、実際のユーザーがゲームのプレイ中に直面する問題を見つけることです。
  • com.google.test.loops.gpu_compatibility : GPU 関連の問題をテストするために使用されるループ用。これらのループを使用したテストの目的は、実稼働環境で正しく実行されない可能性がある GPU コードを実行して、ハードウェアとドライバーの問題を明らかにすることです。
  • com.google.test.loops.compatibility : for ループは、I/O の問題や OpenSSL の問題など、幅広い互換性の問題をテストするために使用されます。
  • com.google.test.loops.performance : デバイスのパフォーマンスをテストするために使用されるループ用。たとえば、ゲームを最も複雑なグラフィックス設定で実行して、新しいデバイスの動作を確認する場合があります。

アプリが同じラベルでループを実行できるようにするには:

  • テスト ループ マネージャーでテストを実行している場合:

    1. アプリのマニフェストで、次のメタデータ行を追加し、 LABEL_NAMEを任意のラベルに置き換えます。

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />
      

      android:valueフィールドでは、ラベル付けするループを表す 1 から 1024 までの範囲または一連の整数 (1 回のテストで許可されるループの最大数) を指定できます。ループのインデックスは 0 ではなく 1 から始まることに注意してください。たとえば、 android:value="1,3-5"LABEL_NAMEをループ 1、3、4、および 5 に適用します。

    2. テスト ループ マネージャー アプリで、[ラベル]フィールドに 1 つ以上のラベルを入力します。

  • Firebase コンソールでテストを実行している場合は、[ラベル]フィールドに 1 つ以上のラベルを入力します。

  • gcloud CLI でテストを実行している場合は、 --scenario-labelsフラグを使用して 1 つ以上のシナリオ ラベルを指定します (例: --scenario-labels=performance,gpu )。

アプリのライセンス サポート

Test Lab は、Google Play が提供するアプリ ライセンスサービスを使用するアプリをサポートしています。 Test Lab でアプリをテストするときにライセンスを正常に確認するには、アプリを Play ストアの運用チャネルに公開する必要があります。 Test Lab を使用してアルファまたはベータ チャネルでアプリをテストするには、アプリを Test Lab にアップロードする前にライセンス チェックを削除します。

既知の問題点

Test Lab のゲーム ループ テストには、次の既知の問題があります。

  • 一部のクラッシュはバックトレースをサポートしていません。たとえば、一部のリリース ビルドでは、 prctl(PR_SET_DUMPABLE, 0)を使用してdebuggerdプロセスの出力が抑制される場合があります。詳細については、 debuggerdを参照してください。
  • API レベル 19 は、ファイル許可エラーのため、現在サポートされていません。