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:) :

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 &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 ที่กำหนดเอง:

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

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

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

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

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

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

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

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

  4. ไม่บังคับ: หากต้องการสร้างบิลด์ที่เร็วขึ้น ให้ยกเลิกการเลือกตัวเลือก สร้างใหม่จาก Bitcode จากนั้นคลิก ถัดไป 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