获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Esegui un test del ciclo di gioco

Può essere difficile automatizzare i test di gioco quando le app di gioco sono basate su diversi framework dell'interfaccia utente. I test Game Loop ti consentono di integrare i tuoi test nativi con Test Lab e di eseguirli facilmente sui dispositivi selezionati. Questa guida descrive come preparare un test Game Loop da eseguire utilizzando Firebase Test Lab.

Informazioni sui test del ciclo di gioco

Che cos'è un test del ciclo di gioco?

Un test Game Loop simula le azioni di un giocatore reale per verificare che il tuo gioco funzioni bene per i tuoi utenti in modo rapido e scalabile. Un ciclo è un'esecuzione completa o parziale del test sulla tua app di gioco. Puoi eseguire un test Game Loop in locale su un simulatore o su un set di dispositivi in ​​Test Lab. I test di Game Loop possono essere utilizzati per:

  • Esegui il tuo gioco come lo farebbe un utente finale. Puoi scrivere l'input dell'utente, lasciare che l'utente sia inattivo o sostituire l'utente con un'IA (ad esempio, se hai implementato l'IA in un gioco di corse automobilistiche, puoi affidare a un pilota AI l'input dell'utente) .
  • Esegui il tuo gioco con l'impostazione di massima qualità per scoprire quali dispositivi possono supportarlo.
  • Esegui un test tecnico, come compilare più shader, eseguirli e verificare che l'output sia quello previsto.

Passaggio 1 : registra lo schema URL personalizzato di Test Lab

  1. In Xcode, seleziona una destinazione del progetto.

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

  3. Nel campo Schemi URL , inserisci firebase-game-loop . Puoi anche registrare lo schema URL personalizzato aggiungendolo al file di configurazione Info.plist del tuo progetto ovunque 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 : configura facoltativamente la tua app

Eseguire più cicli

Se prevedi di eseguire più loop (ovvero scenari) nel test, devi specificare quali loop desideri eseguire nella tua app al momento dell'avvio.

Nel delegato dell'app, eseguire l'override del metodo application(_:open:options:) :

Rapido

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
}

Obiettivo-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:

Rapido

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

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

Termina un test in anticipo

Per impostazione predefinita, un test di Game Loop continua a essere eseguito fino a quando non raggiunge un timeout di cinque minuti, anche quando tutti i loop sono stati eseguiti. Quando viene raggiunto il timeout, il test termina e annulla eventuali loop in sospeso. Puoi velocizzare il test o terminarlo in anticipo chiamando lo schema URL personalizzato di Test Lab firebase-game-loop-complete della tua app. Per esempio:

Rapido

/// End the loop by calling our custom url scheme.
func finishLoop() {
    let url = URL(string: "firebase-game-loop-complete://")!
    UIApplication.shared.open(url)
}

Obiettivo-C

- (void)finishLoop {
  UIApplication *app = [UIApplication sharedApplication];
  [app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
      options:@{}
completionHandler:^(BOOL success) {}];
}

Il tuo test Game Loop termina il loop corrente ed esegue il loop successivo. Quando non ci sono più loop da eseguire, il test termina.

Scrivi i risultati dei test personalizzati

Puoi configurare il tuo test Game Loop per scrivere i risultati del test personalizzati nel file system del tuo dispositivo. In questo modo, quando il test inizia a essere eseguito, Test Lab memorizza i file dei risultati in una directory GameLoopsResults sul tuo dispositivo di test (che devi creare tu stesso). Al termine del test, Test Lab sposta tutti i file dalla directory GameLoopResults al bucket del progetto. Tieni presente quanto segue quando imposti il ​​test:

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

  • Test Lab non elabora i risultati del test fino al termine dell'esecuzione di tutti i cicli del test, quindi se il test include più cicli che scrivono l'output, assicurati di aggiungerli a un file dei risultati univoco o di creare un file dei risultati per ogni ciclo. In questo modo, puoi evitare di sovrascrivere i risultati di un ciclo precedente.

Per impostare il test per scrivere risultati di test personalizzati:

  1. Nella directory Documents della tua app, crea una directory denominata GameLoopResults .

  2. Da qualsiasi punto del codice dell'app (ad esempio, il delegato dell'app), aggiungi quanto segue:

    Rapido

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

    Obiettivo-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 : impacchetta la tua app per il caricamento

Infine, genera un file IPA per la tua app (dovrai individuarlo in seguito).

  1. In Xcode, seleziona un profilo di provisioning per l'app di destinazione.

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

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

  4. Facoltativo: per ottenere una build più veloce, deseleziona l'opzione Rebuild from Bitcode , quindi fai clic su Next . Test Lab non richiede il diradamento o la ricostruzione dell'app per eseguire un test, quindi puoi disabilitare in sicurezza questa opzione.

  5. Fai clic su Esporta , quindi inserisci una directory in cui desideri scaricare il file IPA della tua app.

Passaggio 4 : esegui il test in locale

Puoi eseguire il test in locale 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 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 quale ciclo desideri eseguire passando il numero del ciclo al flag dello scenario . Tieni presente che puoi eseguire un solo ciclo alla volta quando esegui il test in locale. Ad esempio, se si desidera eseguire i cicli 1, 2 e 5, è necessario eseguire un comando separato per ciascun ciclo:

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

Prossimi passi

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