การทดสอบเกมอัตโนมัติอาจเป็นเรื่องยากเมื่อแอปเกมสร้างขึ้นบนเฟรมเวิร์ก UI ที่แตกต่างกัน การทดสอบ Game Loop ช่วยให้คุณสามารถรวมการทดสอบดั้งเดิมของคุณเข้ากับ Test Lab และเรียกใช้การทดสอบบนอุปกรณ์ที่คุณเลือกได้อย่างง่ายดาย คู่มือนี้อธิบายวิธีเตรียมการทดสอบ Game Loop เพื่อเรียกใช้โดยใช้ Firebase Test Lab
เกี่ยวกับการทดสอบ Game Loop
การทดสอบ Game Loop คืออะไร?
การทดสอบ Game Loop จะจำลองการกระทำของผู้เล่นจริงเพื่อยืนยันว่าเกมของคุณทำงานได้ดีสำหรับผู้ใช้ของคุณในวิธีที่รวดเร็วและปรับขนาดได้ การวนซ้ำคือการทดสอบทั้งหมดหรือบางส่วนในแอปเกมของคุณ คุณสามารถเรียกใช้การทดสอบ Game Loop ในเครื่องจำลองหรือบนชุดอุปกรณ์ใน Test Lab การทดสอบ Game Loop สามารถใช้เพื่อ:
- ดำเนินการผ่านเกมของคุณในฐานะผู้ใช้ปลายทางจะเล่น คุณสามารถเขียนสคริปต์อินพุตของผู้ใช้ ปล่อยให้ผู้ใช้อยู่นิ่ง หรือแทนที่ผู้ใช้ด้วย AI (เช่น หากคุณใช้ AI ในเกมแข่งรถ คุณสามารถกำหนดให้ไดรเวอร์ AI รับผิดชอบอินพุตของผู้ใช้) .
- เรียกใช้เกมของคุณด้วยการตั้งค่าคุณภาพสูงสุดเพื่อดูว่าอุปกรณ์ใดสามารถรองรับได้
- เรียกใช้การทดสอบทางเทคนิค เช่น การคอมไพล์เชเดอร์หลายตัว ดำเนินการ และตรวจสอบว่าเอาต์พุตเป็นไปตามที่คาดไว้
ขั้นตอนที่ 1 : ลงทะเบียนโครงร่าง URL ที่กำหนดเองของ Test Lab
ใน Xcode เลือกเป้าหมายของโครงการ
คลิกแท็บ ข้อมูล จากนั้นเพิ่ม ประเภท URL ใหม่
ในฟิลด์ URL Schemes ให้ป้อน
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 : เลือกกำหนดค่าแอปของคุณ
เรียกใช้หลายลูป
หากคุณวางแผนที่จะรันหลายลูป (หรือในสถานการณ์สมมติ) ในการทดสอบของคุณ คุณต้องระบุลูปที่คุณต้องการเรียกใช้ในแอปของคุณเมื่อถึงเวลาเปิดตัว
ในการมอบสิทธิ์แอปของคุณ ให้แทนที่เมธอด 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
}
วัตถุประสงค์-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).
}
วัตถุประสงค์-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).
}
}
}
สิ้นสุดการทดสอบก่อนเวลา
โดยค่าเริ่มต้น การทดสอบ Game Loop จะยังคงทำงานต่อไปจนกว่าจะหมดเวลาห้านาที แม้ว่าจะเรียกใช้งานลูปทั้งหมดแล้วก็ตาม เมื่อหมดเวลา การทดสอบจะสิ้นสุดลงและยกเลิกลูปที่ค้างอยู่ คุณสามารถเพิ่มความเร็วในการทดสอบหรือสิ้นสุดก่อนกำหนดได้โดยการเรียกรูปแบบ URL ที่กำหนดเองของ Test Lab 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)
}
วัตถุประสงค์-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 จะไม่ประมวลผลผลการทดสอบของคุณจนกว่าการวนซ้ำทั้งหมดในการทดสอบของคุณจะเสร็จสิ้น ดังนั้นหากการทดสอบของคุณมีหลายลูปที่เขียนเอาต์พุต ให้ตรวจสอบให้แน่ใจว่าคุณได้ผนวกรวมเข้ากับไฟล์ผลลัพธ์ที่ไม่ซ้ำกันหรือสร้างไฟล์ผลลัพธ์สำหรับแต่ละลูป ด้วยวิธีนี้ คุณสามารถหลีกเลี่ยงการเขียนทับผลลัพธ์จากการวนซ้ำก่อนหน้าได้
ในการตั้งค่าการทดสอบของคุณเพื่อเขียนผลการทดสอบที่กำหนดเอง:
ในไดเร็กทอรี
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. } }
วัตถุประสงค์-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]; } }
ขั้นตอนที่ 3 : แพ็กเกจแอปของคุณเพื่ออัปโหลด
สุดท้าย สร้างไฟล์ IPA สำหรับแอปของคุณ (คุณจะต้องค้นหาในภายหลัง)
ใน Xcode เลือกโปรไฟล์การจัดเตรียมสำหรับแอปเป้าหมาย
จากเมนูแบบเลื่อนลงที่ปรากฏขึ้น ให้คลิก ผลิตภัณฑ์ > เก็บถาวร เลือกไฟล์เก็บถาวรล่าสุด จากนั้นคลิก แจกจ่ายแอป
ในหน้าต่างที่ปรากฏขึ้น ให้คลิก การพัฒนา > ถัดไป
ไม่บังคับ: หากต้องการสร้างบิลด์ที่เร็วขึ้น ให้ยกเลิกการเลือกตัวเลือก สร้างใหม่จาก Bitcode จากนั้นคลิก ถัดไป Test Lab ไม่จำเป็นต้องทำให้แอปบางหรือสร้างใหม่เพื่อเรียกใช้การทดสอบ คุณจึงสามารถปิดใช้งานตัวเลือกนี้ได้อย่างปลอดภัย
คลิก ส่งออก จากนั้นป้อนไดเรกทอรีที่คุณต้องการดาวน์โหลดไฟล์ IPA ของแอป
ขั้นตอนที่ 4 : เรียกใช้การทดสอบในเครื่อง
คุณสามารถเรียกใช้การทดสอบในเครื่องเพื่อตรวจสอบพฤติกรรมก่อนที่จะเรียกใช้ด้วย Test Lab หากต้องการทดสอบในเครื่อง ให้โหลดแอปเกมในเครื่องจำลองและเรียกใช้:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
คุณสามารถค้นหา UDID ของเครื่องจำลองได้ด้วยการรันคำสั่ง
instruments -s devices
หากมีเพียงหนึ่งโปรแกรมจำลองที่ทำงานอยู่ ให้ป้อนสตริงพิเศษ
"booted"
แทน SIMULATOR_UDID
หากการทดสอบของคุณมีหลายลูป คุณสามารถระบุได้ว่าต้องการเรียกใช้ลูปใดโดยส่งหมายเลขลูปไปที่แฟล็ก scenario
โปรดทราบว่าคุณสามารถรันได้ครั้งละหนึ่งลูปเท่านั้นเมื่อรันการทดสอบในเครื่อง ตัวอย่างเช่น หากคุณต้องการรันลูป 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
ขั้นตอนต่อไป
ทำการทดสอบโดยใช้ คอนโซล Firebase หรือ gcloud CLI