La automatización de las pruebas de videojuegos puede ser una tarea complicada cuando este tipo de apps se crean en frameworks de IU diferentes. Las pruebas de bucle de juego te permiten integrar tus pruebas nativas a Test Lab y ejecutarlas fácilmente en los dispositivos que quieras. Esta guía describe cómo preparar una prueba de bucle de juego para ejecutarla con Firebase Test Lab.
Información sobre las pruebas de bucle de juego
¿Qué es una prueba de bucle de juego?
Una prueba de bucle de juego simula las acciones de un jugador real a fin de verificar que tu juego funcione bien para los usuarios de manera rápida y escalable. Un bucle es una ejecución completa o parcial de una prueba en tu app de juego. Las pruebas de bucle de juego se pueden ejecutar de manera local en un simulador o en un conjunto de dispositivos en Test Lab. Estas pruebas se pueden usar para lo siguiente:
- Ejecutar tu juego de la misma manera en que lo jugaría un usuario final. Puedes escribir la entrada del usuario, dejar que esté inactivo o reemplazarlo con una inteligencia artificial. Por ejemplo, si tienes un videojuego de carreras de autos que ya tiene implementada una IA, puedes poner fácilmente un conductor con IA a cargo de la entrada del usuario
- Ejecutar el juego con la configuración de calidad más alta para comprobar la compatibilidad con los dispositivos
- Ejecutar una prueba técnica, como compilar varios sombreadores, ejecutarlos y comprobar que el resultado sea el esperado
Paso 1: Registra el esquema de URL personalizada de Test Lab
En Xcode, selecciona un destino del proyecto.
Haz clic en la pestaña Info y, luego, agrega un nuevo tipo de URL en URL type.
En el campo URL Schemes, ingresa
firebase-game-loop
. También puedes registrar el esquema de URL personalizada si lo agregas al archivo de configuraciónInfo.plist
de tu proyecto en cualquier lugar de la etiqueta<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 app ya está configurada para ejecutar una prueba con Test Lab.
Paso 2: Configura tu app (opcional)
Ejecuta varios bucles
Si planeas ejecutar varios bucles (es decir, situaciones) en la prueba, debes especificar cuáles quieres ejecutar cuando se inicie la app.
En el delegado de la app, anula el método 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:).
}
}
Cuando ejecutas varios bucles en tu prueba, el bucle actual pasa como un parámetro a la URL que se usa para iniciar la app. También puedes obtener el número del bucle actual si analizas el objeto URLComponents
que sirve para recuperar el esquema de URL personalizada:
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).
}
}
}
Finaliza una prueba antes de tiempo
De forma predeterminada, una prueba de bucle de juego continúa ejecutándose hasta que se agota el tiempo de espera de cinco minutos, incluso si se ejecutaron todos los bucles. Cuando se acaba el tiempo de espera, la prueba finaliza y se cancelan todos los bucles pendientes. Para acelerar la prueba o finalizarla antes de tiempo, llama al esquema de URL personalizada de Test Lab, firebase-game-loop-complete
, en el AppDelegate de la app. Por ejemplo:
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) {}];
}
La prueba de bucle de juego finaliza el bucle actual y ejecuta el siguiente. Cuando no quedan más bucles que ejecutar, la prueba finaliza.
Escribe resultados de prueba personalizados
Puedes configurar la prueba de bucle de juego para que escriba resultados de prueba personalizados en el sistema de archivos de tu dispositivo. De esta manera, cuando comience a ejecutarse la prueba, Test Lab almacenará los archivos de resultados en un directorio GameLoopsResults
del dispositivo de prueba (que debes crear tú mismo). Cuando finaliza la prueba, Test Lab mueve
todos los archivos del directorio GameLoopResults
al bucket de tu proyecto. Ten en cuenta lo siguiente cuando configures la prueba:
Todos los archivos de resultados se suben independientemente del tipo de archivo, el tamaño o la cantidad.
Test Lab no procesa los resultados de la prueba hasta que todos los bucles hayan terminado de ejecutarse, por lo que, si tu prueba incluye varios bucles que escriben salidas, asegúrate de agregarlos a un archivo de resultados único o de crear un archivo de resultados para cada bucle. De esta manera, evitarás que se reemplacen los resultados de un bucle anterior.
Para configurar la prueba a fin de que escriba resultados personalizados, sigue estas instrucciones:
En el directorio
Documents
de la app, crea un directorio con el nombreGameLoopResults
.Desde cualquier parte del código de tu app (p. ej., el delegado de la app), agrega lo siguiente:
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]; } }
Paso 3: Firma la app
Asegúrate de que todos los artefactos de la app estén firmados. Por ejemplo, puedes hacerlo mediante Xcode. Para ello, especifica la configuración de firma, como la identidad y el perfil de aprovisionamiento. Para obtener más información, consulta Firma de código de Apple.
Paso 4: Empaqueta tu app para subirla
Genera un archivo IPA para tu app (lo necesitarás más adelante).
En el menú desplegable que aparece, haz clic en Product > Archive. Selecciona el archivo más reciente y, luego, haz clic en Distribute App.
En la ventana que aparece, haz clic en Development > Next.
Opcional: Para acelerar la compilación, desmarca la opción Rebuild from Bitcode y, luego, haz clic en Next. Test Lab no requiere reducir ni volver a compilar la app para ejecutar una prueba, por lo que puedes inhabilitar esta opción de forma segura.
Haz clic en Export y, luego, ingresa el directorio en el que quieres descargar el archivo IPA de la app.
Paso 5: Verifica la firma de tu app
- Verifica la firma de la app. Para ello, descomprime el archivo .ipa y, luego, ejecuta
codesign --verify --deep --verbose /path/to/MyApp.app
, en el cual “MyApp” es el nombre de la app dentro de la carpeta descomprimida (varía según cada proyecto). El resultado esperado esMyApp.app: valid on disk
.
Paso 6: Ejecuta la prueba de manera local
Puedes ejecutar tu prueba de manera local para verificar su comportamiento antes de ejecutarla en Test Lab. Si quieres realizar una prueba local, carga tu app de videojuegos en un simulador y ejecuta lo siguiente:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Ejecuta el comando
instruments -s devices
para buscar el UDID del simulador.Si solo hay un simulador en ejecución, ingresa la string especial
"booted"
en lugar de SIMULATOR_UDID.
Si la prueba contiene varios bucles, pasa el número del bucle a la marca scenario
para especificar el que quieres ejecutar. Ten en cuenta que solo puedes ejecutar un bucle a la vez cuando ejecutas la prueba de forma local. Por ejemplo,
si deseas ejecutar los bucles 1, 2 y 5, debes ejecutar un comando distinto por cada bucle:
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
Próximos pasos
Ejecuta tu prueba con Firebase console o con gcloud CLI.