Comience con las pruebas de Game Loop para iOS

Con las pruebas de Game Loop, puedes escribir pruebas nativas para el motor de tu juego y luego ejecutarlas en Test Lab en los dispositivos que elijas. De esta manera, no necesita preocuparse por escribir para diferentes UI o marcos de prueba. Una prueba de Game Loop simula las acciones de un jugador real y, cuando la ejecutas en Test Lab, proporciona una forma rápida y escalable de verificar que tu juego funciona bien para tus usuarios.

Esta página le muestra cómo ejecutar una prueba de Game Loop y luego ver y administrar los resultados de su prueba en la página Test Lab de Firebase console. También puede personalizar aún más sus pruebas con funciones opcionales, como escribir resultados de pruebas personalizados o finalizar la prueba antes de tiempo .

¿Qué es una prueba de bucle de juego?

Un bucle es una ejecución total o parcial de su prueba en su aplicación de juegos. Puedes ejecutar una prueba de Game Loop localmente en un simulador o en un conjunto de dispositivos en Test Lab. Las pruebas de Game Loop se pueden utilizar para:

  • Ejecute su juego como lo haría un usuario final. Puedes programar la entrada del usuario, dejar que el usuario esté inactivo o reemplazarlo con una IA (por ejemplo, si implementaste IA en un juego de carreras de autos, puedes poner un controlador de IA a cargo de la entrada del usuario). .

  • Ejecute su juego con la configuración de calidad más alta para descubrir qué dispositivos pueden admitirlo.

  • Ejecute una prueba técnica, como compilar varios sombreadores, ejecutarlos y verificar que el resultado sea el esperado.

Paso 1: Registre el esquema de URL personalizado de Test Lab

Primero, debes registrar el esquema de URL personalizado de Firebase Test Lab en tu aplicación:

  1. En Xcode, seleccione un objetivo del proyecto.

  2. Haga clic en la pestaña Información y luego agregue un nuevo tipo de URL .

  3. En el campo Esquemas de URL , ingresa firebase-game-loop . También puedes registrar el esquema de URL personalizado agregándolo al archivo de configuración Info.plist de tu proyecto en cualquier lugar dentro 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>
    

Su aplicación ahora está configurada para ejecutar una prueba usando Test Lab.

Paso 2 (opcional): configura tu aplicación para ejecutar múltiples bucles

Si su aplicación tiene varios esquemas de URL personalizados registrados y planea ejecutar múltiples bucles (también conocidos como escenarios) en su prueba, debe especificar qué bucles desea ejecutar en su aplicación en el momento del lanzamiento.

En el delegado de tu aplicación, anula el método application(_:open:options:) :

Rápido

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
}

C objetivo

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

Cuando ejecuta varios bucles en su prueba, el bucle actual se pasa como parámetro a la URL utilizada para iniciar la aplicación. También puede obtener el número de bucle actual analizando el objeto URLComponents utilizado para recuperar el esquema de URL personalizado:

Rápido

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

C objetivo

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: crear y ejecutar una prueba

Después de registrar el esquema de URL personalizado de Test Lab, puedes ejecutar tu prueba en Firebase console o con la CLI beta de gcloud . Si aún no lo has hecho, genera un archivo IPA para tu aplicación (deberás localizarlo más adelante).

Ejecute una prueba en la consola Firebase

  1. Si aún no lo has hecho, abre Firebase console y crea un proyecto.

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

  3. En la sección Cargar aplicación , haga clic en Explorar y luego seleccione el archivo IPA de su aplicación (si aún no lo ha hecho, genere un archivo IPA para su aplicación).

  4. Opcional : si desea ejecutar varios bucles (también conocidos como escenarios) a la vez o seleccionar bucles específicos para ejecutar, ingrese los números de bucle en el campo Escenarios .

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

  5. En la sección Dispositivos , seleccione uno o más dispositivos físicos en los que desee probar su aplicación y luego haga clic en Iniciar pruebas .

Ejecuta una prueba con la CLI beta de gcloud

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

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

Banderas para pruebas de Game Loop
--type

Obligatorio : especifica el tipo de prueba de iOS que desea ejecutar. Puede ingresar los tipos de prueba xctest (predeterminado) o game-loop .

--app

Requerido : ruta absoluta (Google Cloud Storage o sistema de archivos) al archivo IPA de su aplicación. Esta bandera solo es válida cuando se ejecutan pruebas de Game Loop.

--scenario-numbers

Los bucles (también conocidos como escenarios) que deseas ejecutar en tu aplicación. Puede ingresar un bucle, una lista de bucles o un rango de bucles. El bucle predeterminado 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 desea realizar la prueba (descubra qué dispositivos disponibles puede usar).

--timeout

La duración máxima que desea que se ejecute su prueba. Puede 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 larga.

Por ejemplo:

  • --timeout=200 obliga a que la prueba finalice cuando se ejecuta hasta 200 segundos.
  • --timeout=1h obliga a que la prueba finalice cuando dura hasta una hora.

Por ejemplo, el siguiente comando ejecuta una prueba de Game Loop 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 .

Ejecute una prueba localmente

Para ejecutar su prueba localmente, cargue su aplicación de juegos en un simulador y ejecute:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Puede encontrar el UDID de su simulador ejecutando el comando instruments -s devices .

  • Si solo hay un simulador ejecutándose, ingrese la cadena especial "booted" en lugar de SIMULATOR_UDID .

Si su prueba contiene varios bucles, puede especificar qué bucle desea ejecutar pasando el número de bucle al indicador del scenario . Tenga en cuenta que solo puede ejecutar un bucle a la vez cuando ejecuta la prueba localmente. Por ejemplo, si desea ejecutar los bucles 1, 2 y 5, debe ejecutar un comando independiente para 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

Terminar una prueba temprano

De forma predeterminada, una prueba de Game Loop continúa ejecutándose hasta que alcanza un tiempo de espera de cinco minutos, incluso cuando se han ejecutado todos los bucles. Cuando se alcanza el tiempo de espera, la prueba finaliza y cancela cualquier bucle pendiente. Puedes acelerar tu prueba o finalizarla antes llamando al esquema de URL personalizado de Test Lab firebase-game-loop-complete en el AppDelegate de tu aplicación. Por ejemplo:

Rápido

/// End the loop by calling our custom url scheme.
func finishLoop() {
    let url = URL(string: "firebase-game-loop-complete://")!
    UIApplication.shared.open(url)
}

C objetivo

- (void)finishLoop {
  UIApplication *app = [UIApplication sharedApplication];
  [app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
      options:@{}
completionHandler:^(BOOL success) {}];
}

Su prueba de Game Loop finaliza el bucle actual y ejecuta el siguiente bucle. Cuando no quedan más bucles para ejecutar, la prueba finaliza.

Escribir resultados de pruebas personalizados

Puede configurar su prueba Game Loop para escribir resultados de prueba personalizados en el sistema de archivos de su dispositivo. De esta manera, cuando la prueba comienza a ejecutarse, Test Lab almacena los archivos de resultados en un directorio GameLoopsResults en su dispositivo de prueba (que debe crear usted mismo). Cuando finaliza la prueba, Test Lab mueve todos los archivos del directorio GameLoopResults al depósito de su proyecto. Tenga en cuenta lo siguiente al configurar su prueba:

  • Todos los archivos de resultados se cargan independientemente del tipo, tamaño o cantidad de archivo.

  • Test Lab no procesa los resultados de su prueba hasta que todos los bucles de su prueba hayan terminado de ejecutarse, por lo que si su prueba incluye múltiples bucles que escriben resultados, asegúrese de agregarlos a un archivo de resultados único o crear un archivo de resultados para cada bucle. De esta manera, puede evitar sobrescribir los resultados de un bucle anterior.

Para configurar su prueba para escribir resultados de prueba personalizados:

  1. En el directorio Documents de su aplicación, cree un directorio llamado GameLoopResults .

  2. Desde cualquier lugar del código de su aplicación (por ejemplo, su delegado de aplicación), agregue lo siguiente:

    Rápido

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

    C objetivo

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