Bạn có thể gặp khó khăn khi tự động hoá quy trình kiểm thử trò chơi khi các ứng dụng trò chơi được xây dựng trên nhiều khung giao diện người dùng. Kiểm thử Vòng lặp trò chơi cho phép bạn tích hợp các kiểm thử gốc với Test Lab và dễ dàng chạy các kiểm thử đó trên các thiết bị bạn chọn. Hướng dẫn này mô tả cách chuẩn bị kiểm thử Vòng lặp trò chơi để chạy bằng Firebase Test Lab.
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ì?
Kiểm thử Vòng lặp trò chơi mô phỏng các hành động của 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 một 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 kiểm thử trên ứng dụng trò chơi. Bạn có thể chạy kiểm thử Vòng lặp trò chơi trên máy cục bộ trên trình mô phỏng hoặc trên một nhóm thiết bị trong Test Lab. Bạn có thể sử dụng kiểm thử Vòng lặp trò chơi để:
- Chạy qua trò chơi của bạn như cách người dùng cuối sẽ chơi. Bạn có thể tập lệnh cho dữ liệu đầ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 trò chơi đua xe, bạn có thể đặt trình điều khiển AI phụ trách dữ liệu đầ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 hiểu xem thiết bị nào 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 các chương trình đó và kiểm tra xem kết quả có như mong đợi hay không.
Bước 1: Đăng ký giao thức URL tuỳ chỉnh của Test Lab
Trong Xcode, hãy chọn một mục tiêu dự án.
Nhấp vào thẻ Thông tin, sau đó thêm một loại URL mới.
Trong trường URL Schemes (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ìnhInfo.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 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à tình huống) trong kiểm thử, bạn phải chỉ định vòng lặp mà 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 <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 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 để 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
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 bài kiểm thử
Theo mặc định, 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 tất cả các vòng lặp đã được thực thi. Khi thời gian chờ kết thúc, quá 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ể tăng tốc kiểm thử hoặc kết thúc sớm bằng cách gọi giao thứ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) {}];
}
Kiểm thử 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.
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 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ử (mà bạn phải tự tạo). Khi 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 hoặc 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 kiểm thử chạy xong. Vì vậy, nếu kiểm thử của bạn bao gồm nhiều vòng lặp ghi đầu ra, hãy đảm bảo bạn 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:
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ỳ vị trí nào trong mã của ứng dụng (ví dụ: ứng dụng uỷ quyền), hãy thêm nội dung 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
Đả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ã của Apple
Bước 4: Đóng gói ứng dụng để tải lên
Tạo tệp IPA cho ứng dụng (bạn sẽ cần tìm tệp này sau).
Trong 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 bản lưu trữ gần đây nhất, rồi nhấp vào Phân phối ứng dụng.
Trong cửa sổ xuất hiện, hãy nhấp vào Development (Phát triển) > Next (Tiếp theo).
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ừ mã bit, sau đó nhấp vào Tiếp theo. Test Lab không yêu cầu làm mỏng 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.
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
- Xác minh chữ ký ứng dụng bằng cách giải nén tệp .ipa, sau đó 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 (tùy theo từng dự án). Kết quả dự kiến làMyApp.app: valid on disk
.
Bước 6: Chạy kiểm thử trên máy
Bạn có thể chạy kiểm thử trên máy để kiểm tra hành vi của kiểm thử trước khi chạy kiểm thử bằng Test Lab. Để 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 vì 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 đến 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
Các bước tiếp theo
Chạy chương trình kiểm thử bằng bảng điều khiển Firebase hoặc CLI gcloud.