Catch up on everthing we announced at this year's Firebase Summit. 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 ลงทะเบียนห้องปฏิบัติการทดสอบของที่กำหนดเอง

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

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

  3. ในเขตแบบแผน 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: เลือกกำหนดค่าของแอป

เรียกใช้หลายลูป

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

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

  • ไฟล์ผลลัพธ์ทั้งหมดจะถูกอัปโหลดโดยไม่คำนึงถึงประเภทไฟล์ ขนาด หรือปริมาณ

  • Test Lab จะไม่ประมวลผลผลการทดสอบของคุณจนกว่าการวนซ้ำทั้งหมดในการทดสอบของคุณจะทำงานเสร็จ ดังนั้น หากการทดสอบของคุณมีหลายลูปที่เขียนเอาต์พุต ให้ตรวจสอบว่าคุณต่อท้ายไฟล์ผลลัพธ์ที่ไม่ซ้ำกันหรือสร้างไฟล์ผลลัพธ์สำหรับแต่ละลูป ด้วยวิธีนี้ คุณสามารถหลีกเลี่ยงการเขียนทับผลลัพธ์จากการวนซ้ำก่อนหน้าได้

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

  1. ใน app ของ 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. จากเมนูแบบเลื่อนลงที่ปรากฏคลิกสินค้า> เก็บ เลือกเก็บล่าสุดแล้วคลิกกระจาย App

  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