Pengotomatisan pengujian game bisa jadi cukup sulit jika aplikasi game dibuat di framework UI yang berbeda. Dengan pengujian Game Loop, Anda dapat mengintegrasikan pengujian native dengan Test Lab dan menjalankannya dengan mudah di perangkat pilihan Anda. Panduan ini menjelaskan cara menyiapkan uji Game Loop yang akan dijalankan menggunakan Firebase Test Lab.
Tentang uji Game Loop
Apa yang dimaksud dengan uji Game Loop?
Uji Game Loop menyimulasikan tindakan pemain nyata untuk memverifikasi bahwa game Anda berperforma baik bagi pengguna dengan cara yang cepat dan skalabel. Loop adalah uji coba penuh atau sebagian dari proses pengujian di aplikasi game. Anda dapat menjalankan uji Game Loop secara lokal pada simulator atau pada serangkaian perangkat di Test Lab. Pengujian Game Loop dapat digunakan untuk:
- Menjalankan game Anda sebagaimana pengguna akhir akan memainkannya. Anda dapat membuat skrip input pengguna, membiarkan pengguna tidak ada aktivitas, atau mengganti pengguna dengan AI (misalnya, jika Anda menerapkan AI dalam game balap mobil, Anda dapat menempatkan driver AI yang bertanggung jawab terhadap input pengguna).
- Menjalankan game Anda pada setelan kualitas tertinggi untuk mengetahui perangkat mana yang dapat mendukungnya.
- Menjalankan uji teknis, seperti mengompilasi beberapa shader, menjalankannya, dan memastikan bahwa output sesuai yang diharapkan.
Langkah 1: Daftarkan skema URL kustom Test Lab
Di Xcode, pilih target project.
Klik tab Info, lalu tambahkan URL type baru.
Di kolom URL Schemes, masukkan
firebase-game-loop
. Anda juga dapat mendaftarkan skema URL kustom dengan menambahkannya ke file konfigurasiInfo.plist
project Anda di mana saja dalam tag<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>
Aplikasi Anda kini dikonfigurasi untuk menjalankan pengujian menggunakan Test Lab.
Langkah 2: Secara opsional, konfigurasikan aplikasi Anda
Menjalankan beberapa loop
Jika berencana untuk menjalankan beberapa loop (alias skenario) dalam pengujian, Anda harus menentukan loop mana yang ingin dijalankan di aplikasi pada waktu peluncuran.
Di delegasi aplikasi Anda, ganti metode 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:).
}
}
Saat Anda menjalankan beberapa loop dalam pengujian, loop saat ini diteruskan sebagai parameter ke URL yang digunakan untuk meluncurkan aplikasi. Anda juga bisa mendapatkan nomor loop saat ini dengan menguraikan objek URLComponents
yang digunakan untuk mengambil skema URL kustom:
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).
}
}
}
Mengakhiri pengujian lebih awal
Secara default, pengujian Game Loop terus berjalan hingga waktu tunggu lima menit berakhir, meskipun jika semua loop telah dijalankan. Saat
waktu tunggu berakhir, pengujian akan berakhir dan semua loop yang tertunda akan dibatalkan. Anda dapat mempercepat
pengujian atau mengakhirinya lebih awal dengan memanggil firebase-game-loop-complete
skema URL kustom
Test Lab di AppDelegate aplikasi Anda. Contoh:
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) {}];
}
Pengujian Game Loop menghentikan loop saat ini dan menjalankan loop berikutnya. Jika tidak ada lagi loop yang dijalankan, pengujian akan berakhir.
Menulis hasil pengujian kustom
Anda dapat mengonfigurasi pengujian Game Loop untuk menulis hasil pengujian kustom ke
sistem file perangkat. Dengan cara ini, saat pengujian mulai berjalan, Test Lab
menyimpan file hasil dalam direktori GameLoopsResults
di perangkat
pengujian Anda (yang harus Anda buat sendiri). Saat pengujian berakhir, Test Lab memindahkan
semua file dari direktori GameLoopResults
ke bucket project Anda. Perhatikan
hal-hal berikut saat menyiapkan pengujian:
Semua file hasil diupload apa pun jenis, ukuran, atau kuantitasnya.
Test Lab tidak memproses hasil pengujian hingga semua loop dalam pengujian selesai dijalankan, sehingga jika pengujian menyertakan beberapa loop yang menulis output, pastikan Anda menambahkannya ke file hasil yang unik atau membuat file hasil untuk setiap loop. Dengan cara ini, Anda dapat menghindari menimpa hasil dari loop sebelumnya.
Untuk menyiapkan pengujian agar menulis hasil pengujian kustom:
Di direktori
Documents
aplikasi Anda, buat direktori bernamaGameLoopResults
.Di mana pun dalam kode aplikasi (misalnya, delegasi aplikasi), tambahkan kode berikut:
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]; } }
Langkah 3: Tanda tangani aplikasi Anda
Pastikan semua artefak dalam aplikasi ditandatangani. Misalnya, Anda dapat melakukannya melalui Xcode dengan menentukan setelan penandatanganan seperti penyediaan profil dan identitas. Untuk mengetahui informasi selengkapnya, lihat: Penandatanganan Kode Apple
Langkah 4: Kemas aplikasi Anda untuk diupload
Buat file IPA untuk aplikasi (Anda perlu mencarinya nanti).
Dari menu drop-down yang muncul, klik Product > Archive. Pilih arsip terbaru, lalu klik Distribute App.
Di jendela yang muncul, klik Development > Next.
Opsional: Untuk mendapatkan build yang lebih cepat, batalkan pilihan opsi Rebuild from Bitcode, lalu klik Next. Test Lab tidak memerlukan thinning atau mem-build ulang aplikasi untuk menjalankan pengujian sehingga Anda dapat menonaktifkan opsi ini dengan aman.
Klik Export, lalu masukkan direktori tempat Anda ingin mendownload file IPA aplikasi.
Langkah 5: Verifikasi tanda tangan aplikasi
- Verifikasi tanda tangan aplikasi dengan mengekstrak file .ipa, lalu menjalankan
codesign --verify --deep --verbose /path/to/MyApp.app
dengan "MyApp" adalah nama aplikasi di dalam folder yang diekstrak (bervariasi untuk setiap project). Output yang diharapkan adalahMyApp.app: valid on disk
.
Langkah 6: Jalankan pengujian secara lokal
Anda dapat menjalankan pengujian secara lokal untuk memeriksa perilakunya sebelum menjalankannya dengan Test Lab. Untuk menguji secara lokal, muat aplikasi game dalam simulator dan jalankan:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Anda dapat menemukan UDID simulator dengan menjalankan perintah
instruments -s devices
.Jika hanya ada satu simulator yang berjalan, masukkan string khusus
"booted"
sebagai ganti SIMULATOR_UDID.
Jika pengujian Anda berisi beberapa loop, Anda dapat menentukan loop mana yang ingin dijalankan dengan meneruskan nomor loop ke flag scenario
. Perlu diingat bahwa Anda hanya dapat menjalankan loop satu per satu saat menjalankan pengujian secara lokal. Misalnya, jika Anda ingin menjalankan loop 1, 2, dan 5, Anda harus menjalankan perintah terpisah untuk setiap loop:
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
Langkah berikutnya
Jalankan pengujian menggunakan Firebase console atau gcloud CLI.