Es kann schwierig sein, Spieletests zu automatisieren, wenn Gaming-Apps auf verschiedenen UI-Frameworks basieren. Mit Spielschleifentests können Sie Ihre nativen Tests in Test Lab einbinden und sie ganz einfach auf den von Ihnen ausgewählten Geräten ausführen. In dieser Anleitung wird beschrieben, wie Sie einen Spielschleifentest für die Ausführung mit Firebase Test Lab vorbereiten.
Spielschleifentests
Was ist ein Spielschleifentest?
Bei einem Spielschleifentest werden die Aktionen eines echten Spielers simuliert, um schnell und skalierbar zu prüfen, ob Ihr Spiel für Ihre Nutzer gut funktioniert. Eine Schleife ist eine vollständige oder teilweise Ausführung Ihres Tests in Ihrer Gaming-App. Sie können einen Spielschleifentest lokal auf einem Simulator oder auf einer Reihe von Geräten in Test Lab ausfü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 durchfü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
Wählen Sie in Xcode ein Projektziel aus.
Klicken Sie auf den Tab Info und fügen Sie dann einen neuen URL-Typ hinzu.
Geben Sie im Feld URL-Schemata
firebase-game-loopein. Sie können das benutzerdefinierte URL-Schema auch registrieren, indem Sie es der KonfigurationsdateiInfo.plistIhres Projekts an einer beliebigen Stelle innerhalb des Tags<dict>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: App optional konfigurieren
Mehrere Schleifen ausführen
Wenn Sie in Ihrem Test mehrere Schleifen (auch Szenarien genannt) 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 <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, 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).
}
}
}
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 den Test beschleunigen oder vorzeitig beenden, indem Sie das benutzerdefinierte URL-Schema von Test Lab in Ihrem 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) {}];
}
Bei einem Spielschleifentest wird die aktuelle Schleife beendet und die nächste Schleife ausgeführt. 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, Test Lab
speichert Test Lab die Ergebnisdateien in einem GameLoopsResults Verzeichnis auf Ihrem Test
gerät, das Sie selbst erstellen müssen. 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:
Erstellen Sie im Verzeichnis
DocumentsIhrer App ein Verzeichnis mit dem NamenGameLoopResults.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]; } }
Schritt 3: App signieren
Achten Sie darauf, dass alle Artefakte in der App signiert sind. Sie können dies beispielsweise in Xcode tun, indem Sie Signierungseinstellungen wie Bereitstellungsprofil und Identität angeben. Weitere Informationen finden Sie unter Apple Codesigning.
Schritt 4: App für den Upload packen
Generieren Sie eine IPA-Datei für Ihre App. Sie müssen sie später finden.
Klicken Sie im Drop-down-Menü auf Produkt > Archivieren. Wählen Sie das neueste Archiv aus und klicken Sie auf App verteilen.
Klicken Sie im angezeigten Fenster auf Entwicklung > Weiter.
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.appausführen .Dabei ist „MyApp“ der Name der App im entpackten Ordner (variiert je nach Projekt). Die erwartete Ausgabe istMyApp.app: valid on disk.
Schritt 6: Test lokal ausführen
Sie können Ihren Test lokal ausführen, um sein Verhalten zu prüfen, bevor Sie ihn mit Test Lab ausführen. Laden Sie zum Testen lokal Ihre Gaming-App in einen Simulator und führen Sie Folgendes aus:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
Sie finden die UDID Ihres Simulators, indem Sie den Befehl
instruments -s devicesausführen.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 lokalen Ausführen des 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=1xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
Nächste Schritte
Führen Sie Ihren Test über die Firebase Konsole oder die gcloud CLI aus.