Es kann schwierig sein, Spieletests zu automatisieren, wenn Spiele-Apps auf unterschiedlichen UI-Frameworks basieren. Mit Game-Loop-Tests können Sie Ihre nativen Tests in Test Lab integrieren und sie einfach auf den von Ihnen ausgewählten Geräten ausführen. In dieser Anleitung wird beschrieben, wie Sie einen Game Loop-Test für die Ausführung mit Firebase Test Lab vorbereiten.
Über Game Loop-Tests
Was ist ein Game-Loop-Test?
Ein Game-Loop-Test simuliert die Aktionen eines echten Spielers, um schnell und skalierbar zu überprüfen, ob Ihr Spiel für Ihre Benutzer gut funktioniert. 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
Wählen Sie in Xcode ein Projektziel aus.
Klicken Sie auf die Registerkarte „Info“ und fügen Sie dann einen neuen URL-Typ hinzu.
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 zurInfo.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 : Konfigurieren Sie optional Ihre App
Führen Sie mehrere Schleifen aus
Wenn 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 <UIApplicationOpenURLOptionsKey, id> *)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).
}
}
}
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:
Erstellen Sie im Verzeichnis
Documents
Ihrer App ein Verzeichnis mit dem NamenGameLoopResults
.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]; } }
Schritt 3 : Signieren Sie Ihre App
Stellen Sie sicher, dass alle Artefakte in der App signiert sind. Sie können dies beispielsweise über Xcode tun, indem Sie Signatureinstellungen wie Bereitstellungsprofil und Identität angeben. Weitere Informationen finden Sie unter: Apple Codesigning
Schritt 4 : Verpacken Sie Ihre App zum Hochladen
Generieren Sie eine IPA-Datei für Ihre App (Sie müssen sie später finden).
Klicken Sie im angezeigten Dropdown-Menü auf Produkt > Archiv . Wählen Sie das aktuellste Archiv aus und klicken Sie dann auf App verteilen .
Klicken Sie im angezeigten Fenster auf Entwicklung > Weiter .
Optional: Um einen schnelleren Build zu erhalten, deaktivieren Sie die Option „Aus Bitcode neu erstellen“ und klicken Sie dann auf „Weiter“ . Test Lab erfordert keine Ausdünnung oder Neuerstellung Ihrer App, um einen Test auszuführen, sodass Sie diese Option bedenkenlos deaktivieren können.
Klicken Sie auf „Exportieren“ und geben Sie dann ein Verzeichnis ein, in das Sie die IPA-Datei Ihrer App herunterladen möchten.
Schritt 5 : App-Signatur überprüfen
- Überprüfen Sie die App-Signatur, indem Sie die IPA-Datei entpacken und dann
codesign --verify --deep --verbose /path/to/MyApp.app
ausführen, wobei „MyApp“ der Name der App im entpackten Ordner ist (variiert je nach Projekt). ). Die erwartete Ausgabe istMyApp.app: valid on disk
.
Schritt 6 : Führen Sie Ihren Test lokal aus
Sie können Ihren Test lokal ausführen, um sein Verhalten zu überprüfen, bevor Sie ihn mit Test Lab ausführen. Um lokal zu testen, 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
Nächste Schritte
Führen Sie Ihren Test mit der Firebase-Konsole oder der gcloud-CLI aus.