Erste Schritte mit Spielschleifentests

Es kann schwierig sein, Spieltests zu automatisieren, wenn Gaming-Apps auf verschiedenen UI-Frameworks Mit Game Loop-Tests können Sie Ihre nativen Tests in Test Lab einbinden und ganz einfach auf ausgewählten Geräten ausführen. Bei einem Spielschleifentest wird Ihr über die Gaming-App testen und dabei die Aktionen eines echten Spielers simulieren. Dieses In der Übersicht erfährst du, wie du einen Spielschleifentest durchführst und anschließend den Test aufrufst und verwaltest. Ergebnisse in der Firebase-Konsole.

Je nach Game Engine können Sie Tests mit einer oder mehreren Schleifen implementieren. Eine Schleife ist ein vollständiger oder teilweiser Durchlauf Ihres Tests in Ihrer Gaming-App. Spielschleifen können für Folgendes verwendet werden:

  • Spielen Sie ein Level Ihres Spiels so, wie es ein Endnutzer tun würde. Sie können Sie können die Eingabe des Nutzers per Skript ausführen, den Nutzer inaktiv lassen oder den Nutzer wenn das in Ihrem Spiel sinnvoll ist (z.B. wenn Sie einen Rennwagen haben, und bereits eine KI implementiert haben. Sie können ganz einfach eine KI Fahrer die für die Eingabe der Nutzenden zuständig sind).
  • Führen Sie Ihr Spiel mit der höchsten Qualitätseinstellung aus, um zu prüfen, ob die Geräte dies unterstützen.
  • Einen technischen Test ausführen (z. B. mehrere Shader kompilieren, ausführen und prüfen, ob die Ausgabe wie erwartet ist)

Sie können einen Spielschleifentest auf einem einzelnen Testgerät, einer Reihe von Testgeräten oder am Test Lab. Wir raten jedoch davon ab, Spielschleifentests auf virtuellen Geräte, da sie eine niedrigere Framerate als physische Geräte haben.

Hinweis

Wenn Sie einen Test implementieren möchten, müssen Sie Ihre App zuerst für Game Loop-Tests konfigurieren.

  1. Fügen Sie in Ihrem App-Manifest zu activity 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>
    

    Dadurch kann Test Lab dein Spiel starten, indem es es mit einem bestimmten die Nutzerabsicht verstehen.

  2. Fügen Sie Ihrem Code (wir empfehlen innerhalb der onCreate-Methodendeklaration) Folgendes hinzu:

    Kotlin+KTX

    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 Ihre Aktivität den Intent prüfen, der sie auslöst. Sie können diesen Code auch später hinzufügen, z. B. nach dem ersten Laden der Game Engine.

  3. Empfohlen: Fügen Sie am Ende des Tests Folgendes hinzu:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Dadurch wird Ihre App geschlossen, wenn der Spielschleifentest abgeschlossen ist. Der Test basiert auf das UI-Framework Ihrer App zum Starten der nächsten Schleife. Wenn Sie die App schließen, damit der Test abgeschlossen ist.

Spielschleifentest erstellen und ausführen

Nachdem Sie Ihre App für Spielschleifentests konfiguriert haben, können Sie sofort eine testen und in Ihrer Gaming-App ausführen. Sie können einen Test in Test Lab über die Firebase-Konsole oder das gcloud Befehlszeilenschnittstelle (CLI) oder auf einem lokalen Gerät mithilfe der Testschleife Administrator.

Auf einem lokalen Gerät ausführen

Der Test Loop Manager von Test Lab ist eine Open-Source-App, mit der Sie Spielschleifentests integrieren und auf Ihren lokalen Geräten ausführen können. Außerdem können Ihre Qualitätssicherungsteam, um dieselben Spielschleifen auf ihren Geräten auszuführen.

So führen Sie einen Test auf einem lokalen Gerät mit dem Test Loop Manager aus:

  1. Laden Sie den Test Loop Manager auf ein Smartphone oder Tablet herunter und installieren Sie ihn mit dem Befehl:
    adb install testloopmanager.apk
  2. Öffne auf deinem Gerät die App Test Loop Apps auf deinem Smartphone oder Tablet. Die App zeigt eine Liste der Apps auf Ihrem Gerät an, die mit Game Loops ausgeführt werden können. Wenn du deine Gaming-App hier nicht siehst, stimmt Ihr Intent-Filter mit dem Filter überein, der im ersten Schritt der Abschnitt „Vorbereitung“:
  3. Wähle deine Gaming-App und dann die Anzahl der Loops aus, die du ausführen möchtest. Hinweis: In diesem Schritt können Sie statt nur einer Schleife eine Teilmenge von Schleifen ausführen. Weitere Informationen zu Ausführen mehrerer Schleifen gleichzeitig, siehe Optionale Funktionen.
  4. Klicken Sie auf Testen. Ihr Test beginnt sofort.

Ausführung in Test Lab

Sie können einen Game Loop-Test in Test Lab entweder mit der Firebase Console oder der gcloud CLI ausführen. Bevor Sie öffnen, falls noch nicht geschehen, Firebase-Konsole und erstellen Sie ein Projekt.

Firebase-Konsole verwenden

  1. Klicken Sie in der Firebase-Konsole im linken Bereich auf Test Lab.
  2. Klicken Sie auf Run Your First Test (Ersten Test ausführen) oder Run a Test (Test ausführen), wenn Ihr Projekt zuvor einen Test durchgeführt haben.
  3. Wählen Sie als Testtyp Game Loop aus und klicken Sie auf Weiter.
  4. Klicken Sie auf Durchsuchen und suchen Sie die Datei .apk Ihrer Anwendung. Hinweis: In diesem Schritt können Sie statt einer Schleife eine Teilmenge von Schleifen ausführen. Weitere Informationen zum Ausführen mehrerer Schleifen gleichzeitig finden Sie unter Optionale Funktionen.
  5. Klicken Sie auf Weiter.
  6. Wählen Sie die physischen Geräte aus, die zum Testen Ihrer App verwendet werden sollen.
  7. Klicken Sie auf Tests starten.

Weitere Informationen zu den ersten Schritten mit der Firebase Console finden Sie unter Tests mit der Firebase Console starten.

gcloud-Befehlszeile verwenden

  1. Laden Sie das Google Cloud SDK herunter und installieren Sie es, falls noch nicht geschehen.

  2. Melden Sie sich mit Ihrem Google-Konto in der gcloud CLI an:

    gcloud auth login

  3. Legen Sie Ihr Firebase-Projekt in gcloud fest, wobei PROJECT_ID ist ID Ihres Firebase-Projekts:

    gcloud config set project PROJECT_ID
    
  4. Führen Sie Ihren ersten Test aus:

    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 zum Schreiben von Ausgabedaten, die Unterstützung mehrerer Game Loops und Labels für zugehörige Loops.

Ausgabedaten schreiben

Ihr Spielschleifentest kann die Ausgabe in eine Datei schreiben, die im launchIntent.getData()-Methode. Nach einem Test können Sie auf diese Ausgabedaten im Bereich Test Lab der Firebase-Konsole zugreifen (siehe Beispiel für eine Game Loop-Testausgabedatei).

Test Lab folgt den Best Practices für die Freigabe von Dateien zwischen Apps, die unter Dateien freigeben beschrieben sind. In der onCreate()-Methode Ihrer Aktivität, also dort, wo sich Ihr Intent befindet, können Sie Ihre Datenausgabedatei überprüfen, indem Sie folgenden Code ausführen:

Kotlin+KTX

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 Spiel-App in die Datei schreiben möchten, können Sie den Dateideskriptor anstelle des Dateipfads übergeben:

Kotlin+KTX

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

Sie können Ausgabedatendateien, die wie im Beispiel unten formatiert sind, zur Darstellung des Spiels verwenden. Ergebnisse von Schleifentests im Abschnitt Test Lab der Firebase-Konsole. Bereiche, die als /.../ angezeigt werden, können beliebige benutzerdefinierte Felder enthalten, solange Sie stehen nicht in Konflikt mit den Namen anderer in dieser Datei verwendeter Felder:

{
  "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 eine von Anfang bis Ende durchläuft. Wenn Ihr Spiel beispielsweise mehrere Level hat, sollten Sie für jedes Level einen eigenen Gameloop verwenden, anstatt einen Loop, der alle Level durchläuft. Wenn deine App dann auf Level 32 abstürzt, kannst du das Spiel direkt starten. Schleife, um den Absturz zu reproduzieren und die Fehlerkorrekturen zu testen.

So aktivieren Sie für Ihre App die gleichzeitige Ausführung mehrerer Schleifen:

  • Wenn Sie einen Test mit dem Test Loop Manager ausführen:

    1. Fügen Sie dem Manifest Ihrer App die folgende Zeile innerhalb des Elements <application> hinzu:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />
      

      Dieser Start-Intent enthält die Zielschleife als Ganzzahlparameter. In Im Feld android:value können Sie eine Ganzzahl von 1 bis 1.024 angeben (das maximal zulässige Anzahl von Schleifen für einen einzelnen Test). Hinweis dass Schleifen beginnend bei 1 und nicht bei 0 indexiert werden.

    2. In der Test Loop Manager App wird ein Auswahlbildschirm angezeigt, auf dem Sie auswählen können, welche Loops ausgeführt werden sollen. Wenn Sie mehrere Schleifen auswählen, wird jede Schleife nach Abschluss der vorherigen Schleife gestartet.

  • 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 eine Liste mit Schleifennummern an. indem Sie das Flag --scenario-numbers verwenden. Beispiel: --scenario-numbers=1,3,5 führt die Schleifen 1, 3 und 5 aus.

  • Wenn Sie C++ verwenden und das Verhalten des Loops ändern möchten, übergeben Sie Ihrem nativen C++-Code Folgendes:

    Kotlin+KTX

    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 ändern. Wert.

Game Loops labeln

Wenn Sie Ihre Game Loops mit einem oder mehreren Szenariolabels versehen, können Sie und Ihr QA-Team ganz einfach eine Reihe ähnlicher Game Loops starten (z. B. "alle Kompatibilität Spielschleifen“), und testen sie in einer einzigen Matrix. Sie können eigene Labels erstellen oder Vordefinierte Labels von Test Lab verwenden:

  • com.google.test.loops.player_experience: für Schleifen, die verwendet werden, um das Spielerlebnis zu reproduzieren. Das Ziel der mit diesen Schleifen zu testen, um Probleme zu finden, mit denen echte Nutzende das Spiel spielen.
  • com.google.test.loops.gpu_compatibility: For-Schleifen, mit denen GPU-bezogene Probleme getestet werden. Ziel dieser Tests ist es, GPU-Code auszuführen, der in der Produktion möglicherweise nicht richtig ausgeführt wird, um Probleme mit Hardware und Treibern aufzudecken.
  • com.google.test.loops.compatibility: For-Schleifen, mit denen eine Vielzahl von Kompatibilitätsproblemen getestet werden kann, einschließlich E/A- und OpenSSL-Problemen.
  • com.google.test.loops.performance: For-Schleifen, mit denen die Leistung des Geräts getestet wird. So kann ein Spiel beispielsweise mit den komplexesten Grafikeinstellungen ausgeführt werden, um zu sehen, wie sich ein neues Gerät verhält.

So aktivieren Sie in Ihrer App Schleifen mit demselben Label:

  • Wenn Sie einen Test mit dem Test Loop Manager ausführen:

    1. 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:value können Sie einen Bereich oder eine Reihe von Ganzzahlen von 1 bis 1.024 (die maximal zulässige Anzahl von Schleifen für einen einzelnen Test) angeben, die die Schleifen repräsentieren, die Sie beschriften möchten. Die Schleifen werden ab 1 und nicht ab 0 indexiert. Mit android:value="1,3-5" wird LABEL_NAME beispielsweise auf die Schleifen 1, 3, 4 und 5 angewendet.

    2. Geben Sie in der Test Loop Manager App in das Feld Labels ein oder mehrere Labels ein. ein.

  • Wenn Sie einen Test mit der Firebase-Konsole ausführen, geben Sie mindestens einen Labels im Feld Labels.

  • Wenn Sie einen Test mit der gcloud CLI ausführen, geben Sie eine an Szenario-Labels erstellen, indem Sie die --scenario-labels-Flag (z.B. --scenario-labels=performance,gpu).

Support für die App-Lizenzierung

Test Lab unterstützt Apps, die den von Google Play angebotenen Dienst zur App-Lizenzierung nutzen. Damit die Lizenzierung beim Testen Ihrer App mit Test Lab überprüft werden kann, müssen Sie Ihre App im Play Store im Produktionskanal veröffentlichen. So testen Sie Ihre App in der Alpha- oder Betaversion mit Test Lab, entferne die Lizenzprüfung, bevor du deine App auf hochlädst Test Lab

Bekannte Probleme

Bei Spielschleifentests in Test Lab sind die folgenden bekannten Probleme aufgetreten:

  • Einige Abstürze unterstützen keine Backtraces. Beispielsweise können einige Release-Builds Ausgabe des Prozesses debuggerd unterdrücken mit prctl(PR_SET_DUMPABLE, 0). Weitere Informationen finden Sie unter debuggerd.
  • API-Level 19 wird aufgrund von Dateiberechtigungsfehlern derzeit nicht unterstützt.