Comienza a realizar pruebas de bucle de juego en iOS

Las pruebas de bucle de juego te permiten escribir pruebas nativas en tu motor de juego y ejecutarlas con Test Lab en los dispositivos que quieras. De esta forma, no necesitas preocuparte por escribir pruebas para diferentes frameworks de IU o de pruebas. Con las pruebas de bucle de juego se simulan las acciones de un jugador real y, cuando las ejecutas en Test Lab, proporcionan una forma rápida y escalable de verificar que tu juego tenga un buen rendimiento en los dispositivos de los usuarios.

En esta página se muestra cómo ejecutar una prueba de bucle de juego y, luego, ver y administrar los resultados en la página Test Lab de Firebase console. También puedes personalizar aún más las pruebas con funciones opcionales, como escribir resultados de pruebas personalizados o finalizar las pruebas antes.

¿Qué es una prueba de bucle de juego?

Un bucle es una ejecución completa o parcial de una prueba en tu app de videojuego. 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 la que lo jugaría un usuario final. Puedes escribir la entrada del usuario, dejar que el usuario esté inactivo o reemplazarlo con una inteligencia artificial. Por ejemplo, si tienes un videojuego de carreras de autos en el que ya tienes 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 primer lugar, debes registrar el esquema de URL personalizada de Firebase Test Lab en tu app como se muestra a continuación:

  1. En Xcode, selecciona un destino del proyecto.

  2. Haz clic en la pestaña Info y, luego, agrega un nuevo tipo de URL en URL type.

  3. 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ón Info.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 (opcional): Configura la app para ejecutar varios bucles

Si tu app tiene varios esquemas de URL personalizada registrados y planeas ejecutar varios bucles (o situaciones) en la prueba, debes especificar qué bucles 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).
      }
  }
}

Paso 3: Crea y ejecuta una prueba

Después de registrar el esquema de URL personalizada de Test Lab, puedes ejecutar la prueba en Firebase console o con la CLI en versión Beta de gcloud. Si no tienes un archivo IPA, deberás crearlo (lo necesitarás más adelante).

Ejecuta una prueba en Firebase console

  1. Si no tienes un proyecto de Firebase, abre Firebase console y crea uno.

  2. En la página Test Lab de Firebase console, haz clic en Ejecutar tu primera prueba > Ejecutar una prueba de bucle de juego de iOS.

  3. En la sección Subir app, haz clic en Explorar y, luego, selecciona el archivo IPA de la aplicación (si no tienes uno, genera un archivo IPA para tu app).

  4. Opcional: Si deseas ejecutar varios bucles (o situaciones) a la vez o seleccionar bucles específicos para ejecutar, ingresa los números de los bucles en el campo Situaciones.

    Por ejemplo, cuando ingresas “1-3, 5”, Test Lab ejecuta los bucles 1, 2, 3 y 5. De forma predeterminada (si no ingresas nada en el campo Situaciones), Test Lab solo ejecuta el bucle 1.

  5. En la sección Dispositivos, selecciona uno o más dispositivos físicos en los que quieras probar tu app y, luego, haz clic en Iniciar pruebas.

Ejecuta una prueba con la CLI en versión Beta de gcloud

  1. Si aún no lo has hecho, configura tu entorno local del SDK de gcloud y asegúrate de instalar el componente Beta de gcloud.

  2. Ejecuta el comando gcloud beta firebase test ios run y usa las siguientes marcas para configurar la ejecución:

Marcas para ejecutar pruebas de bucle de juego
--type

Obligatorio: Especifica el tipo de prueba de iOS que deseas ejecutar. Puedes ingresar los tipos de prueba xctest (predeterminado) o game-loop.

--app

Obligatorio: Ruta absoluta (GCS o sistema de archivos) al archivo IPA de la app. Esta marca solo es válida cuando se ejecutan pruebas de bucle de juego.

--scenario-numbers

Los bucles o situaciones que deseas ejecutar en tu app. Puedes ingresar un solo bucle, o bien una lista o un rango. La cantidad predeterminada de bucles es 1.

Por ejemplo, --scenario-numbers=1-3,5 ejecuta los bucles 1, 2, 3 y 5.

--device-model

El dispositivo físico en el que quieres ejecutar la prueba (descubre cuáles son los dispositivos disponibles).

--timeout

La duración máxima de ejecución de la prueba. Puedes ingresar un número entero para representar la duración en segundos o un número entero y una enumeración para representar la duración como una unidad de tiempo más extensa.

Por ejemplo:

  • --timeout=200 fuerza la finalización de la prueba cuando se ejecuta hasta por 200 segundos.
  • --timeout=1h fuerza la finalización de la prueba cuando se ejecuta hasta por una hora.

Por ejemplo, en el siguiente comando se ejecuta una prueba de bucle de juego que ejecuta los bucles 1, 4, 6, 7 y 8 en 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

Para obtener más información sobre la CLI de gcloud, consulta la documentación de referencia.

Ejecuta una prueba de forma local

Para ejecutar una prueba de forma local, carga tu app de videojuego en un simulador y ejecuta lo siguiente:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Ejecuta el comando instruments -s devices para encontrar 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

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 depósito del 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 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:

  1. En el directorio Documents de la app, crea un directorio con el nombre GameLoopResults.

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