Exécuter un test de boucle de jeu

Il peut être difficile d'automatiser les tests de jeux lorsque les applications de jeu sont créées sur différents frameworks d'interface utilisateur. Les tests de boucle de jeu vous permettent d'intégrer vos tests natifs à Test Lab et de les exécuter facilement sur les appareils de votre choix. Ce guide explique comment préparer un test de boucle de jeu à exécuter à l'aide de Firebase Test Lab.

À propos des tests de boucle de jeu

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

Un test de boucle de jeu simule les actions d'un joueur réel pour vérifier que votre jeu fonctionne correctement pour vos utilisateurs, de manière rapide et évolutive. Une boucle est une exécution complète ou partielle de votre test sur votre application de jeu. Vous pouvez exécuter un test de boucle de jeu 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 le ferait un utilisateur final. Vous pouvez soit scripter l'entrée de l'utilisateur, soit laisser l'utilisateur inactif, soit remplacer l'utilisateur par une IA (par exemple, si vous avez implémenté l'IA dans un jeu de course automobile, vous pouvez confier l'entrée de l'utilisateur à un pilote IA).
  • Exécutez votre jeu avec le paramètre de qualité le plus élevé pour identifier les appareils compatibles.
  • Exécutez un test technique, par exemple en compilant plusieurs nuanceurs, en les exécutant et en vérifiant que le résultat est conforme aux attentes.

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

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

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

  3. Dans le champ Schémas d'URL, saisissez firebase-game-loop. Vous pouvez également enregistrer le schéma d'URL personnalisé en l'ajoutant au fichier de configuration Info.plist de votre projet, n'importe où dans la balise <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>
    

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

Étape 2 : Configurez votre application (facultatif)

Exécuter plusieurs boucles

Si vous prévoyez d'exécuter plusieurs boucles (ou scénarios) dans votre test, vous devez spécifier celles que vous souhaitez exécuter dans votre application au moment du lancement.

Dans le délégué de votre application, remplacez la méthode 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:).
  }
}

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 actuel en analysant l'objet URLComponents utilisé pour récupérer le schéma d'URL personnalisé :

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

Mettre fin à un test de manière anticipée

Par défaut, un test de boucle de jeu continue de s'exécuter jusqu'à ce qu'il atteigne un délai avant expiration de cinq minutes, même lorsque toutes les boucles ont été exécutées. Une fois le délai avant expiration atteint, le test se termine et annule toutes les boucles en attente. Vous pouvez accélérer votre test ou l'arrêter plus tôt en appelant le schéma d'URL personnalisé firebase-game-loop-complete de Test Lab dans l'AppDelegate de votre application. Exemple :

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

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

Écrire des résultats de test personnalisés

Vous pouvez configurer votre test de boucle de jeu pour écrire des résultats de test personnalisés dans le système de fichiers de votre appareil. Ainsi, lorsque le test commence à s'exécuter, Test Lab stocke les fichiers de résultats dans un répertoire GameLoopsResults sur votre appareil de test (que vous devez créer vous-même). Une fois le test terminé, Test Lab déplace tous les fichiers du répertoire GameLoopResults vers le bucket de votre projet. Tenez compte des points suivants lorsque vous configurez votre test :

  • Tous les fichiers de résultats sont importés, quels que soient leur type de fichier, leur taille ou leur quantité.

  • Test Lab ne traite pas les résultats de vos tests tant que toutes les boucles de votre test n'ont pas fini de s'exécuter. Par conséquent, si votre test inclut plusieurs boucles qui écrivent des résultats, veillez à les ajouter à un fichier de résultats unique ou à 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 le répertoire Documents de votre application, créez un répertoire nommé GameLoopResults.

  2. Ajoutez le code suivant n'importe où dans le code de votre application (par exemple, dans le délégué de votre application) :

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

Étape 3 : Signez votre application

  1. Assurez-vous que tous les artefacts de l'application sont signés. Par exemple, vous pouvez le faire via Xcode en spécifiant des paramètres de signature tels que le profil de provisionnement et l'identité. Pour en savoir plus, consultez Signature de code Apple.

Étape 4 : Empaquetez votre application pour l'importer

Générez un fichier IPA pour votre application (vous devrez le localiser plus tard).

  1. Dans le menu déroulant qui s'affiche, cliquez sur Produit > Archiver. Sélectionnez l'archive la plus récente, puis cliquez sur Distribute App (Distribuer l'application).

  2. Dans la fenêtre qui s'affiche, cliquez sur Développement > Suivant.

  3. Cliquez sur Export (Exporter), puis saisissez le répertoire dans lequel vous souhaitez télécharger le fichier IPA de votre application.

Étape 5 : Vérifiez la signature de l'application

  1. Vérifiez la signature de l'application en décompressant le fichier .ipa, puis en exécutant codesign --verify --deep --verbose /path/to/MyApp.app, où "MyApp" est le nom de l'application dans le dossier décompressé (varie selon le projet). Le résultat attendu est MyApp.app: valid on disk.

Étape 6 : Exécutez votre test localement

Vous pouvez exécuter votre test localement pour vérifier son comportement avant de l'exécuter avec Test Lab. Pour effectuer un test en local, chargez votre application de jeu dans un simulateur et exécutez la commande suivante :

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Pour trouver l'UDID de votre simulateur, exécutez la commande instruments -s devices.

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

Si votre test contient plusieurs boucles, vous pouvez spécifier celle que vous souhaitez exécuter en transmettant le numéro de la boucle à l'option scenario. Notez que vous ne pouvez exécuter qu'une seule 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

Étapes suivantes

Exécutez votre test à l'aide de la consoleFirebase ou de la gcloud CLI.