Il peut être difficile d'automatiser les tests de jeux lorsque les applications de jeu sont créées sur différents frameworks d'UI. Les tests de boucle de jeu vous permettent d'intégrer vos tests natifs à Test Lab et exécutez-les facilement sur les appareils de votre choix. Ce 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 un cycle complet ou partiel d'un test sur votre une application de jeu vidéo. Vous pouvez exécuter un test de boucle de jeu en local 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 rédiger un script pour l'entrée l'utilisateur, le laisser inactif ou le remplacer par une IA (par exemple, si vous avez implémenté dans un jeu de course automobile, vous pouvez confier le travail de l'utilisateur à un pilote basé sur l'IA).
- Exécutez votre jeu avec le paramètre de qualité le plus élevé pour savoir quels appareils sont compatibles.
- Exécutez un test technique, par exemple en compilant plusieurs nuanceurs, en les exécutant et en vérifiant que la sortie est conforme à vos attentes.
Étape 1 : Enregistrer le schéma d'URL personnalisé de Test Lab
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ée en l'ajoutant au schéma Fichier de configurationInfo.plist
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 avec Test Lab.
Étape 2: Configurer 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 les boucles que vous souhaitez exécuter dans votre application au moment du lancement.
Dans votre délégué d'application, ignorez 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 <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 de courant est transmise en tant que
à l'URL utilisée pour lancer l'application. Vous pouvez également obtenir la valeur actuelle
le numéro de boucle en analysant la
Objet URLComponents
utilisé pour extraire 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 au test plus tôt que prévu
Par défaut, un test de boucle de jeu continue de s'exécuter jusqu'à ce qu'il atteigne un délai d'inactivité
de cinq minutes, même lorsque toutes les boucles ont été exécutées. Lorsque
le délai avant expiration est atteint, le test se termine et annule toutes les boucles en attente. Vous pouvez accélérer votre test ou le terminer prématurément 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 les résultats de tests personnalisés
Vous pouvez configurer votre test de boucle de jeu pour écrire les résultats personnalisés dans votre
le système de fichiers de l'appareil. Ainsi, lorsque le test commencera à s'exécuter, Test Lab
stocke les fichiers de résultats dans un répertoire GameLoopsResults
lors de vos tests
(que vous devez créer vous-même). À la fin du test, Test Lab se déplace
tous les fichiers du répertoire GameLoopResults
vers le bucket de votre projet. Conserver
Tenez compte des points suivants lorsque vous configurez votre test:
Tous les fichiers de résultats sont importés quels que soient leur type, leur taille ou leur quantité.
Test Lab ne traite pas les résultats du test tant que toutes les boucles ne sont pas sont terminés. Si votre test inclut plusieurs boucles qui écrivent de sortie, veillez à les ajouter à un fichier de résultats unique ou à créer un résultat 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 personnalisés:
Dans le répertoire
Documents
de votre application, créez un répertoire nomméGameLoopResults
Dans n'importe quelle partie du code de votre application (par exemple, votre délégué d'application), ajoutez ce qui suit :
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
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 cette page: Apple Codesigning (Signature de code Apple).
Étape 4: Empaquetez l'application pour l'importer
Générez un fichier IPA pour votre application (vous devrez le localiser plus tard).
Dans le menu déroulant qui s'affiche, cliquez sur Produit > Archiver. Sélectionnez l'archive la plus récente, puis cliquez sur Distribuer l'application.
Dans la fenêtre qui s'affiche, cliquez sur Développement > Suivant.
Facultatif:Pour accélérer la compilation, désélectionnez le Recompiler à partir du bitcode, puis cliquez sur Suivant. Test Lab ne nécessite pas d'affinage ni de recompilation de votre application pour exécuter un test. Vous pouvez donc désactiver cette option en toute sécurité.
Cliquez sur Exporter, puis indiquez le répertoire dans lequel vous souhaitez télécharger le fichier. le fichier IPA de votre application.
Étape 5: Vérifiez la signature de l'application
- 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
à l'emplacement de "MyApp". est le nom de l'application contenue dans le dossier décompressé (varie selon les projets). Le résultat attendu est deMyApp.app: valid on disk
.
Étape 6: Exécutez votre test en local
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://
Vous pouvez trouver l'UDID de votre simulateur en exécutant la commande
instruments -s devices
.Si un seul simulateur est 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 boucle à l'option scenario
. Notez que vous pouvez
qu'une seule boucle à la fois lors de l'exécution du test en local. Par exemple, si vous
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 console Firebase ou de la CLI gcloud.