Erste Schritte mit Spielschleifentests für iOS

Mit Spielschleifentests können Sie Tests schreiben, die nativ für Ihre Game Engine sind, und sie dann in Test Lab auf den von Ihnen ausgewählten Geräten ausführen. So müssen Sie sich nicht um das Schreiben für verschiedene UI- oder Testframeworks kümmern. Ein Spielschleifentest simuliert die Aktionen eines echten Spielers. Wenn Sie ihn in Test Lab ausführen, können Sie schnell und skalierbar prüfen, ob Ihr Spiel für Ihre Nutzer gut funktioniert.

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

Was ist ein Spielschleifentest?

Eine Schleife ist ein vollständiger oder teilweiser Durchlauf Ihres Tests in Ihrer Gaming-App. Sie können einen Spielschleifentest lokal in einem Simulator oder auf einer Reihe von Geräten in Test Labausführen. Spielschleifentests können für Folgendes verwendet werden:

  • Ihr Spiel so durchlaufen, wie es ein Endnutzer spielen würde. Sie können die Eingabe des Nutzers skripten, den Nutzer inaktiv lassen oder den Nutzer durch eine KI ersetzen (wenn Sie beispielsweise KI in einem Autorennspiel implementiert haben, können Sie einen KI-Fahrer mit der Eingabe des Nutzers beauftragen).

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

  • Einen technischen Test ausführen, z. B. mehrere Shader kompilieren, sie ausführen und prüfen, ob die Ausgabe wie erwartet ist.

Schritt 1: Benutzerdefiniertes URL-Schema von Test Lab registrieren

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

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

  2. Klicken Sie auf den Tab 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 innerhalb des Tags <dict> zur 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 so konfiguriert, dass ein Test mit Test Lab ausgeführt werden kann.

Schritt 2 (optional): App für die Ausführung mehrerer Schleifen konfigurieren

Wenn in Ihrer App mehrere benutzerdefinierte URL-Schemata registriert sind und Sie mehrere Schleifen (auch Szenarien genannt) in Ihrem Test ausführen möchten, müssen Sie beim Start der App angeben, welche Schleifen ausgeführt werden sollen.

Überschreiben Sie in Ihrem App-Delegaten 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 abrufen, 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 von Test Lab registriert haben, können Sie Ihren 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 App. Sie müssen sie später finden.

Test in der Firebase Console ausführen

  1. Öffnen Sie die Firebase Konsole und erstellen Sie ein Projekt, falls noch nicht geschehen.

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

  3. Klicken Sie im Bereich App hochladen auf Durchsuchen und wählen Sie dann die IPA-Datei Ihrer App aus. Falls noch nicht geschehen, generieren Sie 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 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) Test Lab führt nur Schleife 1 aus.

  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. Konfigurieren Sie Ihre lokale gcloud SDK-Umgebung, falls noch nicht geschehen, und installieren Sie dann die gcloud beta-Komponente.

  2. Führen Sie den Befehl gcloud beta firebase test ios run aus und verwenden Sie die folgenden Flags, um die Ausführung 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 App. Dieses Flag ist nur gültig, wenn Spielschleifentests 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 von Schleifen oder einen Bereich von Schleifen eingeben. Die Standardschleife ist 1.

Mit --scenario-numbers=1-3,5 werden beispielsweise die Schleifen 1, 2, 3 und 5 ausgeführt.

--device-model

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

--timeout

Die maximale Dauer, die der Test laufen 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.

Beispiel:

  • --timeout=200 erzwingt das Beenden des Tests, wenn er 200 Sekunden läuft.
  • --timeout=1h erzwingt das Beenden des Tests, wenn er eine Stunde läuft.

Mit dem folgenden Befehl wird beispielsweise ein Spielschleifentest 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 Ihren 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 Sonderstring "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 Flag scenario übergeben. Beachten Sie, dass Sie beim Ausführen des Tests lokal nur eine Schleife gleichzeitig 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

Test vorzeitig beenden

Standardmäßig wird ein Spielschleifentest so lange ausgeführt, bis ein Timeout von fünf Minuten erreicht ist, auch 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 von Test Lab in Ihrem App-AppDelegate aufrufen.firebase-game-loop-complete 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 Schleife aus. Wenn keine weiteren Schleifen ausgeführt werden müssen, wird der Test beendet.

Benutzerdefinierte Testergebnisse schreiben

Sie können Ihren Spielschleifentest so konfigurieren, dass benutzerdefinierte Testergebnisse in das Dateisystem Ihres Geräts geschrieben werden. Wenn der Test gestartet wird, speichert Test Lab die Ergebnisdateien in einem GameLoopsResults Verzeichnis auf Ihrem Testgerät (das Sie selbst erstellen müssen).Test Lab Wenn der Test beendet ist, Test Lab verschiebt alle Dateien aus dem GameLoopResults Verzeichnis 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 ausgeführt wurden. Wenn Ihr Test also mehrere Schleifen enthält, die eine Ausgabe schreiben, müssen Sie sie an eine eindeutige Ergebnisdatei anhängen oder für jede Schleife eine Ergebnisdatei erstellen. So können Sie vermeiden, dass Ergebnisse aus einer vorherigen Schleife überschrieben werden.

So richten Sie Ihren Test ein, um benutzerdefinierte Testergebnisse zu schreiben:

  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. im App-Delegaten) 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];
        }
    }