Chạy kiểm thử Vòng lặp trò chơi

Có thể khó tự động hoá quy trình kiểm thử trò chơi khi ứng dụng trò chơi được xây dựng trên nhiều khung giao diện người dùng. Tính năng kiểm thử Vòng lặp trò chơi cho phép bạn tích hợp các chương trình kiểm thử gốc với Phòng thử nghiệm và dễ dàng chạy các kiểm thử đó trên các thiết bị mà bạn chọn. Hướng dẫn này mô tả cách chuẩn bị một thử nghiệm Vòng lặp trò chơi để chạy bằng Phòng thử nghiệm Firebase.

Giới thiệu về kiểm thử Vòng lặp trò chơi

Kiểm thử Vòng lặp trò chơi là gì?

Bài kiểm thử Vòng lặp trò chơi mô phỏng hành động của một người chơi thực để xác minh rằng trò chơi của bạn hoạt động hiệu quả cho người dùng theo cách nhanh và có thể mở rộng. Vòng lặp là một lần chạy toàn bộ hoặc một phần quy trình kiểm thử trên ứng dụng trò chơi của bạn. Bạn có thể chạy một quy trình kiểm thử Vòng lặp trò chơi trên máy tính trên một trình mô phỏng hoặc trên một tập hợp các thiết bị trong Phòng thử nghiệm. Bạn có thể dùng bài kiểm thử Vòng lặp trò chơi để:

  • Chạy qua trò chơi của bạn như một người dùng cuối sẽ chơi trò chơi. Bạn có thể viết 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 một AI (ví dụ: nếu đã triển khai AI trong một trò chơi đua ô tô, bạn có thể để 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 của bạn ở chế độ 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 một bài 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 các chương trình đó và kiểm tra xem kết quả có đúng như mong đợi hay không.

Bước 1: Đăng ký lược đồ URL tuỳ chỉnh của Phòng thử nghiệm

  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 một loại URL mới.

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

Bước 2: Định cấu hình ứng dụng (không bắt buộc)

Chạy nhiều vòng lặp

Nếu dự định chạy nhiều vòng lặp (còn gọi là các tình huống) trong kiểm 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 uỷ quyền của ứ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 quy trình kiểm thử, vòng lặp hiện tại sẽ được truyền dưới dạng một 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 giao thứ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).
        }
    }
}

Kết thúc sớm một thử nghiệm

Theo mặc định, một quy trình kiểm thử 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 đã thực thi tất cả các vòng lặp. 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 độ hoặc kết thúc kiểm thử sớm bằng cách gọi lược đồ URL tuỳ chỉnh của Phòng thử nghiệm 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) {}];
}

Chương trình kiểm thử Vòng lặp trò chơi của bạn 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, kiểm thử sẽ kết thúc.

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

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

  • 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 hoặc số lượng.

  • Phòng thử nghiệm không xử lý kết quả kiểm thử cho đến khi tất cả vòng lặp trong kiểm thử đã chạy xong. Vì vậy, nếu kiểm thử bao gồm nhiều vòng lặp ghi kết quả, hãy đảm bảo rằng bạn thêm 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.

Cách thiết lập chương trình kiểm thử để viết 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ụ: đại diệ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];
        }
    }
    

Bước 3: Ký ứng dụng

  1. Đảm bảo rằng tất cả cấu phần phần mềm trong ứng dụng đều đã được ký. Ví dụ: bạn có thể thực hiện việc này thông qua Xcode bằng cách chỉ định các chế độ cài đặt ký như hồ sơ cấp phép và danh tính. Để biết thêm thông tin, hãy xem bài viết: Ký mã Apple

Bước 4: Đóng gói ứng dụng của bạn để tải lên

Tạo một tệp IPA cho ứng dụng của bạn (bạn sẽ cần tìm tệp này sau).

  1. Từ trình đơn thả xuống hiện ra, hãy nhấp vào Sản phẩm > Lưu trữ. Chọn bản lưu trữ gần đây nhất, sau đó nhấp vào Phân phối ứng dụng.

  2. Trong cửa sổ xuất hiện, nhấp vào Development > Next (Phát triển > Tiếp theo).

  3. Không bắt buộc: Để có bản dựng nhanh hơn, hãy bỏ chọn tuỳ chọn Tạo lại từ Bitcode, sau đó nhấp vào Tiếp theo. Phòng thử nghiệm không yêu cầu cắt giảm hoặc tạo lại ứng dụng để chạy kiểm thử, vì vậy, bạn có thể tắt tuỳ chọn này một cách an toàn.

  4. Nhấp vào Export (Xuất), sau đó nhập thư mục mà bạn muốn tải tệp IPA của ứng dụng xuống.

Bước 5: Xác minh chữ ký ứng dụng

  1. Xác minh chữ ký ứng dụng bằng cách giải nén tệp .ipa rồi chạy codesign --verify --deep --verbose /path/to/MyApp.app, trong đó "MyApp" là tên của ứng dụng bên trong thư mục đã giải nén (thay đổi tuỳ theo dự án). Kết quả đầu ra dự kiến là MyApp.app: valid on disk.

Bước 6: Chạy kiểm thử cục bộ

Bạn có thể chạy kiểm thử cục bộ để kiểm tra hành vi của kiểm thử trước khi chạy bằng Phòng thử nghiệm. Để kiểm thử cục bộ, hãy tải ứng dụng trò chơi của bạn trong 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 bạn muốn chạy vòng lặp nào bằng cách truyền số vòng lặp vào 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 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

Các bước tiếp theo

Chạy kiểm thử bằng bảng điều khiển của Firebase hoặc gcloud CLI.