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

Với các chương trình kiểm thử Vòng lặp trò chơi, bạn có thể viết các chương trình kiểm thử gốc cho công cụ phát triển trò chơi của mình, sau đó chạy các chương trình kiểm thử đó 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 lo lắng về việc viết cho các khung kiểm thử 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. Khi bạn chạy thử nghiệm này trên Test Lab, thử nghiệm này 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 trên trang Test Lab của bảng điều khiển Firebase. Bạn cũng có thể tuỳ chỉnh thêm cho thử nghiệm bằng các tính năng không bắt buộc, chẳng hạn như viết kết quả thử nghiệm tuỳ chỉnh hoặc kết thúc thử nghiệm sớm.

Thử nghiệm vòng lặp trò chơi là gì?

Vòng lặp là một lần chạy thử nghiệm 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 trên một trình mô phỏng hoặc trên một nhóm thiết bị trong Test Lab. Bạn có thể dùng thử nghiệm Vòng lặp trò chơi để:

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

  • Chạy trò chơi ở chế độ cài đặt chất lượng cao nhất để tìm ra thiết bị có thể hỗ trợ trò chơi đó.

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

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

Trước tiên, bạn phải đăng ký lược đồ URL tuỳ chỉnh của Firebase Test Lab trong ứng dụng:

  1. Trong Xcode, hãy chọn một mục tiêu dự án.

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

  3. Trong trường URL Schemes (Lược đồ URL), hãy nhập firebase-game-loop. Bạn cũng có thể đăng ký lược đồ URL tuỳ chỉnh bằng cách thêm lược đồ đó vào tệp cấu hình Info.plist của dự án ở bất kỳ vị trí nào 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 (không bắt buộc): Định cấu hình ứng dụng để chạy nhiều vòng lặp

Nếu ứng dụng của bạn có nhiều lược đồ URL tuỳ chỉnh đã đă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 quá trình kiểm thử, thì bạn phải chỉ định vòng lặp nào bạn muốn chạy trong ứng dụng tại thời điểm khởi chạy.

Trong trình uỷ quyền ứng dụng, hãy ghi đè phương thức 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
}

Objective-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 kiểm thử, vòng lặp hiện tại sẽ được truyền dưới dạng tham số đến URL dùng để 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 dùng để tìm nạp lược đồ URL tuỳ chỉnh:

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

Objective-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 tuỳ 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 bằng gcloud beta CLI. Nếu bạn chưa làm, hãy tạo tệp IPA cho ứng dụng (bạn sẽ cần tìm tệp này sau).

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

  1. Trong bảng điều khiển Firebase, hãy chuyển đến phần DevOps & Engagement (DevOps và Tương tác) > Test Lab.

  2. Nhấp vào Run Your First Test > Run an iOS Game Loop (Chạy thử nghiệm đầu tiê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 (nếu bạn chưa làm, hãy tạo tệp IPA cho ứng dụng).

  4. (Không bắt buộc) Nếu bạn muốn chạy nhiều vòng lặp (hay 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 Scenarios (Kịch bản).

    Ví dụ: khi bạn nhập 1-3, 5, Test Lab sẽ chạy các vòng lặp 1, 2, 3 và 5. Theo mặc định (nếu bạn không nhập bất kỳ nội dung nào vào trường Scenarios), Test Lab chỉ chạy vòng lặp 1.

  5. Trong phần Thiết bị, hãy chọn một hoặc nhiều thiết bị thực mà bạn muốn kiểm thử ứng dụng, sau đó nhấp vào Bắt đầu kiểm thử.

Chạy kiểm thử bằng CLI gcloud beta

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

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

Cờ cho các thử nghiệm Vòng lặp trò chơi
--type

Bắt buộc: Chỉ định loại thử nghiệm iOS mà bạn muốn chạy. Bạn có thể nhập các loại kiểm thử 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) đến tệp IPA của ứng dụng. Cờ này chỉ hợp lệ khi chạy các thử nghiệm Vòng lặp trò chơi.

--scenario-numbers

Vòng lặp (hay còn gọi là kịch bản) mà bạn muốn chạy trong ứng dụng. 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 dải vòng lặp. Giá trị mặc định của vòng lặp là 1.

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

--device-model

Thiết bị thực mà bạn muốn chạy thử nghiệm (tìm hiểu xem bạn có thể sử dụng thiết bị nào hiện có).

--timeout

Thời lượng tối đa mà 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à giá trị 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 quá trình kiểm thử phải chấm dứt khi chạy đến 200 giây.
  • --timeout=1h buộc thử nghiệm của bạn phải chấm dứt khi chạy đến một giờ.

Ví dụ: lệnh sau đây chạy một thử nghiệm Vòng lặp trò chơi thực thi các vòng lặp 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 kiểm thử 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 vào trình mô phỏng rồi 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 kiểm thử của bạn chứa nhiều vòng lặp, bạn có thể chỉ định vòng lặp mà bạn muốn chạy bằng cách truyền số vòng lặp vào cờ scenario. Xin lưu ý rằng bạn chỉ có thể chạy một vòng lặp tại một thời điểm khi chạy kiểm thử cục bộ. Ví dụ: nếu muốn chạy vòng lặp 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 thử nghiệm 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ờ, quy trình kiểm thử sẽ kết thúc và huỷ mọi vòng lặp đang chờ xử lý. Bạn có thể đẩy nhanh tốc độ thử nghiệm hoặc kết thúc sớm bằng cách gọi lược đồ URL tuỳ chỉnh của Test Lab firebase-game-loop-complete trong AppDelegate của ứng dụng. Ví dụ:

Swift

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

Objective-C

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

Thử nghiệm Vòng lặp trò chơi sẽ chấm dứt vòng lặp hiện tại và thực thi vòng lặp tiếp theo. Khi không còn vòng lặp nào để chạy, quá trình kiểm thử sẽ kết thúc.

Ghi kết quả kiểm thử tuỳ chỉnh

Bạn có thể định cấu hình thử nghiệm Vòng lặp trò chơi để ghi kết quả thử nghiệm tuỳ chỉnh vào hệ thống tệp của thiết bị. Bằng cách này, khi kiểm thử 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 thử (bạn phải tự tạo thư mục này). Khi quá trình kiểm thử kết thúc, Test Lab sẽ di chuyển tất cả tệp từ thư mục GameLoopResults sang bộ chứa của dự án. Hãy lưu ý những điều sau khi thiết lập thử nghiệm:

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

  • Test Lab không xử lý kết quả kiểm thử cho đến khi tất cả các vòng lặp trong chương trình kiểm thử của bạn chạy xong. Vì vậy, nếu chương trình kiểm thử của bạn có nhiều vòng lặp ghi kết quả, hãy nhớ thêm các vòng lặp đó 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ừ một vòng lặp trước đó.

Cách thiết lập kiểm thử để ghi kết quả kiểm thử tuỳ chỉnh:

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

  2. Từ bất kỳ vị trí nào trong mã của ứng dụng (ví dụ: trình uỷ quyền ứng dụng), hãy thêm đoạn mã sau:

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

    Objective-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];
        }
    }