Catch up on everthing we announced at this year's Firebase Summit. Learn more

Erste Schritte mit Game Loop-Tests

Es kann schwierig sein, Spieletests zu automatisieren, wenn Spiele-Apps auf verschiedenen UI-Frameworks basieren. Mit Game Loop-Tests können Sie Ihre nativen Tests in Test Lab integrieren und sie einfach auf von Ihnen ausgewählten Geräten ausführen. Ein Game Loop-Test führt Ihren Test durch Ihre Gaming-App und simuliert dabei die Aktionen eines echten Spielers. In dieser Anleitung erfahren Sie, wie Sie einen Game Loop-Test durchführen und dann Ihre Testergebnisse in der Firebase-Konsole anzeigen und verwalten.

Je nach Ihrem Spiel - Engine, können Sie Tests mit einzelnen oder implementieren mehr Schleifen . Eine Schleife ist ein vollständiger oder teilweiser Durchlauf Ihres Tests in Ihrer Spiele-App. Spielschleifen können verwendet werden, um:

  • Führen Sie ein Level Ihres Spiels so aus, wie es ein Endbenutzer spielen würde. Sie können entweder die Eingabe des Benutzers skripten, den Benutzer untätig sein lassen oder den Benutzer durch eine KI ersetzen, wenn dies in Ihrem Spiel sinnvoll ist (z. B. wenn Sie eine Rennwagen-Spiele-App haben und bereits eine KI implementiert haben. Sie können einfach einen KI-Treiber für die Eingaben des Benutzers verantwortlich machen).
  • 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 aufweisen als physische Geräte.

Bevor Sie beginnen

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

  1. In Ihrem App - Manifest, einen neuen Intent - Filter zu Ihrer hinzufügen Aktivität :

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

    Auf diese Weise kann Test Lab Ihr Spiel starten, indem es mit einer bestimmten Absicht ausgelöst wird.

  2. In Ihrem Code (wir innerhalb der empfehlen onCreate Methodendeklaration), fügen Sie die folgende:

    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
    }

    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
    }

    Auf diese Weise kann Ihre Aktivität den Intent überprüfen, der sie startet. Sie können diesen Code auch später hinzufügen, wenn Sie es vorziehen (zB nach dem ersten Laden Ihrer Spiel-Engine).

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

    Java

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    Dadurch wird Ihre App geschlossen, wenn der Game Loop-Test abgeschlossen ist. Der Test verlässt sich auf das UI-Framework Ihrer App, um die nächste Schleife zu starten, und das Schließen Ihrer App teilt ihr mit, dass der Test abgeschlossen ist.

Erstellen und Ausführen eines Game Loop-Tests

Nachdem Sie Ihre App für Game Loop-Tests konfiguriert haben, können Sie sofort einen Test erstellen und in Ihrer Spiele-App ausführen. Sie können wählen , einen Test in Test Lab entweder die Verwendung laufen Firebase - Konsole oder die gcloud Command Line Interface (CLI) oder auf einem lokalen Gerät mit der Testschleife - Manager .

Auf einem lokalen Gerät ausführen

Test - Lab-Testschleife Manager ist eine Open - Source - Anwendung , die Sie Spiel Loop - Tests integrieren hilft , und führen Sie sich auf Ihren lokalen Geräten. 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 die Testschleife -
    adb install testloopmanager.apk
    Manager auf einem Smartphone oder Tablet und installieren Sie es , indem Sie:
    adb install testloopmanager.apk
  2. Sie auf Ihrem Gerät öffnen Sie die Testschleife Apps App auf Ihrem Smartphone oder Tablet. Die App zeigt eine Liste von Apps auf Ihrem Gerät an, die mit Spielschleifen ausgeführt werden können. Wenn Sie nicht Ihre Spiele - App hier sehen, stellen Sie sicher , dass Ihre Absicht Filter die man im ersten Schritt der beschriebenen übereinstimmt , bevor Sie Abschnitt beginnen .
  3. Wählen Sie Ihre Gaming-App und dann die Anzahl der Loops aus, die Sie ausführen möchten. Hinweis: In diesem Schritt können Sie eine Teilmenge von Schleifen statt nur einer Schleife ausführen. Weitere Informationen zu mehreren Schleifen auf einmal ausgeführt wird , finden Optionale Funktionen.
  4. Klicken Sie auf Run Test. Ihr Test wird sofort ausgeführt.

Im Testlabor ausführen

Sie können ein Spiel Loop - Test im Testlabor entweder mit der laufen Firebase - Konsole oder dem gcloud CLI. Bevor Sie beginnen, wenn Sie nicht bereits haben, öffnen Sie die Firebase - Konsole und ein Projekt erstellen.

Verwenden der Firebase-Konsole

  1. In der Firebase - Konsole, klicken Sie auf Test Lab aus dem linken Bereich.
  2. Klicken Sie auf Ausführen Ihres ersten Test (oder Ausführen einen Test , wenn Ihr Projekt hat zuvor einen Test durchführen).
  3. Wählen Sie Spielschleife als Testtyp, und klicken Sie dann auf Weiter.
  4. Klicken Sie auf Durchsuchen, und wechseln Sie zu Ihrer App .apk - Datei. Hinweis: In diesem Schritt können Sie eine Teilmenge von Schleifen statt nur einer Schleife ausführen. Weitere Informationen zu mehreren Schleifen auf einmal ausgeführt wird , finden 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 Start Tests.

Weitere Informationen über die mit der Konsole Firebase begonnen, siehe Beginnen Sie mit der Konsole Firebase zu testen.

Verwenden der gcloud-Befehlszeile (CLI)

  1. Wenn Sie nicht bereits haben, herunterladen und installieren Sie das Google Cloud SDK.

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

    gcloud auth login

  3. Stellen Sie Ihr Projekt in Firebase gcloud, wo PROJECT_ID die ID Ihres Firebase - Projekt 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 über die mit dem gcloud CLI begonnen, siehe Starten von der gcloud Befehlszeile testen.

Optionale Funktionen

Test Lab bietet mehrere optionale Funktionen, mit denen Sie Ihre Tests weiter anpassen können, einschließlich der Möglichkeit, Ausgabedaten zu schreiben, Unterstützung für mehrere Spielschleifen und Beschriftungen für verwandte Schleifen.

Ausgabedaten schreiben

Ihr Spiel Loop - Test kann in der angegebenen Ausgabe in eine Datei schreiben launchIntent.getData() Methode. Nachdem Sie einen Test durchführen, können Sie diese Ausgangsdaten im Abschnitt Testlabor Zugriff der Firebase Konsole (siehe Spiel Schleifentest Ausgabedatei Beispiel ).

Test Lab folgt Best Practices für eine Datei zwischen beschrieben Apps teilen Teilen einer Datei . In Ihrer Tätigkeit des onCreate() Methode, wo Ihre Absicht befindet, können Sie Ihre Daten Ausgabedatei überprüfen , indem Sie folgenden Code ausführen:

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

Wenn Sie von der C++-Seite Ihrer Spiele-App in die Datei schreiben möchten, können Sie den Dateideskriptor anstelle des Dateipfads übergeben:

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);

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);

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 einer Ausgabedatei

Sie können die Ausgabe - Datendateien (formatiert wie das Beispiel unten) Anzeige Spielschleife Testergebnisse im Test Lab Abschnitt der Firebase - Konsole verwenden. Bereiche gezeigt als /.../ alle benutzerdefinierten Felder enthalten kann , die Sie benötigen, solange sie mit den Namen von anderen Bereichen nicht im Widerspruch zu dem in dieser Datei verwendet:

{
  "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 hilfreich sein, mehrere Spielschleifen in Ihrer App auszuführen. Eine Schleife ist ein vollständiger Durchlauf Ihrer Spiele-App von Anfang bis Ende. Wenn Sie beispielsweise mehrere Level in Ihrem Spiel haben, möchten Sie vielleicht eine Spielschleife haben, um jedes Level zu starten, anstatt eine Schleife zu haben, die alle durchläuft. Auf diese Weise können Sie, wenn Ihre App auf Level 32 abstürzt, diese Spielschleife direkt starten, um den Absturz zu reproduzieren und Fehlerbehebungen zu testen.

So aktivieren Sie Ihre App zum gleichzeitigen Ausführen mehrerer Schleifen:

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

    1. Fügen Sie die folgende Zeile zu Ihrer App manifestieren, in der <application> Element:

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

      Diese Startabsicht enthält die Zielschleife als ganzzahligen Parameter. Im android:value Feld kann eine ganze Zahl von 1 bis 1024 (die maximale Anzahl von Schleifen für einen einzelnen Test erlaubt) angeben. Beachten Sie, dass Schleifen bei 1 beginnend indiziert werden, nicht bei 0.

    2. In der Test Loop Manager App erscheint ein Auswahlbildschirm, in 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 eine Liste oder einen Bereich von Schleifenzahlen im Szenarien Feld.

  • Wenn Sie einen Test mit dem gcloud CLI ausgeführt wird , geben Sie eine Liste der Schleifennummern unter Verwendung der --scenario-numbers Flagge. Zum Beispiel --scenario-numbers=1,3,5 - Schleife Läufe 1, 3 und 5.

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

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    Kotlin+KTX

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    Sie können nun das Verhalten Ihrer Schleife auf dem resultierenden Basis ändern int Wert.

Spielschleifen beschriften

Wenn Sie Ihre Spielschleifen mit einem oder mehreren Szenario-Labels beschriften, können Sie und Ihr QA-Team problemlos eine Reihe verwandter Spielschleifen starten (z. B. "alle Kompatibilitätsspielschleifen") und diese 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 verwendet , um eine reale Benutzer-Erfahrung zu reproduzieren , wenn das Spiel zu spielen. Das Ziel des Tests 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 Test GPU-Fragen verwendet. Das Ziel des 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 : Für Schleifen verwendet , um eine breite Palette von Kompatibilitätsproblemen zu testen, einschließlich E / A - Ausgaben und OpenSSL Fragen.
  • com.google.test.loops.performance : For - Schleifen verwendet , um die Leistung der Vorrichtung zu testen. Beispielsweise kann ein Spiel mit den komplexesten Grafikeinstellungen ausgeführt werden, um zu sehen, wie sich ein neues Gerät verhält.

So aktivieren Sie Ihre App zum Ausführen von Schleifen mit demselben Label:

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

    1. In Ihrer App manifestiert, fügen Sie die folgende Meta-Datenleitung und ersetzt LABEL_NAME mit einem Etikett Ihrer Wahl:

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

      Im android:value Feld können Sie einen Bereich oder eine Menge der ganzen Zahlen von 1 bis 1024 (die maximale Anzahl von Schleifen für einen einzelnen Test erlaubt) angeben , die die Schleifen Sie beschriften mögen darstellen. Man beachte , dass Schlaufen aus 1 indexierte Starten nicht 0. Beispiel android:value="1,3-5" gilt LABEL_NAME zu Schleifen 1, 3, 4 und 5.

    2. Im Testschleife Manager App, geben Sie eine oder mehrere Markierungen im Feld Etiketten.

  • Wenn Sie einen Test mit der Firebase - Konsole ausführen, geben Sie eine oder mehr Markierungen im Feld Etikette.

  • Wenn Sie einen Test mit dem gcloud CLI ausgeführt wird , geben Sie eine oder mehrere Szenario Etiketten mithilfe der --scenario-labels - Flag (zB --scenario-labels=performance,gpu ).

Unterstützung bei der App-Lizenzierung

Test Lab unterstützt Anwendungen , die die Verwendung App Licensing Service von Google Play angeboten. 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 Betakanal mit Test Lab zu testen, entfernen Sie die Lizenzprüfung, bevor Sie Ihre App in Test Lab hochladen.

Bekannte Probleme

Bei Game Loop-Tests in Test Lab treten die folgenden bekannten Probleme auf:

  • Einige Abstürze unterstützen keine Backtraces. Zum Beispiel baut einige Freisetzung kann die Ausgabe des unterdrücken debuggerd Verfahren unter Verwendung prctl(PR_SET_DUMPABLE, 0) . Um mehr zu erfahren, sehen debuggerd .
  • API Level 19 wird derzeit aufgrund von Dateiberechtigungsfehlern nicht unterstützt.