Esegui un test Ciclo di gioco

Può essere difficile automatizzare i test dei giochi quando le app di gioco sono basate su diversi framework UI. I test di Game Loop ti consentono di integrare i tuoi test nativi con Test Lab ed eseguirli facilmente sui dispositivi selezionati. Questo guida descrive come preparare un test Ciclo di gioco da eseguire utilizzando Firebase Test Lab.

Informazioni sui test del ciclo di gioco

Che cos'è un test Ciclo di gioco?

Un test Ciclo di gioco simula le azioni di un giocatore reale per verificare che il gioco funzioni per i tuoi utenti in modo rapido e scalabile. Un ciclo è un'esecuzione completa o parziale del test sull'app di gioco. Puoi eseguire un test di ciclo di gioco localmente su un simulatore o su un insieme di dispositivi in Test Lab. I test Ciclo di gioco possono essere utilizzati per:

  • Rivedi il gioco come farebbe l'utente finale. Puoi scrivere l'input del modello l'utente, lasciarlo inattivo o sostituirlo con un'IA (ad esempio, se hai implementato l'IA) in un gioco di corse automobilistiche, è possibile affidare a un conducente IA l'input dell'utente).
  • Esegui il gioco con l'impostazione di qualità massima per scoprire quali dispositivi possono supportarlo.
  • Esegui un test tecnico, ad esempio compila più shader, eseguili e controlla che l'output sia come previsto.

Passaggio 1: registra lo schema URL personalizzato di Test Lab

  1. In Xcode, seleziona un target del progetto.

  2. Fai clic sulla scheda Informazioni, poi aggiungi un nuovo tipo di URL.

  3. Nel campo Schemi URL, inserisci firebase-game-loop. Puoi anche registrare lo schema URL personalizzato aggiungendolo alla Info.plist in qualsiasi punto all'interno del 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>
    

La tua app è ora configurata per eseguire un test utilizzando Test Lab.

Passaggio 2: facoltativamente, configura l'app

Eseguire più cicli

Se prevedi di eseguire più loop (scenari) nel test, devi specificare i loop che vuoi eseguire nella tua app al momento del lancio.

Nel tuo app delegate, sostituisci il metodo 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:).
  }
}

Quando esegui più cicli nel test, il ciclo corrente viene passato come parametro all'URL utilizzato per avviare l'app. Puoi anche ottenere il numero di loop corrente analizzando l'oggetto URLComponents utilizzato per recuperare lo schema URL personalizzato:

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).
        }
    }
}

Interrompere anticipatamente un test

Per impostazione predefinita, un test Ciclo di gioco continua l'esecuzione fino a raggiungere un timeout di cinque minuti, anche quando sono stati eseguiti tutti i loop. Quando viene raggiunto il tempo di attesa, il test termina e annulla eventuali cicli in attesa. Puoi velocizzare termina il test o termina in anticipo chiamando lo schema URL personalizzato di Test Lab firebase-game-loop-complete nel delegato della tua app. Ad esempio:

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) {}];
}

Il test Ciclo di gioco termina il ciclo corrente ed esegue quello successivo. Quando non ci sono più cicli da eseguire, il test termina.

Scrivere risultati di test personalizzati

Puoi configurare il test Game Loop in modo da scrivere i risultati del test personalizzati nel file system del dispositivo. In questo modo, quando inizia il test, Test Lab archivia i file dei risultati in una directory GameLoopsResults sul tuo sito dispositivo (che devi creare personalmente). Al termine del test, Test Lab sposta tutti i file dalla directory GameLoopResults al bucket del progetto. Tieni presente quanto segue durante la configurazione del test:

  • Tutti i file dei risultati vengono caricati indipendentemente dal tipo, dalle dimensioni o dalla quantità.

  • Test Lab non elabora i risultati del test finché non vengono eseguiti tutti i loop nella test hanno terminato l'esecuzione, quindi se il test include più loop che scrivono un output, assicurati di aggiungerlo a un file di risultati univoco o di crearne uno per ogni loop. In questo modo, puoi evitare di sovrascrivere i risultati di un loop precedente.

Per configurare il test in modo da scrivere risultati di test personalizzati:

  1. Nella directory Documents dell'app, crea una directory denominata GameLoopResults.

  2. In qualsiasi punto del codice dell'app (ad es. dal delegato dell'app), aggiungi il metodo seguenti:

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

Passaggio 3: firma l'app

  1. Assicurati che tutti gli elementi nell'app siano firmati. Ad esempio, puoi farlo tramite Xcode specificando le impostazioni di firma, come il profilo di provisioning e l'identità. Per ulteriori informazioni, consulta Firma del codice Apple.

Passaggio 4: prepara la tua app per il caricamento

Genera un file IPA per la tua app (dovrai trovarlo in un secondo momento).

  1. Nel menu a discesa visualizzato, fai clic su Prodotto > Archivio. Seleziona l'archivio più recente, quindi fai clic su Distribuisci app.

  2. Nella finestra visualizzata, fai clic su Sviluppo > Avanti.

  3. Facoltativo: per ottenere una compilazione più rapida, deseleziona l'opzione Ricompila dal codice bytecode e poi fai clic su Avanti. Test Lab non richiede il thinning o la ricostruzione dell'app per eseguire un test, quindi puoi disattivare questa opzione in tutta sicurezza.

  4. Fai clic su Esporta, quindi inserisci una directory da scaricare. il file IPA dell'app.

Passaggio 5: verifica la firma dell'app

  1. Verifica la firma dell'app decomprimendo il file .ipa ed eseguendo codesign --verify --deep --verbose /path/to/MyApp.app dove "Miaapp" è il nome dell'app all'interno della cartella decompressa (varia per ogni progetto). L'output previsto è MyApp.app: valid on disk.

Passaggio 6: esegui il test in locale

Puoi eseguire il test localmente per verificarne il comportamento prima di eseguirlo con Test Lab. Per eseguire il test in locale, carica la tua app di gioco in un simulatore ed esegui:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Puoi trovare l'UDID del tuo simulatore eseguendo il comando Comando instruments -s devices.

  • Se è in esecuzione un solo simulatore, inserisci la stringa speciale"booted" al posto di SIMULATOR_UDID.

Se il test contiene più cicli, puoi specificare quello da eseguire passando il numero del ciclo al flag scenario. Tieni presente che puoi eseguire un solo ciclo alla volta quando esegui il test a livello locale. Ad esempio, se vuoi eseguire i loop 1, 2 e 5, devi eseguire un comando separato per ogni 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

Passaggi successivi

Esegui il test utilizzando la console Firebase o l'interfaccia a riga di comando gcloud.