Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

遊戲循環測試入門

當遊戲應用程序構建在不同的UI框架上時,很難自動執行遊戲測試。通過Game Loop測試,您可以將本機測試與Test Lab集成在一起,並輕鬆地在您選擇的設備上運行它們。遊戲循環測試通過模擬真實玩家的動作,通過您的遊戲應用程序運行測試。本指南說明如何運行Game Loop測試,然後在Firebase控制台中查看和管理測試結果。

根據您的遊戲引擎,您可以使用單個或多個循環來實現測試。循環是在遊戲應用程序上測試的全部或部分測試。遊戲循環可用於:

  • 以最終用戶玩遊戲的方式運行遊戲級別。您可以編寫用戶輸入的腳本,讓用戶閒置,或者在遊戲中有意義的情況下用AI替換用戶(例如,假設您有一個賽車遊戲應用程序並且已經實現了AI。輕鬆地讓AI驅動程序負責用戶的輸入)。
  • 以最高質量設置運行遊戲,以查看設備是否支持該遊戲。
  • 運行技術測試(編譯多個著色器,執行它們,檢查輸出是否符合預期,等等)。

您可以在單個測試設備,一組測試設備或測試實驗室上運行遊戲循環測試。但是,我們不建議在虛擬設備上運行遊戲循環測試,因為它們的圖形幀速率低於物理設備。

在你開始之前

要實施測試,您必須首先為Game Loop測試配置您的應用。

  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方法聲明內),添加以下內容:

    爪哇

    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. 推薦:在測試結束時,添加:

    爪哇

    yourActivity.finish();

    Kotlin + KTX

    yourActivity.finish()

    遊戲循環測試完成後,這將關閉您的應用程序。該測試依賴於應用程序的UI框架來啟動下一個循環,而關閉應用程序則表明該測試已完成。

創建並運行遊戲循環測試

在為Game Loop測試配置應用程序之後,您可以立即創建測試並在遊戲應用程序中運行它。您可以選擇使用Firebase控制台gcloud命令行界面(CLI)在“測試實驗室”中運行測試,也可以選擇使用“測試循環管理器”本地設備上運行測試

在本地設備上運行

Test Lab的Test Loop Manager是一個開源應用程序,可幫助您集成Game Loop測試並在本地設備上運行它們。它還允許您的質量保證團隊在其設備上運行相同的遊戲循環。

要使用“測試循環管理器”在本地設備上運行測試,請執行以下操作:

  1. Test Loop Manager下載到手機或平板電腦上,並通過運行
    adb install testloopmanager.apk
    進行安裝
  2. 在您的設備上,打開手機或平板電腦上的Test Loop Apps應用。該應用程序顯示可以在遊戲循環中運行的設備上的應用程序列表。如果您在此處看不到您的遊戲應用程序,請確保您的意圖過濾器與“ 開始之前”部分第一步中所述的過濾器匹配。
  3. 選擇您的遊戲應用程序,然後選擇要運行的循環數。注意:在此步驟中,您可以選擇運行循環的一個子集,而不僅僅是一個循環。有關一次運行多個循環的更多信息,請參閱可選功能。
  4. 點擊運行測試 。您的測試將立即開始運行。

在測試實驗室中運行

您可以使用Firebase控制台gcloud CLI在測試實驗室中運行遊戲循環測試在開始之前,如果尚未開始,請打開Firebase控制台並創建一個項目。

使用Firebase控制台

  1. 在Firebase控制台中,單擊左側面板上的“ 測試實驗室 ”。
  2. 點擊運行第一個測試 (或運行一個測試 ,如果你的項目以前運行測試)。
  3. 選擇“ 遊戲循環”作為測試類型,然後單擊“ 繼續”
  4. 單擊瀏覽 ,然後瀏覽到應用程序的.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命令行開始測試。

可選功能

測試實驗室提供了幾個可選功能,可讓您進一步自定義測試,包括寫入輸出數據的能力,對多個遊戲循環的支持以及相關循環的標籤。

寫入輸出數據

您的遊戲循環測試可以將輸出寫入到launchIntent.getData()方法中指定的文件中。運行測試後,您可以在Firebase控制台的“ 測試實驗室”部分中訪問此輸出數據(請參閱Game Loop測試輸出文件示例 )。

測試實驗室遵循共享中所描述的應用程序之間的文件最佳實踐共享文件 。在活動的意圖所在的onCreate()方法中,可以通過運行以下代碼來檢查數據輸出文件:

爪哇

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

Kotlin + KTX

83

如果要從遊戲應用程序的C ++端寫入文件,則可以傳入文件描述符而不是文件路徑:

爪哇

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
}

多個遊戲循環

您可能會發現在您的應用中運行多個遊戲循環很有用。循環是您遊戲應用程序從頭到尾的完整過程。例如,如果您的遊戲中有多個關卡,則可能需要一個遊戲循環來啟動每個關卡,而不是一個循環遍歷所有關卡的循環。這樣,如果您的應用在第32級崩潰,則可以直接啟動遊戲循環以重現崩潰並測試錯誤修復。

要使您的應用程序一次運行多個循環,請執行以下操作:

  • 如果您正在使用“測試循環管理器”運行測試:

    1. <application>元素內,將以下行添加到應用的清單中:

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

      該啟動意圖包含目標循環作為整數參數。在android:value字段中,您可以指定1到1024之間的整數(單個測試允許的最大循環數)。請注意,循環的索引從1開始,而不是0。

    2. 在“測試循環管理器”應用程序中,將顯示一個選擇屏幕,使您可以選擇要運行的循環。如果選擇多個循環,則在前一個循環完成後,將依次啟動每個循環。

  • 如果您正在使用Firebase控制台運行測試,請在“ 方案”字段中輸入列表或循環編號範圍。

  • 如果您正在使用gcloud CLI運行測試,請使用--scenario-numbers標誌指定循環編號列表。例如,-- --scenario-numbers=1,3,5運行循環1、3和5。

  • 如果您正在編寫C ++,並且想要更改循環的行為,請將以下內容傳遞給本機C ++代碼:

    爪哇

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

    Kotlin + KTX

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

    現在,您可以根據生成的int值更改循環的行為。

標籤遊戲循環

當用一個或多個場景標籤標記遊戲循環時,您和您的質量檢查團隊可以輕鬆啟動一組相關的遊戲循環(例如,“所有兼容性遊戲循環”),並在一個矩陣中對其進行測試。您可以創建自己的標籤,也可以使用測試實驗室提供的預定義標籤:

  • com.google.test.loops.player_experience :用於在玩遊戲時重現真實用戶體驗的循環。使用這些循環進行測試的目的是發現真實用戶在玩遊戲時會遇到的問題。
  • 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應用於循環android:value="1,3-5"和5。

    2. 在“測試循環管理器”應用中,在“ 標籤”字段中輸入一個或多個標籤。

  • 如果您正在使用Firebase控制台運行測試,請在“ 標籤”字段中輸入一個或多個標籤。

  • 如果您正在使用gcloud CLI運行測試,請使用--scenario-labels標誌(例如--scenario-labels=performance,gpu )指定一個或多個場景標籤。

應用許可支持

測試實驗室支持使用Google Play提供的應用許可服務的應用 。要在通過測試實驗室測試應用程序時成功檢查許可,您必須將應用程序發佈到Play商店中的生產渠道。要使用測試實驗室在Alpha或Beta通道中測試您的應用,請先刪除許可檢查,然後再將您的應用上傳到測試實驗室。

已知的問題

測試實驗室中的遊戲循環測試存在以下已知問題:

  • 有些崩潰不支持回溯。例如,某些發行版本可能會使用prctl(PR_SET_DUMPABLE, 0)抑制debuggerd程序的輸出。要了解更多信息,請參見debuggerd
  • 由於文件權限錯誤,目前不支持API級別19。