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

Commencez avec les tests Game Loop

Il peut être difficile d'automatiser les tests de jeu lorsque les applications de jeu sont construites sur différents frameworks d'interface utilisateur. Les tests Game Loop vous permettent d'intégrer vos tests natifs avec Test Lab et de les exécuter facilement sur les appareils que vous sélectionnez. Un test Game Loop exécute votre test via votre application de jeu tout en simulant les actions d'un vrai joueur. Ce guide vous montre comment exécuter un test de boucle de jeu, puis afficher et gérer vos résultats de test dans la console Firebase.

En fonction de votre moteur de jeu, vous pouvez mettre en œuvre des tests avec une ou plusieurs boucles . Une boucle est une exécution complète ou partielle de votre test sur votre application de jeu. Les boucles de jeu peuvent être utilisées pour :

  • Exécutez un niveau de votre jeu de la même manière qu'un utilisateur final y jouerait. Vous pouvez soit scripter l'entrée de l'utilisateur, laisser l'utilisateur inactif ou remplacer l'utilisateur par une IA si cela a du sens dans votre jeu (par exemple, disons que vous avez une application de jeu de voiture de course et que vous avez déjà une IA implémentée. Vous pouvez mettre facilement un pilote d'IA en charge de la saisie de l'utilisateur).
  • Exécutez votre jeu avec le réglage de qualité le plus élevé pour voir si les appareils le prennent en charge.
  • Exécutez un test technique (compilez plusieurs shaders, exécutez-les, vérifiez que la sortie est conforme à vos attentes, etc.).

Vous pouvez exécuter un test Game Loop sur un seul appareil de test, un ensemble d'appareils de test ou sur Test Lab. Cependant, nous vous déconseillons d'exécuter des tests de boucle de jeu sur des appareils virtuels, car ils ont des fréquences d'images graphiques inférieures à celles des appareils physiques.

Avant que tu commences

Pour mettre en œuvre un test, vous devez d'abord configurer votre application pour les tests Game Loop.

  1. Dans votre manifeste d'application, ajouter un nouveau filtre intention de votre activité :

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

    Cela permet à Test Lab de lancer votre jeu en le déclenchant avec une intention spécifique.

  2. Dans votre code (nous recommandons l' intérieur de la onCreate déclaration de méthode), ajouter ce qui suit:

    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
    }

    Cela permet à votre activité de vérifier l'intention qui la lance. Vous pouvez également ajouter ce code plus tard si vous préférez (par exemple, après avoir initialement chargé votre moteur de jeu).

  3. Recommandé : À la fin du test, ajoutez :

    Java

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    Cela ferme votre application lorsque le test Game Loop est terminé. Le test s'appuie sur le framework d'interface utilisateur de votre application pour démarrer la boucle suivante, et la fermeture de votre application lui indique que le test est terminé.

Créer et exécuter un test de boucle de jeu

Après avoir configuré votre application pour les tests Game Loop, vous pouvez immédiatement créer un test et l'exécuter dans votre application de jeu. Vous pouvez choisir d'exécuter un test en laboratoire de test utilisant la console Firebase ou l' interface de ligne de commande gcloud (CLI) , ou sur un périphérique local en utilisant le test de boucle directeur .

Exécuter sur un appareil local

Test de boucle Manager Test Lab est une application open source qui vous permet d' intégrer le jeu des tests de boucle et de les exécuter sur vos périphériques locaux. Cela permet également à votre équipe d'assurance qualité d'exécuter les mêmes boucles de jeu sur leurs appareils.

Pour exécuter un test sur un périphérique local à l'aide de Test Loop Manager :

  1. Télécharger le test de
    adb install testloopmanager.apk
    boucle directeur sur un téléphone ou une tablette et l' installer en exécutant:
    adb install testloopmanager.apk
  2. Sur votre appareil, ouvrez l'application Loop Test Apps sur votre téléphone ou tablette. L'application affiche une liste d'applications sur votre appareil qui peuvent être exécutées avec des boucles de jeu. Si vous ne voyez pas votre application de jeu ici, assurez - vous que votre filtre l' intention correspond à celle décrite dans la première étape de la section Avant de commencer .
  3. Sélectionnez votre application de jeu, puis sélectionnez le nombre de boucles que vous souhaitez exécuter. Remarque : à cette étape, vous pouvez choisir d'exécuter un sous-ensemble de boucles au lieu d'une seule boucle. Pour plus d' informations sur l' exécution de plusieurs boucles à la fois, voir caractéristiques en option.
  4. Cliquez sur Exécuter le test. Votre test démarre immédiatement.

Exécuter dans le laboratoire de test

Vous pouvez exécuter un test de boucle du jeu dans le test de laboratoire utilisant la console Firebase ou la CLI gcloud. Avant de commencer, si vous avez pas déjà, ouvrez la console Firebase et créer un projet.

Utiliser la console Firebase

  1. Dans la console Firebase, cliquez sur Test Lab à partir du panneau gauche.
  2. Cliquez sur Exécuter votre premier test (ou exécuter un test si votre projet a déjà exécuté un test).
  3. Sélectionnez jeu en boucle comme type de test, puis cliquez sur Continuer.
  4. Cliquez sur Parcourir, puis accédez à votre application .apk fichier. Remarque : à cette étape, vous pouvez choisir d'exécuter un sous-ensemble de boucles au lieu d'une seule boucle. Pour plus d' informations sur l' exécution de plusieurs boucles à la fois, voir caractéristiques en option.
  5. Cliquez sur Continuer.
  6. Sélectionnez les appareils physiques à utiliser pour tester votre application.
  7. Cliquez sur Démarrer Tests.

Pour plus d' informations sur la mise en route avec la console Firebase, voir test Démarrer avec la console Firebase.

Utiliser la ligne de commande gcloud (CLI)

  1. Si vous avez pas déjà, téléchargez et installez le SDK Google Cloud.

  2. Connectez-vous à la CLI gcloud à l'aide de votre compte Google :

    gcloud auth login

  3. Définissez votre projet Firebase dans gcloud, où PROJECT_ID est l'ID de votre projet Firebase:

    gcloud config set project PROJECT_ID
    
  4. Exécutez votre premier test :

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

Pour plus d' informations sur la mise en route avec le CLI gcloud, voir le test de démarrage de la ligne de commande gcloud.

Caractéristiques optionnelles

Test Lab propose plusieurs fonctionnalités optionnelles qui vous permettent de personnaliser davantage vos tests, notamment la possibilité d'écrire des données de sortie, la prise en charge de plusieurs boucles de jeu et des étiquettes pour les boucles associées.

Écrire les données de sortie

Votre test de jeu en boucle peut écrire la sortie dans un fichier spécifié dans le launchIntent.getData() méthode. Après avoir exécuté un test, vous pouvez accéder à ces données de sortie dans la section Test Lab de la console Firebase (voir exemple de fichier de sortie de test du jeu en boucle ).

Test Lab suit les meilleures pratiques pour partager un fichier entre les applications décrites dans le partage d' un fichier . Dans votre activité onCreate() méthode, où votre intention est situé, vous pouvez vérifier votre fichier de sortie de données en exécutant le code suivant:

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}")
    // ...
}

Si vous souhaitez écrire dans le fichier depuis le côté C++ de votre application de jeu, vous pouvez transmettre le descripteur de fichier au lieu du chemin du fichier :

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

Exemple de fichier de sortie

Vous pouvez utiliser des fichiers de données de sortie (formatées comme dans l'exemple ci - dessous) pour afficher les résultats des tests de boucle de jeu dans la section Test Lab de la console Firebase. Comme indiqué ci - comme /.../ peuvent contenir des champs personnalisés que vous avez besoin, tant qu'ils ne sont pas incompatibles avec les noms des autres champs utilisés dans ce fichier:

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

Plusieurs boucles de jeu

Vous trouverez peut-être utile d'exécuter plusieurs boucles de jeu dans votre application. Une boucle est un parcours complet de votre application de jeu du début à la fin. Par exemple, si vous avez plusieurs niveaux dans votre jeu, vous voudrez peut-être avoir une boucle de jeu pour lancer chaque niveau au lieu d'avoir une boucle qui les parcourt tous. De cette façon, si votre application plante au niveau 32, vous pouvez directement lancer cette boucle de jeu pour reproduire le plantage et tester les corrections de bogues.

Pour permettre à votre application d'exécuter plusieurs boucles à la fois :

  • Si vous effectuez un test avec Test Loop Manager :

    1. Ajoutez la ligne suivante au manifeste de votre application, dans la <application> élément:

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

      Cette intention de lancement contient la boucle cible en tant que paramètre entier. Dans l' android:value champ, vous pouvez spécifier un entier de 1 à 1024 (le nombre maximum de boucles autorisé pour un seul test). Notez que les boucles sont indexées à partir de 1, pas de 0.

    2. Dans l'application Test Loop Manager, un écran de sélection apparaît qui vous permet de sélectionner la ou les boucles que vous souhaitez exécuter. Si vous sélectionnez plusieurs boucles, chaque boucle est lancée en séquence une fois la boucle précédente terminée.

  • Si vous utilisez un test avec la console Firebase, entrez une liste ou une plage de numéros de boucle dans le domaine des scénarios.

  • Si vous utilisez un test avec la CLI gcloud, spécifiez une liste de numéros de boucle en utilisant les --scenario-numbers drapeau. Par exemple, --scenario-numbers=1,3,5 exécute des boucles 1, 3 et 5.

  • Si vous écrivez du C++ et que vous souhaitez modifier le comportement de votre boucle, transmettez l'extra suivant à votre code C++ natif :

    Java

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

    Kotlin+KTX

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

    Vous pouvez maintenant modifier le comportement de la boucle sur la base du résultat int valeur.

Boucles de jeu d'étiquettes

Lorsque vous étiquetez vos boucles de jeu avec une ou plusieurs étiquettes de scénario, vous et votre équipe d'assurance qualité pouvez facilement lancer un ensemble de boucles de jeu associées (par exemple, « toutes les boucles de jeu de compatibilité ») et les tester dans une seule matrice. Vous pouvez créer vos propres étiquettes ou utiliser les étiquettes prédéfinies proposées par Test Lab :

  • com.google.test.loops.player_experience : Pour les boucles utilisées pour reproduire l'expérience d'un utilisateur réel lors de la lecture du jeu. Le but des tests avec ces boucles est de trouver les problèmes auxquels un utilisateur réel serait confronté en jouant au jeu.
  • com.google.test.loops.gpu_compatibility : Pour les boucles utilisées pour tester les problèmes liés GPU. L'objectif des tests avec ces boucles est d'exécuter du code GPU qui pourrait ne pas s'exécuter correctement en production, pour exposer les problèmes avec le matériel et les pilotes.
  • com.google.test.loops.compatibility : Pour les boucles utilisées pour tester un large éventail de problèmes de compatibilité, y compris les questions d' E / S et les questions de OpenSSL.
  • com.google.test.loops.performance : Pour les boucles utilisées pour tester les performances de l'appareil. Par exemple, un jeu peut s'exécuter avec les paramètres graphiques les plus complexes pour voir comment se comporte un nouvel appareil.

Pour permettre à votre application d'exécuter des boucles avec le même libellé :

  • Si vous effectuez un test avec Test Loop Manager :

    1. Dans le manifeste de votre application, ajoutez la ligne méta-données suivantes et remplacer LABEL_NAME avec une étiquette de votre choix:

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

      Dans l' android:value champ, vous pouvez spécifier une plage ou un ensemble d'entiers de 1 à 1024 (le nombre maximum de boucles autorisées pour un seul test) qui représentent les boucles à étiqueter. Notez que les boucles sont indexés à partir de 1, pas 0. Par exemple, android:value="1,3-5" applique LABEL_NAME aux boucles 1, 3, 4 et 5.

    2. Dans l'application de boucle Test Manager, entrez un ou plusieurs marqueurs dans le domaine des étiquettes.

  • Si vous utilisez un test avec la console Firebase, entrez un ou plusieurs marqueurs dans le domaine des étiquettes.

  • Si vous utilisez un test avec la CLI gcloud, spécifiez une ou plusieurs étiquettes de scénario en utilisant les --scenario-labels drapeau (par exemple, --scenario-labels=performance,gpu ).

Prise en charge des licences d'applications

Test Lab prend en charge les applications qui utilisent la licence App service offert par Google Play. Pour vérifier avec succès les licences lors du test de votre application avec Test Lab, vous devez publier votre application sur le canal de production du Play Store. Pour tester votre application dans le canal alpha ou bêta à l'aide de Test Lab, supprimez la vérification des licences avant de télécharger votre application dans Test Lab.

Problèmes connus

Les tests de boucle de jeu dans Test Lab présentent les problèmes connus suivants :

  • Certains plantages ne prennent pas en charge les backtraces. Par exemple, une certaine libération construit peut supprimer la sortie du debuggerd processus en utilisant prctl(PR_SET_DUMPABLE, 0) . Pour en savoir plus, voir debuggerd .
  • L'API de niveau 19 n'est actuellement pas prise en charge en raison d'erreurs d'autorisation de fichier.