Erste Schritte mit Spielschleifentests für iOS

Mit Game Loop-Tests können Sie native Tests für Ihre Game Engine schreiben und dann in Test Lab auf ausgewählten Geräten ausführen. Auf diese Weise müssen Sie sich nicht um das Schreiben für verschiedene UI- oder Test-Frameworks kümmern. Ein Game Loop-Test simuliert die Aktionen eines echten Spielers. Wenn Sie ihn auf Test Lab ausführen, können Sie schnell und skalierbar prüfen, ob Ihr Spiel für Ihre Nutzer eine gute Leistung erbringt.

Auf dieser Seite erfahren Sie, wie Sie einen Spielschleifentest ausführen und die Testergebnisse dann auf der Seite Test Lab der Firebase-Konsole ansehen und verwalten können. Sie können Ihre Tests auch mit optionalen Funktionen anpassen, z. B. benutzerdefinierte Testergebnisse schreiben oder den Test vorzeitig beenden.

Was ist ein Spielschleifentest?

Ein Loop 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 in Test Lab ausführen. Spielschleifentests können für Folgendes verwendet werden:

  • Spielen Sie Ihr Spiel so durch, wie es ein Endnutzer tun würde. Sie können die Eingabe des Nutzers entweder skripten, den Nutzer inaktiv lassen oder den Nutzer durch eine KI ersetzen. Wenn Sie beispielsweise KI in einem Autorennen implementiert haben, können Sie einen KI-Fahrer für die Eingabe des Nutzers verantwortlich machen.

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

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

Schritt 1: Benutzerdefiniertes URL-Schema für Test Lab registrieren

Zuerst musst du das benutzerdefinierte URL-Schema von Firebase Test Lab in deiner App registrieren:

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

  2. Klicken Sie auf den Tab Info und fügen Sie einen neuen URL-Typ hinzu.

  3. Geben Sie im Feld URL-Schemas den Wert firebase-game-loop ein. Sie können das Schema für benutzerdefinierte URLs auch registrieren, indem Sie es an einer beliebigen Stelle im <dict>-Tag der Konfigurationsdatei Info.plist 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): App für die Ausführung mehrerer Schleifen konfigurieren

Wenn für Ihre App mehrere benutzerdefinierte URL-Schemas registriert sind und Sie mehrere Schleifen (d. h. Szenarien) in Ihrem Test ausführen möchten, müssen Sie beim Start angeben, welche Schleifen in Ihrer App ausgeführt werden sollen.

Überschreiben Sie in Ihrem App-Delegate die Methode 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 &lt;UIApplicationOpenURLOptionsKey, id&gt; *)options {
  if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
      // ...Enter Game Loop Test logic to override application(_:open:options:).
  }
}

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

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

Schritt 3: Test erstellen und ausführen

Nachdem Sie das benutzerdefinierte URL-Schema für Test Lab registriert haben, können Sie den Test in der Firebase Console oder mit der gcloud beta CLI ausführen. Falls noch nicht geschehen, generieren Sie eine IPA-Datei für Ihre Anwendung. Sie müssen sie später wiederfinden.

Test in der Firebase-Konsole ausführen

  1. Öffnen Sie die Firebase-Konsole und erstellen Sie ein Projekt.

  2. Klicken Sie auf der Seite Test Lab der Firebase-Konsole auf Ersten Test ausführen > iOS-Game Loop ausführen.

  3. Klicken Sie im Bereich App hochladen auf Durchsuchen und wählen Sie die IPA-Datei Ihrer App aus. Erstellen Sie gegebenenfalls eine IPA-Datei für Ihre App.

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

    Wenn Sie beispielsweise „1–3, 5“ eingeben, führt Test Lab die Schleifen 1, 2, 3 und 5 aus. Wenn Sie im Feld Szenarien nichts eingeben, wird standardmäßig nur Schleife 1 durch Test Lab ausgeführt.

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

Test mit der gcloud beta-CLI ausführen

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

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

Flags für Spielschleifentests
--type

Erforderlich: Gibt den Typ 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 Anwendung. Dieses Flag ist nur gültig, wenn Spielschleifentests ausgeführt werden.

--scenario-numbers

Die Schleifen (auch Szenarien genannt), die in Ihrer App ausgeführt werden sollen. Sie können eine Schleife, eine Liste von Schleifen oder einen Bereich von Schleifen eingeben. Die Standardschleife ist 1.

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

--device-model

Das physische Gerät, auf dem Sie den Test ausführen möchten (Hier finden Sie Informationen zu den verfügbaren Geräten).

--timeout

Die maximale Dauer, für die der Test laufen soll. Sie können eine Ganzzahl eingeben, um die Dauer in Sekunden anzugeben, oder eine Ganzzahl und eine Aufzählung, um die Dauer in einer längeren Zeiteinheit anzugeben.

Beispiel:

  • Mit --timeout=200 wird der Test nach 200 Sekunden beendet.
  • --timeout=1h erzwingt, dass der Test nach einer Dauer von bis zu einer Stunde beendet wird.

Mit dem folgenden Befehl wird beispielsweise ein Game Loop-Test ausgeführt, bei dem die Schleifen 1, 4, 6, 7 und 8 auf einem iPhone 8 Plus ausgeführt werden:

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.

Test lokal ausführen

Wenn Sie den Test lokal ausführen möchten, 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 mit dem Befehl instruments -s devices ermitteln.

  • Wenn nur ein Simulator ausgeführt wird, geben Sie anstelle von SIMULATOR_UDID den speziellen String "booted" ein.

Wenn Ihr Test mehrere Schleifen enthält, können Sie angeben, welche Schleife ausgeführt werden soll, indem Sie die Schleifennummer an das scenario-Flag übergeben. Hinweis: Wenn Sie den Test lokal ausführen, können Sie jeweils nur eine Schleife ausführen. Wenn Sie beispielsweise 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

Test vorzeitig beenden

Standardmäßig wird ein Spielschleifentest so lange fortgesetzt, bis er eine Zeitüberschreitung von fünf Minuten erreicht, auch wenn alle Schleifen ausgeführt wurden. Wenn das Zeitlimit erreicht ist, wird der Test beendet und alle ausstehenden Schleifen werden abgebrochen. Sie können den Test beschleunigen oder vorzeitig beenden, indem Sie das benutzerdefinierte URL-Schema von Test Labfirebase-game-loop-complete in der AppDelegate-Datei Ihrer App aufrufen. Beispiel:

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) {}];
}

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

Benutzerdefinierte Testergebnisse schreiben

Du kannst deinen Spielschleifentest so konfigurieren, dass benutzerdefinierte Testergebnisse in das Dateisystem deines Geräts geschrieben werden. So speichert Test Lab beim Starten des Tests die Ergebnisdateien in einem GameLoopsResults-Verzeichnis auf Ihrem Testgerät, das Sie selbst erstellen müssen. Nach dem Test verschiebt Test Lab alle Dateien aus dem Verzeichnis GameLoopResults in den Bucket Ihres Projekts. Beachten Sie beim Einrichten des Tests Folgendes:

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

  • Test Lab verarbeitet Ihre Testergebnisse erst, wenn alle Schleifen in Ihrem Test abgeschlossen sind. Wenn Ihr Test mehrere Schleifen enthält, die Ausgabe schreiben, müssen Sie sie einer einzelnen Ergebnisdatei anhängen oder für jede Schleife eine Ergebnisdatei erstellen. Auf diese Weise können Sie verhindern, dass Ergebnisse aus einer vorherigen Schleife überschrieben werden.

So richten Sie Ihren Test so ein, dass benutzerdefinierte Testergebnisse geschrieben werden:

  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. in Ihrem App-Delegate) Folgendes hinzu:

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