開始使用遊戲迴圈測試

如果遊戲應用程式是以不同的建構方式建構而成,要執行自動化遊戲測試並不容易 UI 架構遊戲迴圈測試可讓您將原生測試與 Test Lab,輕鬆在您選擇的裝置上執行。遊戲迴圈測試會執行 模擬實際玩家的動作時,請運用您的遊戲應用程式進行測試。這個 本指南說明如何執行遊戲迴圈測試,以及查看及管理測試 Firebase 控制台中會顯示結果。

視遊戲引擎而定,您可以針對單一或多個項目實作測試。 迴圈。迴圈是指測試的完整或部分執行 開發遊戲應用程式遊戲迴圈可用於:

  • 以使用者玩遊戲的方式執行遊戲關卡。你可以 用來執行使用者輸入的指令碼、讓使用者處於閒置狀態,或者 使用者 採用 AI 技術。 而且已導入 AI 技術您可以輕鬆 駕駛座 使用者輸入內容會不太一樣
  • 以最高品質設定執行遊戲,查看裝置是否支援該功能。
  • 執行技術測試 (編譯、執行多個著色器、檢查 輸出與預期結果相符,以此類推

您可以在單一測試裝置、一組測試裝置或單一測試裝置上執行遊戲迴圈測試。 。不過,我們不建議在虛擬主機上執行遊戲迴圈測試 因為這類裝置的圖形影格速率低於實體裝置。

事前準備

如要實作測試,您必須先設定應用程式來進行遊戲迴圈測試。

  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 方法宣告中加入) 包括:

    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
    }

    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
    }

    這可讓活動檢查啟動該活動的意圖。你也可以 如果您想要 (例如在初次載入遊戲之後),再新增這段程式碼, 引擎)。

  3. 建議做法:在測試結束時,新增:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    遊戲迴圈測試完成後,應用程式就會關閉。這項測試仰賴 應用程式的 UI 架構來啟動下一個迴圈;關閉應用程式則代表 測試完成

建立及執行遊戲迴圈測試

設定應用程式進行遊戲迴圈測試後,您可以立即建立 並在遊戲應用程式中進行測試您可以選擇在 使用 Firebase 控制台gcloud 指令列介面 (CLI),或本機裝置上採用測試迴圈 經理

在本機裝置上執行

Test Lab 的 Test Loop Manager 是一款開放原始碼應用程式,可協助您 整合遊戲迴圈測試並在您的本機裝置上執行。這也可讓您 品質確保團隊在自家裝置上執行相同的遊戲迴圈。

如何使用測試迴圈管理員在本機裝置上執行測試:

  1. 下載測試迴圈管理工具 然後執行下列指令,即可進行安裝:
    adb install testloopmanager.apk
  2. 在裝置上開啟「測試迴圈應用程式」應用程式,或是 平板電腦。這個應用程式會在裝置中顯示 可以透過遊戲迴圈執行如果這裡未顯示您的遊戲應用程式,請確認 您的意圖篩選器必須符合 「事前準備」一節
  3. 請選取您的遊戲應用程式,然後選取要執行的循環次數。 注意:在這個步驟中,您可以選擇執行一部分迴圈 一個迴圈如要進一步瞭解 同時執行多個迴圈,請參閱選用功能
  4. 按一下「開始測試」。您的測試會立即開始執行。

在 Test Lab 中執行

您可以在 Test Lab 中,使用 Firebase 控制台gcloud CLI。使用前 請先開啟 Firebase 主控台,並建立專案。

使用 Firebase 控制台

  1. 在 Firebase 控制台中,點選左側面板中的「Test Lab」
  2. 按一下「Run Your First Test」。如果您的專案 或先前執行測試)。
  3. 選取「遊戲迴圈」做為測試類型,然後按一下「繼續」
  4. 按一下「Browse」,然後前往應用程式的 .apk 檔案。 注意:在這個步驟中,您可以選擇執行一部分迴圈 一個迴圈如要進一步瞭解 同時執行多個迴圈 選用功能
  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」部分輸出資料 (請參閱 遊戲迴圈測試輸出檔案範例)。

Test Lab 會遵循最佳做法,在以下所述應用程式之間共用檔案: 分享檔案。 在活動的 onCreate() 方法中,意圖的位置如下 可以執行下列程式碼來檢查資料輸出檔案:

Kotlin+KTX

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

Java

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

如要從遊戲應用程式的 C++ 端寫入檔案,您可以 傳入檔案描述元而非檔案路徑:

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);

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);

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 控制台的「Test Lab」部分。 顯示為 /.../ 的區域可包含您需要的任何自訂欄位,前提是 這些項目不會與這個檔案中使用的其他欄位名稱相衝突:

{
  "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
}

多個遊戲迴圈

您可能發現,在應用程式中執行多個遊戲迴圈,是相當實用的做法。迴圈是一種 您的遊戲應用程式 從頭到尾完成整個間隔舉例來說,如果您在 遊戲中有多個關卡時, 而是啟動每個關卡,而不是只使用一個迴圈逐一執行。 這樣一來,如果您的應用程式在第 32 關時當機,您可以直接啟動遊戲 迴圈,以重現當機並測試錯誤修正。

如要讓應用程式一次執行多個迴圈:

  • 使用測試迴圈管理員執行測試:

    1. 在應用程式的資訊清單中,加入以下這行程式碼: <application> 元素:

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

      此啟動意圖包含目標迴圈做為整數參數。於 在 android:value 欄位中,您可以指定介於 1 到 1024 之間的整數 ( 單一測試允許迴圈數量上限)。注意事項 系統會從 1 開始為迴圈建立索引,而非從 0 開始建立索引。

    2. 在「測試迴圈管理員」應用程式中,系統會顯示選取畫面 可讓您選取要執行的迴圈如果選取了多個 迴圈,每個迴圈都會在前一個迴圈之後依序啟動 完成。

  • 如果您是透過 Firebase 控制台執行測試,請輸入清單或 「Scenario」欄位中的循環編號範圍。

  • 如要使用 gcloud CLI 執行測試,請指定迴圈編號清單 透過 --scenario-numbers 旗標來回應。例如: --scenario-numbers=1,3,5 會執行迴圈 1、3 和 5。

  • 如果您正在編寫 C++,且想要變更迴圈行為,請將 額外加入以下程式碼:

    Kotlin+KTX

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

    Java

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

    您現在可以根據產生的 int 變更迴圈的行為 值。

為遊戲迴圈加上標籤

為遊戲迴圈加上一或多個情境標籤時,您和品質確保 團隊可以輕鬆啟動一系列相關的遊戲迴圈 (例如「所有相容性」 遊戲迴圈),並在單一矩陣中測試這些迴圈。您可以建立自己的標籤,也可以 請使用 Test Lab 提供的預先定義標籤:

  • com.google.test.loops.player_experience:供迴圈用途的 For 迴圈 在玩遊戲時重現使用者的實際體驗。目標 使用這些迴圈進行測試,是找出使用者實際遇到的問題 遊戲玩家。
  • com.google.test.loops.gpu_compatibility:用於測試的針對迴圈 GPU 相關問題。測試使用這些迴圈的目的是要執行 GPU 可能無法在正式環境中正確執行 以便找出 硬體和驅動程式
  • com.google.test.loops.compatibility:用於測試 多種相容性問題,包括 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。舉例來說,android:value="1,3-5" 就會套用 LABEL_NAME 讓迴圈 1、3、4 和 5 迴圈。

    2. 在測試迴圈管理工具應用程式的「Labels」(標籤) 中輸入一或多個標籤 ] 欄位。

  • 如果是透過 Firebase 控制台執行測試,請輸入一或多項測試 在「標籤」欄位中設定標籤

  • 如果您要使用 gcloud CLI 執行測試,請指定 一或多個情境標籤 --scenario-labels 旗標 (例如 --scenario-labels=performance,gpu).

應用程式授權支援

Test Lab 支援 應用程式授權 使用 Google Play 提供的多種服務為了在測試時成功檢查授權 使用 Test Lab 建立應用程式,您必須將應用程式發布至正式版群組 或是前往 Play 商店購買如要使用 Alpha 版或 Beta 版測試應用程式 Test Lab,請先移除授權檢查,再將應用程式上傳至 Test Lab。

已知問題

Test Lab 中的遊戲迴圈測試有下列已知問題:

  • 部分當機事件不支援返回追蹤。舉例來說,某些發布子版本 使用以下程式碼隱藏 debuggerd 程序的輸出內容 prctl(PR_SET_DUMPABLE, 0)。詳情請參閱: debuggerd.
  • 由於檔案權限錯誤,目前不支援 API 級別 19。