Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

เรียกใช้การทดสอบ Game Loop

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

การทดสอบเกมโดยอัตโนมัติอาจเป็นเรื่องยากเมื่อแอปเกมสร้างขึ้นบนเฟรมเวิร์ก 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

  1. ใน Xcode เลือกเป้าหมายโครงการ

  2. คลิกแท็บ ข้อมูล จากนั้นเพิ่ม ประเภท URL ใหม่

  3. ในช่อง 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:) :

สวิฟต์

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 &lt;UIApplicationOpenURLOptionsKey, id&gt; *)options {
  if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
      // ...Enter Game Loop Test logic to override application(_:open:options:).
  }
}

เมื่อคุณรันหลายลูปในการทดสอบของคุณ ลูปปัจจุบันจะถูกส่งผ่านเป็นพารามิเตอร์ไปยัง URL ที่ใช้ในการเปิดแอป คุณยังสามารถรับหมายเลขลูปปัจจุบันได้โดยแยกวิเคราะห์วัตถุ URLComponents ที่ใช้ในการดึงรูปแบบ URL ที่กำหนดเอง:

สวิฟต์

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 จะทำงานต่อไปจนกว่าจะหมดเวลา 5 นาที แม้ว่าจะมีการเรียกใช้ลูปทั้งหมดแล้วก็ตาม เมื่อหมดเวลา การทดสอบจะสิ้นสุดลงและยกเลิกลูปที่ค้างอยู่ คุณสามารถเร่งความเร็วการทดสอบหรือสิ้นสุดการทดสอบก่อนเวลาได้ด้วยการเรียกรูปแบบ URL ที่กำหนดเองของ Test Lab firebase-game-loop-complete ใน AppDelegate ของแอป ตัวอย่างเช่น:

สวิฟต์

/// 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 จะไม่ประมวลผลผลการทดสอบของคุณจนกว่าการวนซ้ำทั้งหมดในการทดสอบของคุณจะเสร็จสิ้น ดังนั้นหากการทดสอบของคุณมีหลายลูปที่เขียนเอาต์พุต ตรวจสอบให้แน่ใจว่าคุณผนวกลูปเหล่านั้นเข้ากับไฟล์ผลลัพธ์ที่ไม่ซ้ำกันหรือสร้างไฟล์ผลลัพธ์สำหรับแต่ละลูป ด้วยวิธีนี้ คุณสามารถหลีกเลี่ยงการเขียนทับผลลัพธ์จากลูปก่อนหน้า

ในการตั้งค่าการทดสอบของคุณให้เขียนผลการทดสอบแบบกำหนดเอง:

  1. ในไดเรกทอรี Documents ของแอป ให้สร้างไดเรกทอรีชื่อ GameLoopResults

  2. จากที่ใดก็ได้ในโค้ดของแอป (เช่น ผู้มอบสิทธิ์แอปของคุณ) ให้เพิ่มสิ่งต่อไปนี้:

    สวิฟต์

    /// 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 สำหรับแอปของคุณ (คุณจะต้องค้นหาในภายหลัง)

  1. ใน Xcode เลือกโปรไฟล์การจัดเตรียมสำหรับแอปเป้าหมาย

  2. จากเมนูแบบเลื่อนลงที่ปรากฏขึ้น ให้คลิก ผลิตภัณฑ์ > เอกสารเก่า เลือกไฟล์เก็บถาวรล่าสุด จากนั้นคลิก แจกจ่ายแอพ

  3. ในหน้าต่างที่ปรากฏขึ้น ให้คลิก การพัฒนา > ถัดไป

  4. ทางเลือก: หากต้องการสร้างบิลด์ที่เร็วขึ้น ให้ยกเลิกการเลือกตัวเลือก สร้างใหม่จากบิตโค้ด แล้วคลิก ถัดไป Test Lab ไม่จำเป็นต้องทำให้แอปบางลงหรือสร้างใหม่เพื่อเรียกใช้การทดสอบ ดังนั้นคุณจึงสามารถปิดใช้งานตัวเลือกนี้ได้อย่างปลอดภัย

  5. คลิก ส่งออก จากนั้นป้อนไดเร็กทอรีที่คุณต้องการดาวน์โหลดไฟล์ 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