Có thể khó tự động hóa thử nghiệm trò chơi khi các ứng dụng trò chơi được xây dựng trên các khung giao diện người dùng khác nhau. Các thử nghiệm Vòng lặp trò chơi cho phép bạn tích hợp các thử nghiệm gốc của mình với Test Lab và dễ dàng chạy chúng trên các thiết bị bạn chọn. Hướng dẫn này mô tả cách chuẩn bị thử nghiệm Vòng lặp trò chơi để chạy bằng Phòng thí nghiệm kiểm tra Firebase.
Giới thiệu về kiểm tra Vòng lặp trò chơi
Thử nghiệm Vòng lặp trò chơi là gì?
Thử nghiệm 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 tốt cho người dùng của bạn theo cách nhanh chóng và có thể mở rộng. Vòng lặp là quá trình chạy toàn bộ hoặc một phần thử nghiệm 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 giả lập hoặc trên một nhóm thiết bị trong Phòng thí nghiệm thử nghiệm. 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ể viết kịch bản đầu vào của người dùng, để người dùng ở chế độ chờ 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, 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 hiện chúng và kiểm tra xem đầu ra có như mong đợi không.
Bước 1 : Đăng ký lược đồ URL tùy chỉnh của Test Lab
Trong Xcode, chọn mục tiêu dự án.
Nhấp vào tab Thông tin , sau đó thêm loại URL mới .
Trong trường Lược đồ URL , hãy 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 nó vào tệp cấu hìnhInfo.plist
của dự án của bạ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 cấu hình ứng dụng của bạn
Chạy nhiều vòng
Nếu bạn dự định chạy nhiều vòng lặp (còn gọi là kịch bản) trong thử nghiệm của mình, thì 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 đại biểu ứng dụng 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 <UIApplicationOpenURLOptionsKey, id> *)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 được sử 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).
}
}
}
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 tiếp tục chạy cho đến khi hết thời gian chờ năm 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 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 độ thử nghiệm của mình hoặc kết thúc thử nghiệm sớm bằng cách gọi lược đồ URL tùy chỉnh firebase-game-loop-complete
của Test Lab trong AppDelegate của ứng dụng của bạn. 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) {}];
}
Thử nghiệm Vòng lặp trò chơi của bạn 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, bài kiểm tra 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 của mình để 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 thử nghiệm bắt đầu chạy, Test Lab lưu trữ các tệp kết quả trong thư mục GameLoopsResults
trên thiết bị thử nghiệm của bạn (bạn phải tự tạo thư mục này). Khi quá trình thử nghiệm kết thúc, Test Lab sẽ di chuyển tất cả các tệp từ thư mục GameLoopResults
sang bộ chứa dự án của bạn. Hãy ghi nhớ những điều sau đây khi thiết lập bài kiểm tra của bạn:
Tất cả các tệp kết quả được tải lên bất kể loại tệp, kích thước hoặc số lượng.
Test Lab không xử lý kết quả xét nghiệm của bạn cho đến khi tất cả các vòng lặp trong xét nghiệm của bạn chạy xong. Vì vậy, nếu xét nghiệm 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 thử nghiệm của bạn để ghi kết quả thử nghiệm tùy chỉnh:
Trong thư mục
Documents
của ứng dụng, hãy tạo một thư mục có tênGameLoopResults
.Từ bất kỳ đâu trong mã ứng dụng của bạn (ví dụ: ủy quyền ứng dụng của bạn), hãy thêm phần 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]; } }
Bước 3 : Ký ứng dụng của bạn
Đảm bảo rằng tất cả các thành phần lạ 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ài đặt ký như cung cấp hồ sơ và danh tính. Để biết thêm thông tin, hãy xem: Thiết kế mã Apple
Bước 4 : Đóng gói ứng dụng của bạn để tải lên
Tạo tệp IPA cho ứng dụng của bạn (bạn sẽ cần tìm tệp này sau).
Từ trình đơn thả xuống xuất hiện, hãy nhấp vào Sản phẩm > Lưu trữ . Chọn kho lưu trữ gần đây nhất, sau đó nhấp vào Phân phối ứng dụng .
Trong cửa sổ xuất hiện, nhấp vào Phát triển > Tiếp theo .
Tùy chọn: Để có bản dựng nhanh hơn, hãy bỏ chọn tùy chọn Rebuild from Bitcode , sau đó nhấp vào Next . Test Lab không yêu cầu làm mỏng hoặc xây dựng lại ứng dụng của bạn để chạy thử nghiệm nên bạn có thể tắt tùy chọn này một cách an toàn.
Nhấp vào Xuất , sau đó nhập thư mục mà bạn muốn tải xuống tệp IPA của ứng dụng.
Bước 5 : Xác minh chữ ký ứng dụng
- 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 (khác nhau tùy theo từng dự án ). Đầu ra dự kiến làMyApp.app: valid on disk
.
Bước 6 : Chạy thử nghiệm cục bộ
Bạn có thể chạy thử nghiệm cục bộ để kiểm tra hành vi của nó trước khi chạy thử nghiệm với Test Lab. Để kiểm tra cục bộ, hãy tải ứng dụng trò chơi của bạn trong trình giả lập 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 vào cờ scenario
. 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 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 từng vòng:
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
Bước tiếp theo
Chạy thử nghiệm của bạn bằng bảng điều khiển Firebase hoặc gcloud CLI .