Memulai pengujian Game Loop untuk iOS

Dengan pengujian Game Loop, Anda dapat menulis pengujian native untuk mesin game Anda dan menjalankannya di Test Lab pada perangkat yang Anda pilih. Dengan cara ini, Anda tidak perlu memikirkan penulisan untuk UI atau framework pengujian yang berbeda. Pengujian Game Loop menyimulasikan tindakan pemain nyata, dan saat Anda menjalankannya di Test Lab, pengujian ini menyediakan cara yang cepat dan dapat diperluas untuk memverifikasi bahwa game Anda berperforma baik bagi pengguna.

Halaman ini menunjukkan cara menjalankan pengujian Game Loop, lalu melihat dan mengelola hasil pengujian di halaman Test Lab pada Firebase console. Anda juga dapat menyesuaikan pengujian lebih lanjut dengan fitur opsional, seperti menulis hasil pengujian kustom atau mengakhiri pengujian lebih awal.

Apa itu Pengujian Game Loop?

Loop adalah cakupan penuh atau sebagian dari proses pengujian di aplikasi game. Anda dapat menjalankan pengujian 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 untuk memberikan 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

Pertama, Anda harus mendaftarkan skema URL kustom Firebase Test Lab di aplikasi Anda:

  1. Di Xcode, pilih target project.

  2. Klik tab Info, lalu tambahkan URL type baru.

  3. Di kolom URL Schemes, masukkan firebase-game-loop. Anda juga dapat mendaftarkan skema URL kustom dengan menambahkannya ke file konfigurasi Info.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 (opsional): Konfigurasikan aplikasi Anda untuk menjalankan beberapa loop

Jika aplikasi memiliki beberapa skema URL kustom yang terdaftar dan Anda berencana untuk menjalankan beberapa loop (alias skenario) dalam pengujian, Anda harus menentukan loop mana yang ingin dijalankan di aplikasi Anda 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 &lt;UIApplicationOpenURLOptionsKey, id&gt; *)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).
        }
    }
}

Langkah 3: Buat dan jalankan pengujian

Setelah mendaftarkan skema URL kustom Test Lab, Anda dapat menjalankan pengujian di Firebase console atau dengan CLI gcloud beta. Jika belum melakukannya, buat file IPA untuk aplikasi (Anda memerlukannya nanti).

Menjalankan pengujian di Firebase console

  1. Jika Anda belum melakukannya, buka Firebase console dan buat project.

  2. Pada halaman Test Lab di Firebase console, klik Run Your First Test > Run an iOS Game Loop.

  3. Di bagian Upload Aplikasi, klik Cari, lalu pilih file IPA aplikasi Anda (jika belum melakukannya, buat file IPA untuk aplikasi).

  4. Opsional: Jika Anda ingin menjalankan beberapa loop (alias skenario) sekaligus atau memilih loop tertentu untuk dijalankan, masukkan nomor loop di kolom Skenario.

    Misalnya, jika Anda memasukkan "1-3, 5", Test Lab akan menjalankan loop 1, 2, 3, dan 5. Secara default (jika Anda tidak memasukkan apa pun di kolom Scenarios), Test Lab hanya menjalankan loop 1.

  5. Di bagian Perangkat, pilih satu atau beberapa perangkat fisik yang ingin digunakan untuk menguji aplikasi, lalu klik Mulai Pengujian.

Menjalankan pengujian dengan CLI gcloud beta

  1. Jika belum melakukannya, konfigurasikan lingkungan gcloud SDK lokal Anda, lalu pastikan untuk menginstal komponen gcloud beta.

  2. Jalankan perintah gcloud beta firebase test ios run dan gunakan flag berikut untuk mengonfigurasi eksekusinya:

Flag untuk pengujian Game Loop
--type

Wajib: Menentukan jenis pengujian iOS yang ingin dijalankan. Anda dapat memasukkan jenis pengujian xctest (default) atau game-loop.

--app

Wajib: Jalur absolut (Google Cloud Storage atau sistem file) ke file IPA aplikasi Anda. Flag ini hanya valid saat menjalankan pengujian Game Loop.

--scenario-numbers

Loop (alias skenario) yang ingin dijalankan di aplikasi. Anda dapat memasukkan satu loop, daftar atau beberapa loop, atau rentang loop. Loop default adalah 1.

Misalnya, --scenario-numbers=1-3,5 menjalankan loop 1, 2, 3, dan 5.

--device-model

Perangkat fisik tempat Anda ingin menjalankan pengujian (cari tahu perangkat yang tersedia yang dapat digunakan).

--timeout

Durasi maksimum yang Anda inginkan untuk menjalankan pengujian. Anda dapat memasukkan bilangan bulat untuk mewakili durasi dalam detik, atau bilangan bulat dan enumerasi untuk mewakili durasi sebagai satuan waktu yang lebih lama.

Contoh:

  • --timeout=200 memaksa pengujian Anda berakhir setelah berjalan selama 200 detik.
  • --timeout=1h memaksa pengujian Anda berakhir setelah berjalan selama satu jam.

Misalnya, perintah berikut menjalankan pengujian Game Loop yang mengeksekusi loop 1, 4, 6, 7, dan 8 di 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

Untuk mengetahui informasi lebih lanjut terkait gcloud CLI, baca dokumentasi referensi.

Menjalankan pengujian secara lokal

Untuk menjalankan pengujian secara lokal, muat aplikasi game Anda 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

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 skema URL kustom Test Lab firebase-game-loop-complete 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:

  1. Di direktori Documents aplikasi Anda, buat direktori bernama GameLoopResults.

  2. 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];
        }
    }