您可以透過遊戲迴圈測試,編寫遊戲引擎原生的測試,然後在所選裝置上透過 Test Lab 執行。這樣一來,您就不必擔心要為不同的 UI 或測試架構編寫程式碼。遊戲迴圈測試會模擬真實玩家的動作,在 Test Lab 上執行時,可快速且可擴充地驗證遊戲是否能為使用者提供良好效能。
本頁面說明如何執行遊戲迴圈測試,以及如何在 Firebase 控制台的「Test Lab」頁面查看及管理測試結果。您也可以使用選用功能進一步自訂測試,例如編寫自訂測試結果或提早結束測試。
什麼是遊戲迴圈測試?
迴圈是指在遊戲應用程式上完整或部分執行測試。您可以在模擬器上,或在 Test Lab 的一組裝置上,在本機執行遊戲迴圈測試。遊戲迴圈測試可用於:
像一般使用者一樣玩遊戲,您可以編寫使用者輸入內容的指令碼、讓使用者處於閒置狀態,或以 AI 取代使用者 (例如,如果您在賽車遊戲中導入 AI,可以讓 AI 駕駛負責使用者輸入內容)。
以最高畫質設定執行遊戲,找出支援的裝置。
執行技術測試,例如編譯多個著色器、執行著色器,以及檢查輸出內容是否符合預期。
步驟 1:註冊 Test Lab 的自訂網址配置
首先,您必須在應用程式中註冊 Firebase Test Lab 的自訂網址配置:
在 Xcode 中選取專案目標。
按一下「Info」分頁標籤,然後新增「URL type」。
在「URL Schemes」(網址配置) 欄位中,輸入
firebase-game-loop。您也可以將自訂網址配置新增至專案的Info.plist設定檔,在<dict>標記內的任何位置註冊自訂網址配置:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string></string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>firebase-game-loop</string> </array> </dict> </array>
應用程式現已設為使用 Test Lab 執行測試。
步驟 2 (選用):設定應用程式執行多個迴圈
如果應用程式註冊了多個自訂網址配置,且您打算在測試中執行多個迴圈 (也就是情境),則必須在啟動時指定要在應用程式中執行的迴圈。
在應用程式委派中,覆寫 application(_:open:options:) 方法:
Swift
func application(_app: UIApplication,
open url: URL
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
if components.scheme == "firebase-game-loop" {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
return true
}
Objective-C
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
在測試中執行多個迴圈時,系統會將目前迴圈做為參數傳遞至用於啟動應用程式的網址。您也可以剖析用於擷取自訂網址配置的 URLComponents 物件,取得目前迴圈編號:
Swift
if components.scheme == "firebase-game-loop" {
// Iterate over all parameters and find the one with the key "scenario".
let scenarioNum = Int(components.queryItems!.first(where: { $0.name == "scenario" })!.value!)!
// ...Write logic specific to the current loop (scenarioNum).
}
Objective-C
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// Launch the app as part of a game loop.
NSURLComponents *components = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:YES];
for (NSURLQueryItem *item in [components queryItems]) {
if ([item.name isEqualToString:@"scenario"]) {
NSInteger scenarioNum = [item.value integerValue];
// ...Write logic specific to the current loop (scenarioNum).
}
}
}
步驟 3:建立並執行測試
註冊 Test Lab 的自訂網址配置後,您可以在 Firebase 控制台或使用 gcloud Beta 版 CLI 執行測試。如果尚未產生應用程式的 IPA 檔案,請先產生 (稍後需要找出該檔案)。
在 Firebase 控制台執行測試
在 Firebase 控制台中,依序前往「DevOps & Engagement」> 「Test Lab」
依序點選「執行第一項測試」>「執行 iOS 遊戲迴圈測試」。
在「Upload App」(上傳應用程式) 區段中,按一下「Browse」(瀏覽),然後選取應用程式的 IPA 檔案 (如果尚未為應用程式產生 IPA 檔案,請先完成這項操作)。
(選用) 如要一次執行多個迴圈 (又稱情境),或選取要執行的特定迴圈,請在「Scenarios」(情境) 欄位中輸入迴圈編號。
舉例來說,當您輸入
1-3, 5時,Test Lab 會執行迴圈1、2、3和5。根據預設 (如果您未在「Scenarios」欄位中輸入任何內容),Test Lab 只會執行迴圈1。在「Devices」部分,選取一或多部要測試應用程式的實體裝置,然後按一下「Start Tests」。
使用 gcloud Beta 版 CLI 執行測試
如果您尚未設定本機 gcloud SDK 環境,請先完成設定,然後務必安裝 gcloud Beta 版元件。
執行
gcloud beta firebase test ios run指令,並使用下列旗標設定執行作業:
| 遊戲迴圈測試的旗標 | |
|---|---|
--type
|
必要:指定要執行的 iOS 測試類型。您可以輸入測試類型 |
--app
|
必要:應用程式 IPA 檔案的絕對路徑 (Google Cloud Storage 或檔案系統)。這個旗標僅在執行遊戲迴圈測試時有效。 |
--scenario-numbers
|
您要在應用程式中執行的迴圈 (又稱為情境)。您可以輸入一個迴圈、迴圈清單或迴圈範圍。預設循環次數為 1。
舉例來說, |
--device-model
|
要執行測試的實體裝置 (瞭解可使用的裝置)。 |
--timeout
|
測試執行的時間長度上限。您可以輸入整數來代表時間長度 (以秒為單位),也可以輸入整數和列舉,以較長的時間單位代表時間長度。 例如:
|
舉例來說,下列指令會執行遊戲迴圈測試,在 iPhone 8 Plus 上執行迴圈 1、4、6、7 和 8:
gcloud beta firebase test ios run --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8 --device-model=iphone8plus
如要進一步瞭解 gcloud CLI,請參閱參考文件。
在本機執行測試
如要在本機執行測試,請在模擬器中載入遊戲應用程式,然後執行:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
執行
instruments -s devices指令,即可找出模擬器的 UDID。如果只有一個模擬器在執行,請輸入特殊字串
"booted"來取代 SIMULATOR_UDID。
如果測試包含多個迴圈,您可以將迴圈編號傳遞至 scenario 旗標,指定要執行的迴圈。請注意,在本機執行測試時,一次只能執行一個迴圈。舉例來說,如要執行迴圈 1、2 和 5,必須為每個迴圈分別執行指令:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
提早結束測試
根據預設,遊戲迴圈測試會持續執行,直到達到五分鐘的逾時時間,即使所有迴圈都已執行完畢也是如此。達到逾時時間後,測試就會結束,並取消所有待處理的迴圈。您可以在應用程式的 AppDelegate 中呼叫 Test Lab 的自訂網址配置 firebase-game-loop-complete,加快測試速度或提早結束測試。例如:
Swift
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
Objective-C
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
遊戲迴圈測試會終止目前的迴圈,並執行下一個迴圈。沒有要執行的迴圈時,測試就會結束。
寫入自訂測試結果
您可以設定遊戲迴圈測試,將自訂測試結果寫入裝置的檔案系統。這樣一來,測試開始執行時,Test Lab 會將結果檔案儲存在測試裝置上的 GameLoopsResults 目錄中 (您必須自行建立)。測試結束後,Test Lab 會將 GameLoopResults 目錄中的所有檔案移至專案的 bucket。設定測試時,請注意下列事項:
無論檔案類型、大小或數量為何,所有結果檔案都會上傳。
Test Lab 會等到測試中的所有迴圈都執行完畢後,才會處理測試結果。因此,如果測試包含多個寫入輸出的迴圈,請務必將這些迴圈附加至不重複的結果檔案,或為每個迴圈建立結果檔案。這樣一來,就能避免覆寫先前迴圈的結果。
如要設定測試來寫入自訂測試結果,請按照下列步驟操作:
在應用程式的
Documents目錄中,建立名為GameLoopResults的目錄。在應用程式程式碼中的任意位置 (例如應用程式委派),加入以下內容:
Swift
/// Write to a results file. func writeResults() { let text = "Greetings from game loops!" let fileName = "results.txt" let fileManager = FileManager.default do { let docs = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let resultsDir = docs.appendingPathComponent("GameLoopResults") try fileManager.createDirectory( at: resultsDir, withIntermediateDirectories: true, attributes: nil) let fileURL = resultsDir.appendingPathComponent(fileName) try text.write(to: fileURL, atomically: false, encoding: .utf8) } catch { // ...Handle error writing to file. } }Objective-C
/// Write to a results file. - (void)writeResults:(NSString *)message { // Locate and create the results directory (if it doesn't exist already). NSFileManager *manager = [NSFileManager defaultManager]; NSURL* url = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL* resultsDir = [url URLByAppendingPathComponent:@"GameLoopResults" isDirectory:YES]; [manager createDirectoryAtURL:resultsDir withIntermediateDirectories:NO attributes:nil error:nil]; // Write the result message to a text file. NSURL* resultFile = [resultsDir URLByAppendingPathComponent:@"result.txt"]; if ([manager fileExistsAtPath:[resultFile path]]) { // Append to the existing file NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:resultFile error:nil]; [handle seekToEndOfFile]; [handle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; [handle closeFile]; } else { // Create and write to the file. [message writeToURL:resultFile atomically:NO encoding:NSUTF8StringEncoding error:nil]; } }