การทดสอบ Game Loop ช่วยให้คุณเขียนการทดสอบที่อยู่ในเอนจินเกมโดยเฉพาะ แล้วเรียกใช้ การทดสอบเหล่านั้นใน Test Lab บนอุปกรณ์ที่คุณเลือกได้ ด้วยวิธีนี้ คุณจึงไม่ต้องกังวล เกี่ยวกับการเขียนสำหรับ UI หรือเฟรมเวิร์กการทดสอบที่แตกต่างกัน การทดสอบ Game Loop จำลองการกระทำของผู้เล่นจริง และเมื่อคุณเรียกใช้ใน Test Lab ระบบจะ มอบวิธีที่รวดเร็วและปรับขนาดได้เพื่อยืนยันว่าเกมทำงานได้ดี สำหรับผู้ใช้
หน้านี้จะแสดงวิธีเรียกใช้การทดสอบ Game Loop จากนั้นดูและจัดการผลการทดสอบในหน้า Test Lab ของคอนโซล Firebase นอกจากนี้ คุณยังปรับแต่งการทดสอบเพิ่มเติมได้ด้วยฟีเจอร์ที่ไม่บังคับ เช่น การเขียนผลการทดสอบที่กำหนดเอง หรือการสิ้นสุดการทดสอบก่อนกำหนด
การทดสอบ Game Loop คืออะไร
ลูปคือการทดสอบแอปเกมของคุณแบบเต็มหรือบางส่วน คุณสามารถ เรียกใช้การทดสอบ Game Loop ในเครื่องบนโปรแกรมจำลองหรือในชุดอุปกรณ์ใน Test Lab คุณใช้การทดสอบ Game Loop เพื่อทำสิ่งต่อไปนี้ได้
เล่นเกมของคุณเหมือนกับที่ผู้ใช้ปลายทางเล่น คุณสามารถ เขียนสคริปต์อินพุตของผู้ใช้ ปล่อยให้ผู้ใช้ไม่ได้ใช้งาน หรือแทนที่ผู้ใช้ ด้วย AI (เช่น หากคุณใช้ AI ในเกมแข่งรถ คุณสามารถให้คนขับที่เป็น AI รับผิดชอบอินพุตของผู้ใช้ได้)
เรียกใช้เกมในการตั้งค่าคุณภาพสูงสุดเพื่อดูว่าอุปกรณ์ใดบ้างที่รองรับ
ทำการทดสอบทางเทคนิค เช่น การคอมไพล์เชดเดอร์หลายรายการ การเรียกใช้เชดเดอร์เหล่านั้น และการตรวจสอบว่าเอาต์พุตเป็นไปตามที่คาดไว้
ขั้นตอนที่ 1: ลงทะเบียน URL Scheme ที่กำหนดเองของ Test Lab
ก่อนอื่น คุณต้องลงทะเบียนรูปแบบ URL ที่กำหนดเองของ Firebase Test Lab ในแอป
ใน Xcode ให้เลือกเป้าหมายของโปรเจ็กต์
คลิกแท็บข้อมูล แล้วเพิ่มประเภท URL ใหม่
ในช่องรูปแบบ URL ให้ป้อน
firebase-game-loop
คุณยังลงทะเบียนชุดรูปแบบ URL ที่กำหนดเองได้โดยเพิ่มลงใน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 (ไม่บังคับ): กำหนดค่าแอปให้เล่นหลายลูป
หากแอปมีการลงทะเบียนชุดรูปแบบ URL ที่กำหนดเองหลายรายการและคุณวางแผนที่จะเรียกใช้ลูปหลายรายการ (หรือที่เรียกว่าสถานการณ์) ในการทดสอบ คุณต้องระบุลูปที่ต้องการเรียกใช้ในแอปเมื่อเปิดตัว
ในตัวแทนแอป ให้ลบล้างเมธอด 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:).
}
}
เมื่อเรียกใช้ลูปหลายรายการในการทดสอบ ระบบจะส่งลูปปัจจุบันเป็นพารามิเตอร์ไปยัง URL ที่ใช้เปิดแอป นอกจากนี้ คุณยังรับหมายเลขลูปปัจจุบันได้โดยการแยกวิเคราะห์ออบเจ็กต์ URLComponents
ที่ใช้ดึงข้อมูลรูปแบบ URL ที่กำหนดเอง
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: สร้างและเรียกใช้การทดสอบ
หลังจากลงทะเบียนรูปแบบ URL ที่กำหนดเองของ Test Lab แล้ว คุณจะเรียกใช้การทดสอบได้ในFirebase คอนโซลหรือใช้ gcloud beta CLI หากยังไม่ได้ดำเนินการ ให้สร้างไฟล์ IPA สำหรับแอป (คุณจะต้อง ค้นหาไฟล์นี้ในภายหลัง)
ทำการทดสอบในFirebase Console
เปิดคอนโซล Firebase แล้วสร้างโปรเจ็กต์ หากยังไม่ได้สร้าง
ในหน้า Test Lab ของคอนโซล Firebase ให้คลิกเรียกใช้การทดสอบแรก > เรียกใช้ Game Loop ของ iOS
ในส่วนอัปโหลดแอป ให้คลิกเรียกดู แล้วเลือกไฟล์ IPA ของแอป (หากยังไม่ได้ดำเนินการ ให้สร้างไฟล์ IPA สำหรับแอป)
ไม่บังคับ: หากต้องการเรียกใช้หลายลูป (หรือที่เรียกว่าสถานการณ์) พร้อมกัน หรือ เลือกลูปที่ต้องการเรียกใช้ ให้ป้อนหมายเลขลูปในช่องสถานการณ์
เช่น เมื่อป้อน "1-3, 5" Test Lab จะเล่นลูป 1, 2, 3 และ 5 โดยค่าเริ่มต้น (หากคุณไม่ได้ป้อนข้อมูลใดๆ ในช่องสถานการณ์) Test Lab จะเรียกใช้เฉพาะลูป 1
ในส่วนอุปกรณ์ ให้เลือกอุปกรณ์จริงอย่างน้อย 1 เครื่องที่ต้องการ ทดสอบแอป แล้วคลิกเริ่มการทดสอบ
ทำการทดสอบด้วย gcloud beta CLI
หากยังไม่ได้ดำเนินการ ให้กำหนดค่าสภาพแวดล้อม gcloud SDK ในเครื่อง จากนั้นตรวจสอบว่าได้ติดตั้งคอมโพเนนต์ gcloud เบต้าแล้ว
เรียกใช้คำสั่ง
gcloud beta firebase test ios run
และใช้แฟล็กต่อไปนี้ เพื่อกำหนดค่าการเรียกใช้
Flag สำหรับการทดสอบ Game Loop | |
---|---|
--type
|
ต้องระบุ: ระบุประเภทการทดสอบ iOS ที่คุณต้องการเรียกใช้ คุณสามารถป้อน
ประเภทการทดสอบ |
--app
|
ต้องระบุ: เส้นทางแบบสัมบูรณ์ (Google Cloud Storage หรือ ระบบไฟล์) ไปยังไฟล์ IPA ของแอป แฟล็กนี้จะใช้ได้เมื่อ ทำการทดสอบ Game Loop เท่านั้น |
--scenario-numbers
|
ลูป (หรือที่เรียกว่าสถานการณ์) ที่คุณต้องการเรียกใช้ในแอป คุณป้อนลูปเดียว รายการลูป หรือช่วงของลูปได้ การวนซ้ำเริ่มต้นคือ 1
เช่น |
--device-model
|
อุปกรณ์จริงที่คุณต้องการใช้ทดสอบ (ดูอุปกรณ์ที่พร้อมใช้งาน ที่คุณใช้ได้) |
--timeout
|
ระยะเวลาสูงสุดที่คุณต้องการให้การทดสอบทำงาน คุณสามารถป้อนจำนวนเต็มเพื่อ แสดงระยะเวลาเป็นวินาที หรือป้อนจำนวนเต็มและการแจงนับเพื่อแสดง ระยะเวลาเป็นหน่วยเวลาที่ยาวขึ้น เช่น
|
เช่น คำสั่งต่อไปนี้จะเรียกใช้การทดสอบ Game Loop ที่เรียกใช้ลูป 1, 4, 6, 7 และ 8 ใน iPhone 8 Plus
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://
คุณดู UDID ของโปรแกรมจำลองได้โดยเรียกใช้คำสั่ง
instruments -s devices
หากมีโปรแกรมจำลองที่ทำงานอยู่เพียงโปรแกรมเดียว ให้ป้อนสตริงพิเศษ
"booted"
แทน SIMULATOR_UDID
หากการทดสอบมีลูปหลายรายการ คุณสามารถระบุลูปที่ต้องการเรียกใช้ได้
โดยส่งหมายเลขลูปไปยังแฟล็ก scenario
โปรดทราบว่าคุณจะเรียกใช้ลูปได้เพียงครั้งละ 1 รายการเมื่อทำการทดสอบในเครื่อง เช่น หากต้องการเรียกใช้ลูป 1, 2 และ 5 คุณต้องเรียกใช้คำสั่งแยกกันสำหรับแต่ละลูป
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
สิ้นสุดการทดสอบก่อนกำหนด
โดยค่าเริ่มต้น การทดสอบ Game Loop จะทำงานต่อไปจนกว่าจะถึงการหมดเวลา
5 นาที แม้ว่าจะมีการดำเนินการลูปทั้งหมดแล้วก็ตาม เมื่อถึง
timeout การทดสอบจะสิ้นสุดลงและยกเลิกการวนซ้ำที่รอดำเนินการ คุณสามารถเร่ง
การทดสอบหรือสิ้นสุดการทดสอบก่อนเวลาได้โดยเรียกใช้Test Labรูปแบบ URL ที่กำหนดเองของfirebase-game-loop-complete
ใน AppDelegate ของแอป เช่น
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) {}];
}
การทดสอบ Game Loop จะสิ้นสุดลูปปัจจุบันและดำเนินการลูปถัดไป เมื่อไม่มีลูปให้เรียกใช้อีกต่อไป การทดสอบจะสิ้นสุดลง
เขียนผลการทดสอบที่กำหนดเอง
คุณสามารถกำหนดค่าการทดสอบ Game Loop เพื่อเขียนผลการทดสอบที่กำหนดเองลงในระบบไฟล์ของอุปกรณ์ได้ ด้วยวิธีนี้ เมื่อการทดสอบเริ่มทำงาน Test Lab
จะจัดเก็บไฟล์ผลลัพธ์ไว้ในไดเรกทอรี GameLoopsResults
ในอุปกรณ์ทดสอบ (ซึ่งคุณต้องสร้างเอง) เมื่อการทดสอบสิ้นสุดลง Test Lab จะย้าย
ไฟล์ทั้งหมดจากไดเรกทอรี GameLoopResults
ไปยังที่เก็บข้อมูลของโปรเจ็กต์ โปรดคำนึงถึงสิ่งต่อไปนี้เมื่อตั้งค่าการทดสอบ
ระบบจะอัปโหลดไฟล์ผลลัพธ์ทั้งหมดโดยไม่คำนึงถึงประเภท ขนาด หรือจำนวนไฟล์
Test Lab จะไม่ประมวลผลผลการทดสอบจนกว่าลูปทั้งหมดในการทดสอบจะทำงานเสร็จสิ้น ดังนั้นหากการทดสอบมีหลายลูปที่เขียนเอาต์พุต โปรดตรวจสอบว่าคุณได้ผนวกเอาต์พุตเหล่านั้นลงในไฟล์ผลลัพธ์ที่ไม่ซ้ำกัน หรือสร้างไฟล์ผลลัพธ์สำหรับแต่ละลูป วิธีนี้จะช่วยให้คุณหลีกเลี่ยงการเขียนทับผลลัพธ์จากลูปก่อนหน้าได้
วิธีตั้งค่าการทดสอบเพื่อเขียนผลการทดสอบที่กำหนดเอง
สร้างไดเรกทอรีชื่อ
GameLoopResults
ในไดเรกทอรีDocuments
ของแอปจากที่ใดก็ได้ในโค้ดของแอป (เช่น ตัวแทนแอป) ให้เพิ่มข้อมูลต่อไปนี้
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]; } }