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 Game Loop, 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 fonctionnalités facultatives, telles que la rédaction de résultats de test personnalisés ou la fin anticipée de votre test .
Qu'est-ce qu'un test de boucle de jeu ?
Une boucle est un parcours complet ou partiel 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 le ferait un utilisateur final. 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 IA en charge de l'entrée de l'utilisateur) .
Exécutez votre jeu avec le paramètre de qualité le plus élevé pour savoir quels appareils peuvent le prendre en charge.
Exécutez un test technique, tel que la compilation de plusieurs shaders, leur exécution et la vérification que la sortie est comme prévu.
Étape 1 : Enregistrez 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 :
Dans Xcode, sélectionnez une cible de projet.
Cliquez sur l'onglet Infos , puis ajoutez un nouveau type d'URL .
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 configurationInfo.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 (facultative) : configurer votre application pour exécuter plusieurs boucles
Si votre application comporte 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é d'application, remplacez la méthode application(_:open:options:)
:
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 <UIApplicationOpenURLOptionsKey, id> *)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é :
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
Après avoir enregistré le schéma d'URL personnalisé de Test Lab, vous pouvez exécuter votre test dans la console Firebase ou avec la CLI gcloud beta . 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
Si vous ne l'avez pas déjà fait, ouvrez la console Firebase et créez un projet.
Sur la page Test Lab de la console Firebase, cliquez sur Run Your First Test > Run an iOS Game Loop .
Dans la section Télécharger l'application , cliquez sur Parcourir , puis sélectionnez le fichier IPA de votre application (si vous ne l'avez pas déjà fait, générez un fichier IPA pour votre application).
Facultatif : si vous souhaitez exécuter plusieurs boucles (c'est-à-dire des scénarios) à la fois ou sélectionner des boucles spécifiques à exécuter, saisissez les numéros de boucle dans le champ Scénarios .
Par exemple, lorsque vous saisissez « 1-3, 5 », Test Lab exécute les boucles 1, 2, 3 et 5. Par défaut (si vous ne saisissez rien dans le champ Scénarios ), Test Lab exécute uniquement la boucle 1.
Dans la section Appareils , sélectionnez un ou plusieurs appareils physiques sur lesquels vous souhaitez tester votre application, puis cliquez sur Démarrer les tests .
Exécuter un test avec la CLI gcloud beta
Si vous ne l'avez pas déjà fait, configurez votre environnement local du SDK gcloud, puis assurez-vous d'installer le composant bêta gcloud .
Exécutez la commande
gcloud beta firebase test ios run
et utilisez les options suivantes pour configurer l'exécution :
Drapeaux pour les tests de boucle de jeu | |
---|---|
--type | Obligatoire : spécifie le type de test iOS que vous souhaitez exécuter. Vous pouvez entrer les types de test |
--app | Requis : chemin absolu (Google Cloud Storage ou système de fichiers) vers le fichier IPA de votre application. Cet indicateur n'est valide que lors de l'exécution de tests Game Loop. |
--scenario-numbers | Les boucles (c'est-à-dire les scénarios) que vous souhaitez exécuter dans votre application. Vous pouvez entrer une boucle, une liste ou des boucles ou une plage de boucles. La boucle par défaut est 1. Par exemple, |
--device-model | L'appareil physique sur lequel vous souhaitez exécuter votre test (découvrez les appareils disponibles que vous pouvez utiliser). |
--timeout | La durée maximale d'exécution de votre test. Vous pouvez entrer 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:
|
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 l'interface de ligne de commande 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 l'UDID de votre simulateur en exécutant la commande
instruments -s devices
.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 spécifier la boucle que vous souhaitez exécuter en transmettant le numéro de boucle à l'indicateur 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
Terminer un test plus tôt
Par défaut, un test Game Loop continue de s'exécuter jusqu'à ce qu'il atteigne un délai 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 le terminer plus tôt en appelant le schéma d'URL personnalisé de Test Lab firebase-game-loop-complete
dans l'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 Game Loop termine la boucle en cours 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 test 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. Ainsi, lorsque le test démarre, 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). Lorsque le test se termine, Test Lab déplace tous les fichiers du répertoire GameLoopResults
vers le compartiment de votre projet. Gardez ce qui suit à l'esprit lors de la configuration de votre test :
Tous les fichiers de résultats sont téléchargés indépendamment du type, de la taille ou de 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 inclut 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 :
Dans le répertoire
Documents
de votre application, créez un répertoire nomméGameLoopResults
.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]; } }