如果遊戲應用程式是以不同的建構方式建構而成,要執行自動化遊戲測試並不容易 UI 架構遊戲迴圈測試可讓您將原生測試與 Test Lab,並在所選裝置上輕鬆執行。遊戲迴圈測試會執行 模擬實際玩家的動作時,請運用您的遊戲應用程式進行測試。這個 本指南說明如何執行遊戲迴圈測試,以及查看及管理測試 會產生 Firebase 控制台。
視遊戲引擎而定,您可以針對單一或多個項目實作測試。 迴圈。迴圈是指測試的完整或部分執行 開發遊戲應用程式遊戲迴圈可用於:
- 以使用者玩遊戲的方式執行遊戲關卡。你可以 用來執行使用者輸入的指令碼、讓使用者處於閒置狀態,或者 使用者 採用 AI 技術。 而且已導入 AI 技術您可以輕鬆 駕駛座 使用者輸入內容會不太一樣
- 以最高品質設定執行遊戲,查看裝置是否支援該功能。
- 執行技術測試 (編譯、執行多個著色器、檢查 輸出內容與預期結果相符,以此類推
您可以在單一測試裝置、一組測試裝置或單一測試裝置上執行遊戲迴圈測試。 在 Test Lab。不過,我們不建議在虛擬主機上執行遊戲迴圈測試 因為這類裝置的圖形影格速率低於實體裝置。
事前準備
如要實作測試,您必須先設定應用程式來進行遊戲迴圈測試。
在應用程式資訊清單中,將新的意圖篩選器新增至活動:
<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 就能以特定字詞觸發您的遊戲 意圖。
在程式碼中 (我們建議您在
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 }
這可讓活動檢查啟動該活動的意圖。你也可以 如果您想要 (例如在初次載入遊戲之後),再新增這段程式碼, 引擎)。
建議做法:在測試結束時,新增:
Kotlin+KTX
yourActivity.finish()
Java
yourActivity.finish();
遊戲迴圈測試完成後,應用程式就會關閉。這項測試仰賴 應用程式的 UI 架構來啟動下一個迴圈;關閉應用程式則代表 測試完成
建立及執行遊戲迴圈測試
設定應用程式進行遊戲迴圈測試後,您可以立即建立 並在遊戲應用程式中進行測試您可以選擇在 Test Lab (使用 Firebase 控制台或 gcloud) 指令列介面 (CLI),或在本機裝置上使用測試迴圈 管理員。
在本機裝置上執行
Test Lab 的測試迴圈管理工具是一款開放原始碼應用程式,可協助您 整合遊戲迴圈測試並在您的本機裝置上執行。這也可讓您 品質確保團隊在自家裝置上執行相同的遊戲迴圈。
如何使用測試迴圈管理員在本機裝置上執行測試:
- 下載測試迴圈管理工具
然後執行下列指令,即可進行安裝:
adb install testloopmanager.apk
- 在裝置上開啟「測試迴圈應用程式」應用程式,或是 平板電腦。這個應用程式會在裝置中顯示 可以透過遊戲迴圈執行如果這裡未顯示您的遊戲應用程式,請確認 您的意圖篩選器必須符合 「事前準備」一節。
- 請選取您的遊戲應用程式,然後選取要執行的循環次數。 注意:在這個步驟中,您可以選擇執行一部分迴圈 一個迴圈如要進一步瞭解 同時執行多個迴圈,請參閱選用功能。
- 按一下「開始測試」。您的測試會立即開始執行。
在 Test Lab 中執行
您可以使用以下程式碼,在 Test Lab 中執行遊戲迴圈測試: Firebase 控制台或 gcloud CLI。使用前 請先開啟 Firebase 控制台,然後建立專案。
使用 Firebase 控制台
- 在 Firebase 控制台中,按一下左側面板中的 Test Lab。
- 按一下「Run Your First Test」。如果您的專案 或先前執行測試)。
- 選取「遊戲迴圈」做為測試類型,然後按一下「繼續」。
- 按一下「Browse」,然後前往應用程式的
.apk
檔案。 注意:在這個步驟中,您可以選擇執行一部分迴圈 一個迴圈如要進一步瞭解 同時執行多個迴圈 選用功能。 - 按一下「繼續」。
- 選取要用來測試應用程式的實體裝置。
- 按一下「開始測試」。
如要進一步瞭解如何開始使用 Firebase 控制台,請參閱 開始透過 Firebase 控制台進行測試。
使用 gcloud 指令列 (CLI)
如果您尚未下載並安裝 Google Cloud SDK,請先下載並安裝
使用 Google 帳戶登入 gcloud CLI:
gcloud auth login
在 gcloud 中設定 Firebase 專案,其中
PROJECT_ID
是 Firebase 專案的 ID:gcloud config set project PROJECT_ID
執行第一項測試:
敬上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 關時當機,您可以直接啟動遊戲 迴圈,以重現當機並測試錯誤修正。
如要讓應用程式一次執行多個迴圈:
使用測試迴圈管理員執行測試:
在應用程式的資訊清單中,加入以下這行程式碼:
<application>
元素:<meta-data android:name="com.google.test.loops" android:value="5" />
此啟動意圖包含目標迴圈做為整數參數。於 在
android:value
欄位中,您可以指定介於 1 到 1024 之間的整數 ( 單一測試允許迴圈數量上限)。注意事項 系統會從 1 開始為迴圈建立索引,而非從 0 開始建立索引。在「測試迴圈管理員」應用程式中,系統會顯示選取畫面 可讓您選取要執行的迴圈如果選取了多個 迴圈,每個迴圈都會在前一個迴圈之後依序啟動 完成。
如果您是透過 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
:用於測試 以及裝置效能舉例來說,遊戲可能會在最複雜的 圖像設定來查看新裝置的運作方式。
如何讓應用程式以相同標籤執行迴圈:
使用測試迴圈管理員執行測試:
在應用程式資訊清單中,新增下列中繼資料行,並將 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 迴圈。在測試迴圈管理工具應用程式的「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。