Bắt đầu với thử nghiệm Game Loop dành cho iOS

Với các bài kiểm tra Vòng lặp trò chơi, bạn có thể viết các bài kiểm tra dành riêng cho công cụ trò chơi của mình rồi chạy chúng trong Test Lab trên các thiết bị bạn chọn. Bằng cách này, bạn không cần phải lo lắng về việc viết cho các khung thử nghiệm hoặc giao diện người dùng khác nhau. Thử nghiệm Vòng lặp trò chơi mô phỏng hành động của người chơi thực và khi bạn chạy nó trên Test Lab, nó sẽ cung cấp một cách nhanh chóng và có thể mở rộng để xác minh rằng trò chơi của bạn hoạt động tốt cho người dùng.

Trang này hướng dẫn bạn cách chạy thử nghiệm Vòng lặp trò chơi, sau đó xem và quản lý kết quả thử nghiệm của bạn trong trang Phòng thử nghiệm của bảng điều khiển Firebase. Bạn cũng có thể tùy chỉnh thêm các bài kiểm tra của mình bằng các tính năng tùy chọn, chẳng hạn như viết kết quả kiểm tra tùy chỉnh hoặc kết thúc bài kiểm tra sớm .

Kiểm tra vòng lặp trò chơi là gì?

Vòng lặp là quá trình chạy thử toàn bộ hoặc một phần trên ứng dụng trò chơi của bạn. Bạn có thể chạy thử nghiệm Vòng lặp trò chơi cục bộ trên trình mô phỏng hoặc trên một bộ thiết bị trong Test Lab. Kiểm tra vòng lặp trò chơi có thể được sử dụng để:

  • Chạy qua trò chơi của bạn với tư cách là người dùng cuối sẽ chơi trò chơi đó. Bạn có thể tạo kịch bản cho thông tin đầu vào của người dùng, để người dùng ở chế độ rảnh hoặc thay thế người dùng bằng AI (ví dụ: nếu bạn đã triển khai AI trong trò chơi đua xe ô tô, bạn có thể đặt trình điều khiển AI phụ trách đầu vào của người dùng) .

  • Chạy trò chơi của bạn ở cài đặt chất lượng cao nhất để tìm hiểu xem thiết bị nào có thể hỗ trợ trò chơi đó.

  • Chạy thử nghiệm kỹ thuật, chẳng hạn như biên dịch nhiều trình đổ bóng, thực thi chúng và kiểm tra xem kết quả đầu ra có như mong đợi hay không.

Bước 1: Đăng ký lược đồ URL tùy chỉnh của Test Lab

Trước tiên, bạn phải đăng ký lược đồ URL tùy chỉnh của Phòng thí nghiệm kiểm tra Firebase trong ứng dụng của mình:

  1. Trong Xcode, chọn mục tiêu dự án.

  2. Nhấp vào tab Thông tin , sau đó thêm loại URL mới .

  3. Trong trường Lược đồ URL , nhập firebase-game-loop . Bạn cũng có thể đăng ký lược đồ URL tùy chỉnh bằng cách thêm lược đồ này vào tệp cấu hình Info.plist của dự án ở bất kỳ đâu trong thẻ <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>
    

Ứng dụng của bạn hiện đã được định cấu hình để chạy thử nghiệm bằng Test Lab.

Bước 2 (tùy chọn): Định cấu hình ứng dụng của bạn để chạy nhiều vòng lặp

Nếu ứng dụng của bạn có nhiều lược đồ URL tùy chỉnh được đăng ký và bạn dự định chạy nhiều vòng lặp (hay còn gọi là kịch bản) trong thử nghiệm của mình, bạn phải chỉ định vòng lặp nào bạn muốn chạy trong ứng dụng của mình tại thời điểm khởi chạy.

Trong ứng dụng ủy quyền của bạn, hãy ghi đè phương thức application(_:open:options:) :

Nhanh

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
}

Mục tiêu-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:).
  }
}

Khi bạn chạy nhiều vòng lặp trong thử nghiệm của mình, vòng lặp hiện tại sẽ được chuyển dưới dạng tham số cho URL dùng để khởi chạy ứng dụng. Bạn cũng có thể lấy số vòng lặp hiện tại bằng cách phân tích cú pháp đối tượng URLComponents được sử dụng để tìm nạp lược đồ URL tùy chỉnh:

Nhanh

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).
}

Mục tiêu-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).
        }
    }
}

Bước 3: Tạo và chạy thử nghiệm

Sau khi đăng ký lược đồ URL tùy chỉnh của Test Lab, bạn có thể chạy thử nghiệm trong bảng điều khiển Firebase hoặc với gcloud beta CLI . Nếu bạn chưa làm vậy, hãy tạo tệp IPA cho ứng dụng của bạn (bạn sẽ cần xác định vị trí tệp đó sau).

Chạy thử nghiệm trong bảng điều khiển Firebase

  1. Nếu bạn chưa có, hãy mở bảng điều khiển Firebase và tạo một dự án.

  2. Trên trang Test Lab của bảng điều khiển Firebase, nhấp vào Chạy thử nghiệm đầu tiên của bạn > Chạy vòng lặp trò chơi iOS .

  3. Trong phần Tải lên ứng dụng , hãy nhấp vào Duyệt qua , sau đó chọn tệp IPA của ứng dụng của bạn (nếu bạn chưa có, hãy tạo tệp IPA cho ứng dụng của bạn).

  4. Tùy chọn : Nếu bạn muốn chạy nhiều vòng lặp (còn gọi là kịch bản) cùng một lúc hoặc chọn các vòng lặp cụ thể để chạy, hãy nhập số vòng lặp vào trường Kịch bản .

    Ví dụ: khi bạn nhập "1-3, 5", Test Lab sẽ chạy các vòng 1, 2, 3 và 5. Theo mặc định (nếu bạn không nhập gì vào trường Kịch bản ), Test Lab chỉ chạy vòng 1.

  5. Trong phần Thiết bị , chọn một hoặc nhiều thiết bị vật lý mà bạn muốn thử nghiệm ứng dụng của mình, sau đó nhấp vào Bắt đầu thử nghiệm .

Chạy thử nghiệm với gcloud beta CLI

  1. Nếu bạn chưa cài đặt, hãy định cấu hình môi trường SDK gcloud cục bộ của mình, sau đó đảm bảo cài đặt thành phần gcloud beta .

  2. Chạy lệnh gcloud beta firebase test ios run và sử dụng các cờ sau để định cấu hình quá trình chạy:

Cờ cho các bài kiểm tra Vòng lặp trò chơi
--type

Bắt buộc : Chỉ định loại thử nghiệm iOS bạn muốn chạy. Bạn có thể nhập các loại thử nghiệm xctest (mặc định) hoặc game-loop .

--app

Bắt buộc : Đường dẫn tuyệt đối (Google Cloud Storage hoặc hệ thống tệp) tới tệp IPA của ứng dụng của bạn. Cờ này chỉ hợp lệ khi chạy thử nghiệm Vòng lặp trò chơi.

--scenario-numbers

Các vòng lặp (còn gọi là kịch bản) bạn muốn chạy trong ứng dụng của mình. Bạn có thể nhập một vòng lặp, một danh sách hoặc các vòng lặp hoặc một phạm vi vòng lặp. Vòng lặp mặc định là 1.

Ví dụ: --scenario-numbers=1-3,5 chạy các vòng 1, 2, 3 và 5.

--device-model

Thiết bị vật lý mà bạn muốn chạy thử nghiệm trên đó (tìm hiểu xem bạn có thể sử dụng thiết bị nào có sẵn ).

--timeout

Thời lượng tối đa bạn muốn chạy thử nghiệm. Bạn có thể nhập một số nguyên để biểu thị thời lượng tính bằng giây hoặc một số nguyên và bảng liệt kê để biểu thị thời lượng dưới dạng đơn vị thời gian dài hơn.

Ví dụ:

  • --timeout=200 buộc bài kiểm tra của bạn kết thúc khi nó chạy tối đa 200 giây.
  • --timeout=1h buộc bài kiểm tra của bạn kết thúc khi nó chạy được tối đa một giờ.

Ví dụ: lệnh sau chạy thử nghiệm Vòng lặp trò chơi để thực thi các vòng 1, 4, 6, 7 và 8 trên 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

Để biết thêm thông tin về gcloud CLI, hãy xem tài liệu tham khảo .

Chạy thử nghiệm cục bộ

Để chạy thử nghiệm cục bộ, hãy tải ứng dụng trò chơi của bạn trong trình mô phỏng và chạy:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Bạn có thể tìm thấy UDID của trình mô phỏng bằng cách chạy lệnh instruments -s devices .

  • Nếu chỉ có một trình mô phỏng đang chạy, hãy nhập chuỗi đặc biệt "booted" thay cho SIMULATOR_UDID .

Nếu thử nghiệm của bạn chứa nhiều vòng lặp, bạn có thể chỉ định vòng lặp nào bạn muốn chạy bằng cách chuyển số vòng lặp tới cờ scenario . Lưu ý rằng bạn chỉ có thể chạy một vòng lặp mỗi lần khi chạy thử nghiệm cục bộ. Ví dụ: nếu bạn muốn chạy các vòng 1, 2 và 5, bạn phải chạy một lệnh riêng cho mỗi vòng lặp:

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

Kết thúc bài kiểm tra sớm

Theo mặc định, thử nghiệm Vòng lặp trò chơi sẽ tiếp tục chạy cho đến khi hết thời gian chờ là 5 phút, ngay cả khi tất cả các vòng lặp đã được thực thi. Khi hết thời gian chờ, quá trình kiểm tra sẽ kết thúc và hủy mọi vòng lặp đang chờ xử lý. Bạn có thể tăng tốc quá trình kiểm tra hoặc kết thúc sớm bằng cách gọi lược đồ URL tùy chỉnh của Test Lab firebase-game-loop-complete trong AppDelegate của ứng dụng. Ví dụ:

Nhanh

/// End the loop by calling our custom url scheme.
func finishLoop() {
    let url = URL(string: "firebase-game-loop-complete://")!
    UIApplication.shared.open(url)
}

Mục tiêu-C

- (void)finishLoop {
  UIApplication *app = [UIApplication sharedApplication];
  [app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
      options:@{}
completionHandler:^(BOOL success) {}];
}

Kiểm tra vòng lặp trò chơi của bạn sẽ kết thúc vòng lặp hiện tại và thực hiện vòng lặp tiếp theo. Khi không còn vòng lặp nào để chạy nữa, quá trình kiểm tra sẽ kết thúc.

Viết kết quả kiểm tra tùy chỉnh

Bạn có thể định cấu hình kiểm tra Vòng lặp trò chơi để ghi kết quả kiểm tra tùy chỉnh vào hệ thống tệp của thiết bị. Bằng cách này, khi quá trình kiểm tra bắt đầu chạy, Test Lab sẽ lưu trữ các tệp kết quả trong thư mục GameLoopsResults trên thiết bị kiểm tra của bạn (bạn phải tự tạo). Khi quá trình kiểm tra kết thúc, Test Lab sẽ di chuyển tất cả các tệp từ thư mục GameLoopResults vào nhóm dự án của bạn. Hãy ghi nhớ những điều sau khi thiết lập bài kiểm tra của bạn:

  • Tất cả các tệp kết quả đều được tải lên bất kể loại, kích thước hoặc số lượng tệp.

  • Test Lab không xử lý kết quả kiểm tra của bạn cho đến khi tất cả các vòng lặp trong bài kiểm tra của bạn chạy xong, vì vậy nếu bài kiểm tra của bạn bao gồm nhiều vòng lặp ghi đầu ra, hãy đảm bảo bạn nối chúng vào một tệp kết quả duy nhất hoặc tạo một tệp kết quả cho mỗi vòng lặp. Bằng cách này, bạn có thể tránh ghi đè kết quả từ vòng lặp trước đó.

Để thiết lập bài kiểm tra của bạn nhằm viết kết quả kiểm tra tùy chỉnh:

  1. Trong thư mục Documents của ứng dụng, hãy tạo thư mục có tên GameLoopResults .

  2. Từ bất kỳ đâu trong mã ứng dụng của bạn (ví dụ: đại biểu ứng dụng của bạn), hãy thêm thông tin sau:

    Nhanh

    /// 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.
      }
    }
    

    Mục tiêu-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];
        }
    }