Beginnen Sie mit Game Loop-Tests

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. Ein Game-Loop-Test führt Ihren Test über Ihre Gaming-App durch und simuliert dabei die Aktionen eines echten Spielers. In dieser Anleitung erfahren Sie, wie Sie einen Game Loop-Test durchführen und anschließend Ihre Testergebnisse in der Firebase-Konsole anzeigen und verwalten.

Abhängig von Ihrer Spiel-Engine können Sie Tests mit einzelnen oder mehreren Schleifen implementieren. Eine Schleife ist ein vollständiger oder teilweiser Durchlauf Ihres Tests in Ihrer Gaming-App. Spielschleifen können verwendet werden, um:

  • Führen Sie ein Level Ihres Spiels auf die gleiche Weise aus, 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 dies in Ihrem Spiel sinnvoll ist (z. B. wenn Sie eine Rennwagen-Gaming-App haben und bereits eine KI implementiert haben). Das ist möglich Sie können ganz einfach einen KI-Treiber mit der Verantwortung für die Eingaben des Benutzers beauftragen.
  • Führen Sie Ihr Spiel mit der höchsten Qualitätseinstellung aus, um zu sehen, ob die Geräte dies unterstützen.
  • Führen Sie einen technischen Test durch (kompilieren Sie mehrere Shader, führen Sie sie aus, überprüfen Sie, ob die Ausgabe wie erwartet ist usw.).

Sie können einen Game Loop-Test auf einem einzelnen Testgerät, einer Reihe von Testgeräten oder im Testlabor ausführen. Wir empfehlen jedoch nicht, Game Loop-Tests auf virtuellen Geräten auszuführen, da diese niedrigere Grafik-Frameraten als physische Geräte haben.

Bevor Sie beginnen

Um einen Test zu implementieren, müssen Sie Ihre App zunächst für Game Loop-Tests konfigurieren.

  1. Fügen Sie in Ihrem App-Manifest einen neuen Absichtsfilter zu Ihrer Aktivität 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 Ihr Spiel starten, indem es es mit einer bestimmten Absicht auslöst.

  2. Fügen Sie in 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
    }

    Dadurch kann Ihre Aktivität die Absicht überprüfen, die sie auslöst. Sie können diesen Code auch später hinzufügen, wenn Sie möchten (z. B. nach dem ersten Laden Ihrer Spiel-Engine).

  3. Empfohlen: Am Ende des Tests hinzufügen:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Dadurch wird Ihre App geschlossen, wenn der Game Loop-Test 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 ihr mitgeteilt, dass der Test abgeschlossen ist.

Erstellen Sie einen Game-Loop-Test und führen Sie ihn aus

Nachdem Sie Ihre App für Game Loop-Tests konfiguriert haben, können Sie sofort einen Test erstellen und ihn in Ihrer Gaming-App ausführen. Sie können einen Test im Testlabor entweder über die Firebase-Konsole oder die gcloud-Befehlszeilenschnittstelle (CLI) oder auf einem lokalen Gerät mit dem Test Loop Manager ausführen.

Auf einem lokalen Gerät ausführen

Der Test Loop Manager von Test Lab ist eine Open-Source-App, mit der Sie Game Loop-Tests integrieren 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 Test Loop Manager aus:

  1. Laden Sie den Test Loop Manager auf ein Telefon oder Tablet herunter und installieren Sie ihn, indem Sie Folgendes ausführen:
    adb install testloopmanager.apk
  2. Öffnen Sie auf Ihrem Gerät die Test Loop Apps- App auf Ihrem Telefon oder Tablet. Die App zeigt eine Liste von Apps auf Ihrem Gerät an, die mit Spielschleifen ausgeführt werden können. Wenn Ihre Gaming-App hier nicht angezeigt wird, stellen Sie sicher, dass Ihr Absichtsfilter mit dem im ersten Schritt des Abschnitts „Bevor Sie beginnen“ beschriebenen übereinstimmt.
  3. 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 wählen, ob Sie statt nur einer Schleife eine Teilmenge von Schleifen ausführen möchten. Weitere Informationen zum gleichzeitigen Ausführen mehrerer Schleifen finden Sie unter Optionale Funktionen .
  4. Klicken Sie auf Test ausführen . Ihr Test wird sofort ausgeführt.

Im Testlabor ausführen

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

Verwenden Sie die Firebase-Konsole

  1. Klicken Sie in der Firebase-Konsole im linken Bereich auf Test Lab .
  2. Klicken Sie auf „Ersten Test ausführen“ (oder „Test ausführen“ , wenn in Ihrem Projekt zuvor bereits ein Test ausgeführt wurde).
  3. Wählen Sie Game Loop als Testtyp aus und klicken Sie dann auf Weiter .
  4. Klicken Sie auf Durchsuchen und navigieren Sie dann zur .apk Datei Ihrer App. Hinweis: In diesem Schritt können Sie wählen, ob Sie statt nur einer Schleife eine Teilmenge von Schleifen ausführen möchten. Weitere Informationen zum gleichzeitigen Ausführen mehrerer Schleifen finden Sie unter Optionale Funktionen .
  5. Klicken Sie auf Weiter .
  6. Wählen Sie die physischen Geräte aus, die Sie zum Testen Ihrer App verwenden möchten.
  7. Klicken Sie auf Tests starten .

Weitere Informationen zu den ersten Schritten mit der Firebase-Konsole finden Sie unter Testen mit der Firebase-Konsole starten.

Verwenden Sie die gcloud-Befehlszeile (CLI).

  1. Wenn Sie es noch nicht getan haben, laden Sie das Google Cloud SDK herunter und installieren Sie es

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

    gcloud auth login

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

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

    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 Testen über die gcloud-Befehlszeile starten.

Optionale Funktionen

Test Lab bietet mehrere optionale Funktionen, mit denen Sie Ihre Tests weiter anpassen können, darunter die Möglichkeit, Ausgabedaten zu schreiben, Unterstützung für mehrere Spielschleifen und Beschriftungen für zugehörige Schleifen.

Ausgabedaten schreiben

Ihr Game Loop-Test kann die Ausgabe in eine Datei schreiben, die in der Methode launchIntent.getData() angegeben ist. Nachdem Sie einen Test ausgeführt haben, können Sie im Abschnitt „Testlabor“ der Firebase-Konsole auf diese Ausgabedaten zugreifen (siehe Beispiel für eine Game-Loop-Testausgabedatei ).

Das Testlabor folgt den Best Practices für die gemeinsame Nutzung einer Datei zwischen Apps, die unter „Freigeben einer Datei“ beschrieben werden. In der onCreate() Methode Ihrer Aktivität, in der sich Ihre Absicht befindet, können Sie Ihre Datenausgabedatei überprüfen, indem Sie den 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 aus 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 (formatiert wie im Beispiel unten) verwenden, um Spielschleifentestergebnisse im Abschnitt „Testlabor“ der Firebase-Konsole anzuzeigen. Bereiche, die als /.../ angezeigt werden, können alle von Ihnen benötigten benutzerdefinierten Felder enthalten, solange sie nicht mit den Namen anderer in dieser Datei verwendeter Felder in Konflikt stehen:

{
  "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

Möglicherweise ist es hilfreich, mehrere Spielschleifen in Ihrer App auszuführen. Eine Schleife ist ein vollständiger Durchlauf Ihrer Spiel-App von Anfang bis Ende. Wenn Ihr Spiel beispielsweise über mehrere Level verfügt, möchten Sie möglicherweise eine Spielschleife zum Starten jedes Levels anstelle einer Schleife, die alle Level durchläuft. Wenn Ihre App auf Level 32 abstürzt, können Sie auf diese Weise die Spielschleife direkt starten, um den Absturz zu reproduzieren und Fehlerbehebungen zu testen.

So aktivieren Sie, dass Ihre App mehrere Schleifen gleichzeitig ausführen kann:

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

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

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

      Dieser Startabsicht enthält die Zielschleife als ganzzahligen Parameter. Im Feld android:value kö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 beginnend bei 1 und nicht bei 0 indiziert werden.

    2. In der Test Loop Manager-App erscheint ein Auswahlbildschirm, auf dem Sie auswählen können, welche Schleife(n) Sie ausführen möchten. Wenn Sie mehrere Schleifen auswählen, wird jede Schleife der Reihe nach 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 mithilfe des Flags --scenario-numbers eine Liste von Schleifennummern an. Beispielsweise führt --scenario-numbers=1,3,5 die Schleifen 1, 3 und 5 aus.

  • Wenn Sie C++ schreiben und das Verhalten Ihrer Schleife ändern möchten, übergeben Sie den folgenden Zusatz an Ihren nativen C++-Code:

    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 Ihrer Schleife basierend auf dem resultierenden int Wert ändern.

Beschriften Sie Spielschleifen

Wenn Sie Ihre Spielschleifen mit einer oder mehreren Szenariobezeichnungen kennzeichnen, können Sie und Ihr QA-Team problemlos eine Reihe verwandter Spielschleifen starten (z. B. „alle Kompatibilitätsspielschleifen“) und sie in einer einzigen Matrix testen. Sie können Ihre eigenen Etiketten erstellen oder die von Test Lab angebotenen vordefinierten Etiketten verwenden:

  • com.google.test.loops.player_experience : Für Schleifen, die verwendet werden, um die Erfahrung eines echten Benutzers beim Spielen des Spiels zu reproduzieren. Das Ziel des Testens mit diesen Schleifen besteht darin, Probleme zu finden, mit denen ein echter Benutzer beim Spielen des Spiels konfrontiert wäre.
  • com.google.test.loops.gpu_compatibility : Für Schleifen, die zum Testen von GPU-bezogenen Problemen verwendet werden. Das Ziel des Testens 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 breiten Palette von Kompatibilitätsproblemen verwendet werden, einschließlich E/A-Problemen und OpenSSL-Problemen.
  • com.google.test.loops.performance : Für Schleifen, die zum Testen der Leistung des Geräts verwendet werden. Beispielsweise könnte ein Spiel mit den komplexesten Grafikeinstellungen ausgeführt werden, um zu sehen, wie sich ein neues Gerät verhält.

So aktivieren Sie, dass Ihre App Schleifen mit demselben Label ausführen kann:

  • 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 eine Bezeichnung 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 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 beginnend bei 1 und nicht bei 0 indiziert werden. android:value="1,3-5" wendet beispielsweise LABEL_NAME auf die Schleifen 1, 3, 4 und 5 an.

    2. Geben Sie in der Test Loop Manager-App eine oder mehrere Beschriftungen in das Feld Beschriftungen ein.

  • Wenn Sie einen Test mit der Firebase-Konsole 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 mithilfe des Flags --scenario-labels eine oder mehrere Szenariobezeichnungen an (z. B. --scenario-labels=performance,gpu ).

Unterstützung bei der App-Lizenzierung

Test Lab unterstützt Apps, die den von Google Play angebotenen App-Lizenzierungsdienst nutzen. Um die Lizenzierung beim Testen Ihrer App mit Test Lab erfolgreich zu überprüfen, müssen Sie Ihre App im Produktionskanal im Play Store veröffentlichen. Um Ihre App im Alpha- oder Beta-Kanal mit Test Lab zu testen, entfernen Sie die Lizenzprüfung, bevor Sie Ihre App in Test Lab hochladen.

Bekannte Probleme

Bei Game-Loop-Tests im Testlabor sind die folgenden Probleme bekannt:

  • Bei einigen Abstürzen werden Backtraces nicht unterstützt. Beispielsweise unterdrücken einige Release-Builds möglicherweise die Ausgabe des debuggerd Prozesses mithilfe von prctl(PR_SET_DUMPABLE, 0) . Weitere Informationen finden Sie debuggerd .
  • API Level 19 wird derzeit aufgrund von Dateiberechtigungsfehlern nicht unterstützt.