Es kann schwierig sein, Spieltests zu automatisieren, wenn Gaming-Apps auf verschiedenen UI-Frameworks basieren. Mit Spielschleifentests können Sie Ihre nativen Tests in Test Lab einbinden und ganz einfach auf den von Ihnen ausgewählten Geräten ausführen. Bei einem Spielschleifentest wird Ihr Test über Ihre Gaming-App ausgeführt, während die Aktionen eines echten Spielers simuliert werden. In diesem Leitfaden erfahren Sie, wie Sie einen Spielschleifentest ausführen und die Testergebnisse in der Firebase Console ansehen und verwalten.
Was ist ein Spielschleifentest?
Da Gaming-Apps in verschiedenen UI-Frameworks und Engines wie Unity, Unreal oder OpenGL/Vulkan-C++-Code gerendert werden, können Standardautomatisierungstools UI-Elemente nicht prüfen oder mit ihnen interagieren. Mit einem Spielschleifentest können Sie Ihre nativen Engine-Tests in Test Lab einbinden, indem Sie Ihr Spiel mit einem Intent starten, der eine bestimmte Szenarionummer enthält. Diese Szenarionummer veranlasst Ihre App, vordefinierte Logik, KI-Simulationen oder Leistungsprüfungen direkt in Ihrer Spiel-Engine auszuführen.
Nach dem Start interagiert Test Lab nicht weiter mit der Benutzeroberfläche Ihres Spiels. Stattdessen fungiert Test Lab als Testtransport und -umgebung: Es startet das spezifische Szenario, überwacht auf Abstürze und Zeitüberschreitungen und erfasst alle benutzerdefinierten Ergebnisprotokolle, wenn Ihre App die Schleife beendet hat.
Unterschiede zwischen Spielschleifen und Instrumentierungstests
- Instrumentierungstests (z. B. Espresso oder UI Automator) basieren auf externen Frameworks, um UI-Interaktionen zu steuern, auf Schaltflächen zu klicken und den Anwendungsstatus in der Android-Ansichtshierarchie von außerhalb Ihrer App zu prüfen.
- Bei Spielschleifentests wird die Testlogik an Ihre App delegiert. Ihre App führt eine eigene interne Testschleife oder Simulation ohne externe UI-Interaktion aus, während Test Lab Ihr Szenario auslöst und die Testausgabe erfasst.
Beispiele
Angenommen, Sie möchten prüfen, ob Ihr Spiel auf verschiedenen physischen Geräten mindestens 60 Bilder pro Sekunde erreicht. Sie können Szenario 1 in Ihrem Spielcode implementieren, um das visuell komplexeste Level zu laden und es zwei Minuten lang von einem KI-Spieler oder einem automatisierten Script spielen zu lassen.
Wenn Test Lab das Szenario 1 auslöst, startet Ihr Spiel den KI-Durchlauf, überwacht die Frame-Renderingzeiten und die Arbeitsspeichernutzung, streamt diese Messwerte in eine benutzerdefinierte Ausgabeprotokolldatei (logFile) und ruft finish() auf, wenn der Vorgang abgeschlossen ist.
Test Lab erfasst dann die Logdatei und stellt sie Ihnen in Cloud Storage und der Firebase-Konsole zur Verfügung.
Anwendungsfälle
Je nach Spiel-Engine können Sie Tests mit einer oder mehreren Schleifen implementieren. Eine Schleife ist ein vollständiger oder teilweiser Durchlauf des Tests Ihrer Gaming-App. Spielschleifen können für Folgendes verwendet werden:
- Führen Sie ein Level Ihres Spiels so aus, wie es ein Endnutzer spielen würde. Du kannst entweder die Eingabe des Nutzers skripten, den Nutzer inaktiv lassen oder den Nutzer durch eine KI ersetzen, wenn das in deinem Spiel sinnvoll ist. Wenn du beispielsweise eine Rennspiel-App hast und bereits eine KI implementiert hast, kannst du einen KI-Fahrer für die Eingabe des Nutzers verantwortlich machen.
- Führen Sie Ihr Spiel mit der höchsten Qualitätseinstellung aus, um zu sehen, ob Geräte diese unterstützen.
- Führen Sie einen technischen Test durch (kompilieren Sie mehrere Shader, führen Sie sie aus, prüfen Sie, ob die Ausgabe wie erwartet ist usw.).
Sie können einen Spielschleifentest auf einem einzelnen Testgerät, einer Reihe von Testgeräten oder auf Test Lab ausführen. Wir empfehlen jedoch nicht, Spielschleifentests auf virtuellen Geräten auszuführen, da diese niedrigere Grafik-Frameraten als physische Geräte haben.
Hinweis
Wenn Sie einen Test implementieren möchten, müssen Sie Ihre App zuerst für Spielschleifentests konfigurieren.
Fügen Sie im App-Manifest Ihrer Aktivität einen neuen Intent-Filter hinzu:
<activity android:name=".MyActivity"> <intent-filter> <action android:name="com.google.intent.action.TEST_LOOP"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/javascript"/> </intent-filter> <intent-filter> ... (other intent filters here) </intent-filter> </activity>So kann Test Lab dein Spiel starten, indem es mit einem bestimmten Intent ausgelöst wird.
Fügen Sie in Ihrem Code (wir empfehlen innerhalb der Methodendeklaration
onCreate) Folgendes hinzu:Kotlin
val launchIntent = intent if (launchIntent.action == "com.google.intent.action.TEST_LOOP") { val scenario = launchIntent.getIntExtra("scenario", 0) // Code to handle your game loop here }
Java
Intent launchIntent = getIntent(); if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) { int scenario = launchIntent.getIntExtra("scenario", 0); // Code to handle your game loop here }
So kann die Aktivität den Intent prüfen, der sie startet. Sie können diesen Code auch später hinzufügen, z.B. nach dem ersten Laden Ihrer Spiel-Engine.
Empfohlen: Fügen Sie am Ende des Tests Folgendes hinzu:
Kotlin
yourActivity.finish()
Java
yourActivity.finish();
Dadurch wird Ihre App geschlossen, wenn der Spielschleifentest abgeschlossen ist. Der Test basiert auf dem UI-Framework Ihrer App, um die nächste Schleife zu starten. Wenn Sie Ihre App schließen, wird dem Test mitgeteilt, dass er beendet ist.
Spielschleifentest erstellen und ausführen
Nachdem Sie Ihre App für Spielschleifentests konfiguriert haben, können Sie sofort einen Test erstellen und in Ihrer Gaming-App ausführen. Sie können einen Test in Test Lab entweder über die Firebase-Konsole oder die gcloud-Befehlszeile (CLI) oder auf einem lokalen Gerät mit dem Testschleifen-Manager ausführen.
Auf einem lokalen Gerät ausführen
Der Testschleifen-Manager von Test Lab ist eine Open-Source-App, mit der Sie Spielschleifentests einbinden und auf Ihren lokalen Geräten ausführen können. Außerdem kann Ihr Qualitätssicherungsteam dieselben Spielschleifen auf seinen Geräten ausführen.
So führen Sie einen Test auf einem lokalen Gerät mit dem Testschleifen-Manager aus:
- Laden Sie den Testschleifen-Manager auf ein Smartphone oder Tablet herunter und installieren Sie ihn mit folgendem Befehl:
adb install testloopmanager.apk
- Öffnen Sie auf Ihrem Gerät die App Test Loop Apps auf Ihrem Smartphone oder Tablet. In der App wird eine Liste der Apps auf Ihrem Gerät angezeigt, die mit Spielschleifen ausgeführt werden können. Wenn Ihre Gaming-App hier nicht angezeigt wird, prüfen Sie, ob Ihr Intent-Filter mit dem im ersten Schritt des Abschnitts Vorbereitung beschriebenen Filter übereinstimmt.
- Wählen Sie Ihre Gaming-App und dann die Anzahl der Schleifen aus, die Sie ausführen möchten. Hinweis: In diesem Schritt können Sie eine Teilmenge von Schleifen anstelle von nur einer Schleife ausführen. Weitere Informationen zum gleichzeitigen Ausführen mehrerer Schleifen finden Sie unter Optionale Funktionen.
- Klicken Sie auf Testen. Der Test beginnt sofort.
In Test Lab laufen
Sie können einen Spielschleifentest in Test Lab entweder mit der Firebase-Console oder der gcloud CLI ausführen. Öffnen Sie zuerst die Firebase Console und erstellen Sie ein Projekt, falls Sie das noch nicht getan haben.
Firebase Console verwenden
- Klicken Sie in der Firebase-Konsole im linken Bereich auf Test Lab.
- Klicken Sie auf Ersten Test ausführen (oder auf Test ausführen, wenn in Ihrem Projekt bereits ein Test ausgeführt wurde).
- Wählen Sie als Testtyp Spielschleife aus und klicken Sie auf Weiter.
- Klicken Sie auf Durchsuchen und suchen Sie die Datei
.apkIhrer Anwendung. Hinweis: In diesem Schritt können Sie eine Teilmenge von Schleifen anstelle von nur einer Schleife ausführen. Weitere Informationen zum gleichzeitigen Ausführen mehrerer Schleifen finden Sie unter Optionale Funktionen. - Klicken Sie auf Weiter.
- Wählen Sie die physischen Geräte aus, mit denen Sie Ihre App testen möchten.
- Klicken Sie auf Tests starten.
Weitere Informationen zu den ersten Schritten mit der Firebase-Konsole finden Sie unter Mit der Firebase-Konsole testen.
gcloud-Befehlszeile (CLI) verwenden
Laden Sie das Google Cloud SDK herunter und installieren Sie es, falls noch nicht geschehen.
Melden Sie sich mit Ihrem Google-Konto in der gcloud CLI an:
gcloud auth loginLegen Sie Ihr Firebase-Projekt in gcloud fest, wobei
PROJECT_IDdie ID Ihres Firebase-Projekts ist:gcloud config set project PROJECT_ID
Ersten Test ausführen:
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
Weitere Informationen zu den ersten Schritten mit der gcloud CLI finden Sie unter Tests über die gcloud-Befehlszeile starten.
Optionale Funktionen
Test Lab bietet mehrere optionale Funktionen, mit denen Sie Ihre Tests weiter anpassen können. Dazu gehören die Möglichkeit, Ausgabedaten zu schreiben, die Unterstützung mehrerer Spielschleifen und Labels für verwandte Schleifen.
Ausgabedaten schreiben
Wenn Test Lab Ihr Spiel startet, wird eine URL angegeben, die auf eine lokale Ergebnisdatei auf dem Testgerät verweist, auf die über launchIntent.getData() zugegriffen werden kann. Ihr Spiel kann während des Testlaufs Testergebnisse, Leistungsmesswerte und Logs (logFile) direkt in diesen Speicherort schreiben.
Sie können beliebige Inhalte in die logFile schreiben, z. B. Nur-Text, CSV-Daten, Frame-Renderingzeiten oder benutzerdefinierte Diagnoseberichte. Es gibt keine Einschränkungen oder Formatierungsanforderungen für die von Ihnen geschriebenen Inhalte. Die Datei wird nach Abschluss des Tests erfasst und zusammen mit Ihren anderen Testartefakten in Ihren Cloud Storage-Bucket hochgeladen.
Test Lab folgt den Best Practices für die Freigabe einer Datei zwischen Apps, die unter Datei freigeben beschrieben sind.
In der onCreate()-Methode Ihrer Aktivität, in der sich Ihr Intent befindet, können Sie die Datenausgabedatei mit dem folgenden Code abrufen und prüfen:
Kotlin
val launchIntent = intent val logFile = launchIntent.data logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") // ... }
Java
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); // ... }
Wenn Sie von der C++-Seite Ihrer Gaming-App in die Datei schreiben möchten, können Sie den Dateideskriptor anstelle des Dateipfads übergeben:
Kotlin
val launchIntent = intent val logFile = launchIntent.data var fd = -1 logFile?.let { Log.i(TAG, "Log file ${it.encodedPath}") fd = try { contentResolver .openAssetFileDescriptor(logFile, "w")!! .parcelFileDescriptor .fd } catch (e: FileNotFoundException) { e.printStackTrace() -1 } catch (e: NullPointerException) { e.printStackTrace() -1 } } // C++ code invoked here. // native_function(fd);
Java
Intent launchIntent = getIntent(); Uri logFile = launchIntent.getData(); int fd = -1; if (logFile != null) { Log.i(TAG, "Log file " + logFile.getEncodedPath()); try { fd = getContentResolver() .openAssetFileDescriptor(logFile, "w") .getParcelFileDescriptor() .getFd(); } catch (FileNotFoundException e) { e.printStackTrace(); fd = -1; } catch (NullPointerException e) { e.printStackTrace(); fd = -1; } } // C++ code invoked here. // native_function(fd);
C++
#include <unistd.h> JNIEXPORT void JNICALL Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) { // The file descriptor needs to be duplicated. int my_file_descriptor = dup(log_file_descriptor); }
Beispiel für eine Ausgabedatei
Test Lab erfordert zwar kein bestimmtes Format für Ihre logFile, aber wenn Sie Ihre Ausgabe als JSON-Datei strukturieren, die dem unten stehenden Schema entspricht, kann die Firebase-Konsole (https://console.firebase.google.com/project/_/testlab) zusammenfassende Messwerte für Ihren Spielschleifentest parsen und anzeigen.
Wichtige Details zu diesem Beispiel:
- Wer stellt die Daten bereit? Du (der Testentwickler) bist dafür verantwortlich, alle Messwerte aus deinem Spielcode zu berechnen und in diese Datei zu schreiben. Test Lab erhebt oder generiert diese Datenpunkte nicht automatisch für Sie.
- Benutzerdefinierte Felder hinzufügen: Bereiche, die mit
/.../gekennzeichnet sind, geben an, wo Sie beliebige benutzerdefinierte Schlüssel/Wert-Paare hinzufügen können (z. B."rendered_vertices": 12000oder"ai_error_count": 0). Sie können Ihrer Ausgabe ein beliebiges gültiges JSON-Attribut hinzufügen, wenn Sie die Datei aus Ihrer App schreiben, solange die Feldnamen nicht mit Schemafeldern wienameoderstart_timestampin Konflikt stehen. - Wo Sie die Ausgabedatei finden: Nach Abschluss des Tests wird die Rohausgabedatei im Cloud Storage-Ergebnis-Bucket (
GCS) Ihres Projekts im Artefaktverzeichnis des Testlaufs gespeichert und kann heruntergeladen werden. Sie können die geparste Ausgabe auch auf der Seite Test Lab der Firebase Console ansehen und prüfen.
Hier sehen Sie ein Beispiel für eine strukturierte JSON-Ausgabedatei:
{
"name": "test name",
"start_timestamp": 0, // Timestamp of the test start (in us).
Can be absolute or relative
"driver_info": "...",
"frame_stats": [
{
"timestamp": 1200000, // Timestamp at which this section was written
It contains value regarding the period
start_timestamp(0) -> this timestamp (1200000 us)
"avg_frame_time": 15320, // Average time to render a frame in ns
"nb_swap": 52, // Number of frame rendered
"threads": [
{
"name": "physics",
"Avg_time": 8030 // Average time spent in this thread per frame in us
},
{
"name": "AI",
"Avg_time": 2030 // Average time spent in this thread per frame in us
}
],
/.../ // Any custom field you want (vertices display on the screen, nb units …)
},
{
// Next frame data here, same format as above
}
],
"loading_stats": [
{
"name": "assets_level_1",
"total_time": 7850, // in us
/.../
},
{
"name": "victory_screen",
"total_time": 554, // in us
/.../
}
],
/.../, // You can add custom fields here
}
Mehrere Spielschleifen
Es kann nützlich sein, mehrere Spielschleifen in Ihrer App auszuführen. Eine Schleife ist ein vollständiger Durchlauf Ihrer Gaming-App von Anfang bis Ende. Wenn Ihr Spiel beispielsweise mehrere Level hat, können Sie für jedes Level eine Spielschleife starten, anstatt eine Schleife zu verwenden, die alle Level durchläuft. Wenn Ihre App also auf Level 32 abstürzt, können Sie diese Spielschleife direkt starten, um den Absturz zu reproduzieren und Fehlerkorrekturen zu testen.
So ermöglichen Sie, dass in Ihrer App mehrere Schleifen gleichzeitig ausgeführt werden:
Wenn Sie einen Test mit dem Testschleifen-Manager ausführen:
Fügen Sie dem Manifest Ihrer App im
<application>-Element die folgende Zeile hinzu:<meta-data android:name="com.google.test.loops" android:value="5" />
Dieser Start-Intent enthält die Zielschleife als Ganzzahlparameter. Im Feld
android:valuekönnen Sie eine Ganzzahl von 1 bis 1024 angeben (die maximal zulässige Anzahl von Schleifen für einen einzelnen Test). Beachten Sie, dass Schleifen ab 1 und nicht ab 0 indexiert werden.In der Testschleifen-Manager-App wird ein Auswahlbildschirm angezeigt, auf dem Sie die Schleifen auswählen können, die Sie ausführen möchten. Wenn Sie mehrere Schleifen auswählen, wird jede Schleife nacheinander gestartet, nachdem die vorherige Schleife abgeschlossen ist.
Wenn Sie einen Test mit der Firebase-Konsole ausführen, geben Sie im Feld Szenarien eine Liste oder einen Bereich von Schleifennummern ein.
Wenn Sie einen Test mit der gcloud CLI ausführen, geben Sie mit dem Flag
--scenario-numberseine Liste von Schleifennummern an. Beispiel:--scenario-numbers=1,3,5führt die Schleifen 1, 3 und 5 aus.Wenn Sie C++ schreiben und das Verhalten Ihrer Schleife ändern möchten, übergeben Sie den folgenden zusätzlichen Parameter an Ihren nativen C++-Code:
Kotlin
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Java
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
Sie können jetzt das Verhalten der Schleife basierend auf dem resultierenden
int-Wert ändern.
Spielschleifen mit Labels versehen
Wenn Sie Ihre Spielschleifen mit einem oder mehreren Szenariolabels versehen, können Sie und Ihr QA-Team ganz einfach eine Reihe zusammengehöriger Spielschleifen (z.B. „alle Kompatibilitätsspielschleifen“) starten und in einer einzigen Matrix testen. Sie können eigene Labels erstellen oder die vordefinierten Labels von Test Lab verwenden:
com.google.test.loops.player_experience: For-Schleifen, mit denen die Erfahrung eines echten Nutzers beim Spielen des Spiels reproduziert wird. Das Ziel von Tests mit diesen Schleifen besteht darin, Probleme zu finden, die bei echten Nutzern während des Spielens auftreten würden.com.google.test.loops.gpu_compatibility: For-Schleifen, die zum Testen von GPU-bezogenen Problemen verwendet werden. Das Ziel von Tests mit diesen Schleifen besteht darin, GPU-Code auszuführen, der in der Produktion möglicherweise nicht ordnungsgemäß ausgeführt wird, um Probleme mit Hardware und Treibern aufzudecken.com.google.test.loops.compatibility: For-Schleifen, die zum Testen einer Vielzahl von Kompatibilitätsproblemen verwendet werden, einschließlich E/A- und OpenSSL-Problemen.com.google.test.loops.performance: For-Schleifen, die zum Testen der Geräteleistung verwendet werden. Ein Spiel kann beispielsweise mit den komplexesten Grafikeinstellungen ausgeführt werden, um zu sehen, wie sich ein neues Gerät verhält.
So ermöglichen Sie, dass Ihre App Schleifen mit demselben Label ausführt:
Wenn Sie einen Test mit dem Testschleifen-Manager ausführen:
Fügen Sie im Manifest Ihrer App die folgende Metadatenzeile hinzu und ersetzen Sie LABEL_NAME durch ein Label Ihrer Wahl:
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
Im Feld
android:valuekönnen Sie einen Bereich oder eine Reihe von Ganzzahlen von 1 bis 1024 (die maximal zulässige Anzahl von Schleifen für einen einzelnen Test) angeben, die die Schleifen darstellen, die Sie kennzeichnen möchten. Beachten Sie, dass Schleifen ab 1 und nicht ab 0 indexiert werden. Beispiel:android:value="1,3-5"wendet LABEL_NAME auf die Schleifen 1, 3, 4 und 5 an.Geben Sie in der Testschleifen-Manager App ein oder mehrere Labels in das Feld Labels ein.
Wenn Sie einen Test mit der Firebase Console ausführen, geben Sie ein oder mehrere Labels in das Feld Labels ein.
Wenn Sie einen Test mit der gcloud CLI ausführen, geben Sie mit dem Flag
--scenario-labelsein oder mehrere Szenariolabels an (z.B.--scenario-labels=performance,gpu).
Support für die App-Lizenzierung
Test Lab unterstützt Apps, die den von Google Play angebotenen Dienst App-Lizenzierung verwenden. Damit die Lizenzierung beim Testen deiner App mit Test Lab erfolgreich geprüft werden kann, musst du deine App im Produktionskanal im Google Play Store veröffentlichen. Wenn Sie Ihre App im Alpha- oder Betaversion-Kanal mit Test Lab testen möchten, entfernen Sie die Lizenzprüfung, bevor Sie Ihre App in Test Lab hochladen.
Bekannte Probleme
Bei Spielschleifentests in Test Lab gibt es die folgenden bekannten Probleme:
- Bei einigen Abstürzen werden keine Backtraces unterstützt. Bei einigen Release-Builds wird beispielsweise die Ausgabe des
debuggerd-Prozesses mitprctl(PR_SET_DUMPABLE, 0)unterdrückt. Weitere Informationen finden Sie unterdebuggerd. - API-Level 19 wird derzeit aufgrund von Dateiberechtigungsfehlern nicht unterstützt.