Beginnen Sie mit Game Loop-Tests für iOS

Mit Game-Loop-Tests können Sie native Tests für Ihre Spiel-Engine schreiben und diese dann im Testlabor auf Geräten Ihrer Wahl ausführen. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, für verschiedene Benutzeroberflächen zu schreiben oder Frameworks zu testen. Ein Game Loop-Test simuliert die Aktionen eines echten Spielers. Wenn Sie ihn im Test Lab ausführen, bietet er eine schnelle und skalierbare Möglichkeit, zu überprüfen, ob Ihr Spiel für Ihre Benutzer gut funktioniert.

Auf dieser Seite erfahren Sie, wie Sie einen Game-Loop-Test durchführen und anschließend Ihre Testergebnisse auf der Testlaborseite der Firebase-Konsole anzeigen und verwalten. Sie können Ihre Tests auch mit optionalen Funktionen weiter anpassen, z. B. durch das Schreiben benutzerdefinierter Testergebnisse oder das vorzeitige Beenden Ihres Tests .

Was ist ein Game-Loop-Test?

Eine Schleife ist ein vollständiger oder teilweiser Durchlauf Ihres Tests in Ihrer Gaming-App. Sie können einen Game Loop-Test lokal auf einem Simulator oder auf einer Reihe von Geräten im Testlabor ausführen. Game-Loop-Tests können verwendet werden, um:

  • Spielen Sie Ihr Spiel so, wie ein Endbenutzer es spielen würde. Sie können entweder die Eingaben des Benutzers skripten, den Benutzer untätig lassen oder den Benutzer durch eine KI ersetzen (wenn Sie beispielsweise KI in einem Autorennspiel implementiert haben, können Sie einen KI-Fahrer mit der Verantwortung für die Eingaben des Benutzers betrauen). .

  • Führen Sie Ihr Spiel mit der höchsten Qualitätseinstellung aus, um herauszufinden, welche Geräte es unterstützen.

  • Führen Sie einen technischen Test durch, z. B. das Kompilieren mehrerer Shader, deren Ausführung und das Überprüfen, ob die Ausgabe wie erwartet ist.

Schritt 1: Registrieren Sie das benutzerdefinierte URL-Schema von Test Lab

Zuerst müssen Sie das benutzerdefinierte URL-Schema von Firebase Test Lab in Ihrer App registrieren:

  1. Wählen Sie in Xcode ein Projektziel aus.

  2. Klicken Sie auf die Registerkarte „Info“ und fügen Sie dann einen neuen URL-Typ hinzu.

  3. Geben Sie im Feld „URL-Schemata“ firebase-game-loop ein. Sie können das benutzerdefinierte URL-Schema auch registrieren, indem Sie es an einer beliebigen Stelle im <dict> -Tag zur Info.plist Konfigurationsdatei Ihres Projekts hinzufügen:

    <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>
    

Ihre App ist jetzt für die Ausführung eines Tests mit Test Lab konfiguriert.

Schritt 2 (optional): Konfigurieren Sie Ihre App für die Ausführung mehrerer Schleifen

Wenn für Ihre App mehrere benutzerdefinierte URL-Schemata registriert sind und Sie planen, in Ihrem Test mehrere Schleifen (auch Szenarien genannt) auszuführen, müssen Sie angeben, welche Schleifen Sie zum Startzeitpunkt in Ihrer App ausführen möchten.

Überschreiben Sie in Ihrem App-Delegaten die Methode application(_:open:options:) :

Schnell

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
}

Ziel c

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

Wenn Sie in Ihrem Test mehrere Schleifen ausführen, wird die aktuelle Schleife als Parameter an die URL übergeben, die zum Starten der App verwendet wird. Sie können die aktuelle Schleifennummer auch erhalten, indem Sie das URLComponents Objekt analysieren, das zum Abrufen des benutzerdefinierten URL-Schemas verwendet wird:

Schnell

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

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

Schritt 3: Erstellen Sie einen Test und führen Sie ihn aus

Nachdem Sie das benutzerdefinierte URL-Schema von Test Lab registriert haben, können Sie Ihren Test in der Firebase-Konsole oder mit der gcloud Beta-CLI ausführen. Falls Sie dies noch nicht getan haben, generieren Sie eine IPA-Datei für Ihre App (Sie müssen sie später suchen).

Führen Sie einen Test in der Firebase-Konsole durch

  1. Falls noch nicht geschehen, öffnen Sie die Firebase-Konsole und erstellen Sie ein Projekt.

  2. Klicken Sie auf der Seite „Testlabor“ der Firebase-Konsole auf „Führen Sie Ihren ersten Test aus“ > „Run an iOS Game Loop“ (Run Your First Test > Run an iOS Game Loop) .

  3. Klicken Sie im Abschnitt „App hochladen“ auf „Durchsuchen“ und wählen Sie dann die IPA-Datei Ihrer App aus (falls Sie dies noch nicht getan haben, generieren Sie eine IPA-Datei für Ihre App).

  4. Optional : Wenn Sie mehrere Schleifen (auch Szenarien genannt) gleichzeitig ausführen oder bestimmte Schleifen zur Ausführung auswählen möchten, geben Sie die Schleifennummern in das Feld „Szenarien“ ein.

    Wenn Sie beispielsweise „1-3, 5“ eingeben, führt Test Lab die Schleifen 1, 2, 3 und 5 aus. Standardmäßig (wenn Sie nichts in das Feld „ Szenarien“ eingeben) führt Test Lab nur Schleife 1 aus.

  5. Wählen Sie im Abschnitt „Geräte“ ein oder mehrere physische Geräte aus, auf denen Sie Ihre App testen möchten, und klicken Sie dann auf Tests starten .

Führen Sie einen Test mit der gcloud Beta-CLI durch

  1. Falls noch nicht geschehen, konfigurieren Sie Ihre lokale gcloud SDK-Umgebung und installieren Sie dann unbedingt die gcloud-Betakomponente .

  2. Führen Sie den Befehl gcloud beta firebase test ios run und verwenden Sie die folgenden Flags, um die Ausführung zu konfigurieren:

Flags für Game-Loop-Tests
--type

Erforderlich : Gibt die Art des iOS-Tests an, den Sie ausführen möchten. Sie können die Testtypen xctest (Standard) oder game-loop eingeben.

--app

Erforderlich : Absoluter Pfad (Google Cloud Storage oder Dateisystem) zur IPA-Datei Ihrer App. Dieses Flag ist nur gültig, wenn Game Loop-Tests ausgeführt werden.

--scenario-numbers

Die Schleifen (auch Szenarien genannt), die Sie in Ihrer App ausführen möchten. Sie können eine Schleife, eine Liste oder mehrere Schleifen oder eine Reihe von Schleifen eingeben. Die Standardschleife ist 1.

Beispielsweise führt --scenario-numbers=1-3,5 die Schleifen 1, 2, 3 und 5 aus.

--device-model

Das physische Gerät, auf dem Sie Ihren Test durchführen möchten (finden Sie heraus, welche verfügbaren Geräte Sie verwenden können).

--timeout

Die maximale Dauer, die Ihr Test ausführen soll. Sie können eine Ganzzahl eingeben, um die Dauer in Sekunden darzustellen, oder eine Ganzzahl und eine Aufzählung, um die Dauer als längere Zeiteinheit darzustellen.

Zum Beispiel:

  • --timeout=200 erzwingt die Beendigung Ihres Tests, wenn er bis zu 200 Sekunden dauert.
  • --timeout=1h erzwingt die Beendigung Ihres Tests, wenn er bis zu einer Stunde läuft.

Der folgende Befehl führt beispielsweise einen Game-Loop-Test aus, der die Schleifen 1, 4, 6, 7 und 8 auf einem iPhone 8 Plus ausführt:

gcloud beta firebase test ios run
 --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8
 --device-model=iphone8plus

Weitere Informationen zur gcloud-CLI finden Sie in der Referenzdokumentation .

Führen Sie einen Test lokal durch

Um Ihren Test lokal auszuführen, laden Sie Ihre Gaming-App in einen Simulator und führen Sie Folgendes aus:

xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
  • Sie können die UDID Ihres Simulators finden, indem Sie den Befehl instruments -s devices ausführen.

  • Wenn nur ein Simulator läuft, geben Sie anstelle von SIMULATOR_UDID die spezielle Zeichenfolge "booted" ein.

Wenn Ihr Test mehrere Schleifen enthält, können Sie angeben, welche Schleife Sie ausführen möchten, indem Sie die Schleifennummer an das scenario Flag übergeben. Beachten Sie, dass Sie bei der lokalen Ausführung Ihres Tests jeweils nur eine Schleife ausführen können. Wenn Sie beispielsweise die Schleifen 1, 2 und 5 ausführen möchten, müssen Sie für jede Schleife einen separaten Befehl ausführen:

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

Beenden Sie einen Test vorzeitig

Standardmäßig wird ein Game-Loop-Test so lange ausgeführt, bis ein Timeout von fünf Minuten erreicht ist, selbst wenn alle Schleifen ausgeführt wurden. Wenn das Timeout erreicht ist, wird der Test beendet und alle ausstehenden Schleifen werden abgebrochen. Sie können Ihren Test beschleunigen oder vorzeitig beenden, indem Sie das benutzerdefinierte URL-Schema firebase-game-loop-complete von Test Lab im AppDelegate Ihrer App aufrufen. Zum Beispiel:

Schnell

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

Ziel c

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

Ihr Game-Loop-Test beendet die aktuelle Schleife und führt die nächste Schleife aus. Wenn keine weiteren Schleifen mehr ausgeführt werden müssen, endet der Test.

Schreiben Sie benutzerdefinierte Testergebnisse

Sie können Ihren Game Loop-Test so konfigurieren, dass benutzerdefinierte Testergebnisse in das Dateisystem Ihres Geräts geschrieben werden. Auf diese Weise speichert Test Lab die Ergebnisdateien zu Beginn des Tests in einem GameLoopsResults Verzeichnis auf Ihrem Testgerät (das Sie selbst erstellen müssen). Wenn der Test endet, verschiebt Test Lab alle Dateien aus dem GameLoopResults Verzeichnis in den Bucket Ihres Projekts. Beachten Sie beim Einrichten Ihres Tests Folgendes:

  • Alle Ergebnisdateien werden unabhängig von Dateityp, Größe oder Menge hochgeladen.

  • Test Lab verarbeitet Ihre Testergebnisse erst, wenn alle Schleifen in Ihrem Test abgeschlossen sind. Wenn Ihr Test also mehrere Schleifen enthält, die Ausgaben schreiben, stellen Sie sicher, dass Sie diese an eine eindeutige Ergebnisdatei anhängen oder für jede Schleife eine Ergebnisdatei erstellen. Auf diese Weise können Sie vermeiden, dass Ergebnisse einer vorherigen Schleife überschrieben werden.

So richten Sie Ihren Test zum Schreiben benutzerdefinierter Testergebnisse ein:

  1. Erstellen Sie im Verzeichnis Documents Ihrer App ein Verzeichnis mit dem Namen GameLoopResults .

  2. Fügen Sie an einer beliebigen Stelle im Code Ihrer App (z. B. Ihrem App-Delegaten) Folgendes hinzu:

    Schnell

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

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