Catch up on everything we announced at this year's Firebase Summit. Learn more

Premiers pas avec les tests Game Loop pour iOS

Avec les tests Game Loop, vous pouvez écrire des tests natifs de votre moteur de jeu, puis les exécuter dans Test Lab sur les appareils de votre choix. De cette façon, vous n'avez pas à vous soucier d'écrire pour différentes interfaces utilisateur ou frameworks de test. Un test Game Loop simule les actions d'un joueur réel, et lorsque vous l'exécutez sur Test Lab, il fournit un moyen rapide et évolutif de vérifier que votre jeu fonctionne bien pour vos utilisateurs.

Cette page vous montre comment exécuter un test de boucle de jeu, puis afficher et gérer vos résultats de test dans la page Test Lab de la console Firebase. Vous pouvez également personnaliser davantage vos tests avec des options telles que l' écriture des résultats des tests personnalisés ou se terminant au début de votre test .

Qu'est-ce qu'un test de boucle de jeu ?

Une boucle est une exécution complète ou partielle de votre test sur votre application de jeu. Vous pouvez exécuter un test Game Loop localement sur un simulateur ou sur un ensemble d'appareils dans Test Lab. Les tests de boucle de jeu peuvent être utilisés pour :

  • Parcourez votre jeu comme un utilisateur final y jouerait. Vous pouvez soit scripter l'entrée de l'utilisateur, laisser l'utilisateur inactif ou remplacer l'utilisateur par une IA (par exemple, si vous avez implémenté l'IA dans un jeu de course automobile, vous pouvez mettre un pilote d'IA en charge de la saisie de l'utilisateur) .

  • Exécutez votre jeu avec le réglage de qualité le plus élevé pour découvrir quels appareils peuvent le prendre en charge.

  • Exécutez un test technique, par exemple en compilant plusieurs shaders, en les exécutant et en vérifiant que le résultat est comme prévu.

Étape 1 : Enregistrer le schéma d'URL personnalisé de Test Lab

Tout d'abord, vous devez enregistrer le schéma d'URL personnalisé de Firebase Test Lab dans votre application :

  1. Dans Xcode, sélectionnez une cible de projet.

  2. Cliquez sur l'onglet Info, puis ajouter un nouveau type d'URL.

  3. Dans l'URL champ Schémas, entrez firebase-game-loop . Vous pouvez également enregistrer le schéma d'URL personnalisé en ajoutant à votre projet de Info.plist fichier de configuration de partout dans le <dict> tag:

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

Votre application est maintenant configurée pour exécuter un test à l'aide de Test Lab.

Étape 2 (facultatif) : Configurez votre application pour exécuter plusieurs boucles

Si votre application a plusieurs schémas d'URL personnalisés enregistrés et que vous prévoyez d'exécuter plusieurs boucles (c'est-à-dire des scénarios) dans votre test, vous devez spécifier les boucles que vous souhaitez exécuter dans votre application au moment du lancement.

Dans votre délégué application, passer outre l' application(_:open:options:) Méthode:

Rapide

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
}

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

Lorsque vous exécutez plusieurs boucles dans votre test, la boucle actuelle est transmise en tant que paramètre à l'URL utilisée pour lancer l'application. Vous pouvez également obtenir le numéro de boucle de courant en analysant les URLComponents objet utilisé pour récupérer le schéma d'URL personnalisée:

Rapide

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

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

Étape 3 : Créer et exécuter un test

Une fois que vous enregistrez sur mesure le schéma d'URL de test de laboratoire, vous pouvez exécuter votre test dans la console Firebase ou avec la CLI bêta gcloud . Si vous ne l'avez pas déjà fait, générez un fichier IPA pour votre application (vous devrez le localiser plus tard).

Exécuter un test dans la console Firebase

  1. Si vous avez pas déjà, ouvrez la console Firebase et créer un projet.

  2. Sur la page Test Lab de la console Firebase, cliquez sur Exécuter votre premier test> Exécuter un jeu iOS boucle.

  3. Dans la section App, cliquez sur Parcourir, puis sélectionnez votre fichier IPA application (si vous avez pas déjà, générer un fichier IPA pour votre application).

  4. Facultatif: Si vous voulez exécuter plusieurs boucles (aka scénarios) à un moment ou sélectionner des boucles spécifiques à exécuter, entrer les numéros de boucle dans le domaine des scénarios.

    Par exemple, lorsque vous entrez « 1-3, 5 », Test Lab exécute des boucles 1, 2, 3 et 5. Par défaut (si vous ne saisissez rien dans le domaine des scénarios), Test Lab boucle ne fonctionne que 1.

  5. Dans la section Périphériques, sélectionnez un ou plusieurs dispositifs physiques que vous souhaitez tester votre application sur, puis cliquez sur Démarrer Tests.

Exécuter un test avec l'interface de ligne de commande gcloud bêta

  1. Si vous ne l' avez pas déjà, configurez votre environnement SDK gcloud local, puis assurez - vous d'installer le composant bêta gcloud .

  2. Exécutez les gcloud beta firebase test ios run la commande et utiliser les indicateurs suivants pour configurer la course:

Drapeaux pour les tests de boucle de jeu
--type

Requis: Indique le type de test iOS que vous souhaitez exécuter. Vous pouvez saisir les types de test xctest (par défaut) ou game-loop .

--app

Requis: Chemin absolu (Google Cloud Storage ou système de fichiers) au fichier IPA de votre application. Ce drapeau n'est valide que lors de l'exécution de tests de boucle de jeu.

--scenario-numbers

Les boucles (alias scénarios) que vous souhaitez exécuter dans votre application. Vous pouvez saisir une boucle, une liste de boucles ou une plage de boucles. La boucle par défaut est 1.

Par exemple, --scenario-numbers=1-3,5 exécute des boucles 1, 2, 3 et 5.

--device-model

Le dispositif physique que vous voulez exécuter votre test sur (savoir quels appareils disponibles , vous pouvez utiliser).

--timeout

La durée maximale d'exécution de votre test. Vous pouvez saisir un nombre entier pour représenter la durée en secondes, ou un nombre entier et une énumération pour représenter la durée sous la forme d'une unité de temps plus longue.

Par exemple:

  • --timeout=200 forces de votre test de mettre fin quand il court jusqu'à 200 secondes.
  • --timeout=1h force votre test pour mettre fin quand il court jusqu'à une heure.

Par exemple, la commande suivante exécute un test Game Loop qui exécute les boucles 1, 4, 6, 7 et 8 sur un 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

Pour plus d' informations sur la CLI gcloud, consultez la documentation de référence .

Exécuter un test localement

Pour exécuter votre test localement, chargez votre application de jeu dans un simulateur et exécutez :

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Vous pouvez trouver UDID de votre simulateur en exécutant les instruments -s devices de commande.

  • S'il n'y a qu'un seul simulateur en cours d' exécution, entrez la chaîne spéciale "booted" à la place de SIMULATOR_UDID .

Si votre test contient plusieurs boucles, vous pouvez définir la boucle que vous voulez exécuter en passant le numéro de boucle au scenario drapeau. Notez que vous ne pouvez exécuter qu'une boucle à la fois lorsque vous exécutez votre test localement. Par exemple, si vous souhaitez exécuter les boucles 1, 2 et 5, vous devez exécuter une commande distincte pour chaque boucle :

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

Terminer un test plus tôt

Par défaut, un test de boucle de jeu continue de s'exécuter jusqu'à ce qu'il atteigne un délai d'attente de cinq minutes, même lorsque toutes les boucles ont été exécutées. Lorsque le délai d'attente est atteint, le test se termine et annule toutes les boucles en attente. Vous pouvez accélérer votre test ou de mettre fin tôt en appelant le système d'URL personnalisée de test Lab firebase-game-loop-complete en firebase-game-loop-complete dans AppDelegate de votre application. Par exemple:

Rapide

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

Objectif c

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

Votre test de boucle de jeu termine la boucle actuelle et exécute la boucle suivante. Lorsqu'il n'y a plus de boucles à exécuter, le test se termine.

Rédiger des résultats de tests personnalisés

Vous pouvez configurer votre test Game Loop pour écrire des résultats de test personnalisés dans le système de fichiers de votre appareil. De cette façon, lorsque le test se met en marche, Test Lab stocke les fichiers de résultats dans un GameLoopsResults répertoire sur votre appareil de test (que vous devez vous créer). Lorsque la fin du test, Test Lab se déplace tous les fichiers du GameLoopResults répertoire seau de votre projet. Gardez les points suivants à l'esprit lors de la configuration de votre test :

  • Tous les fichiers de résultats sont téléchargés quel que soit le type, la taille ou la quantité de fichier.

  • Test Lab ne traite pas vos résultats de test tant que toutes les boucles de votre test ne sont pas terminées. Par conséquent, si votre test comprend plusieurs boucles qui écrivent une sortie, assurez-vous de les ajouter à un fichier de résultats unique ou de créer un fichier de résultats pour chaque boucle. De cette façon, vous pouvez éviter d'écraser les résultats d'une boucle précédente.

Pour configurer votre test afin d'écrire des résultats de test personnalisés :

  1. Dans votre application Documents répertoire, créez un répertoire nommé GameLoopResults .

  2. De n'importe où dans le code de votre application (par exemple, votre délégué d'application), ajoutez ce qui suit :

    Rapide

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

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