Comment rapporter des métriques ou des données à partir d'un test Tradefed

Cette page décrit comment rapporter des métriques ainsi que des résultats de test lors de la rédaction d'un test dans Tradefed.

L'avantage de la journalisation via le pipeline Tradefed est de trouver vos métriques à côté de vos résultats fonctionnels. La journalisation des métriques peut se faire très naturellement dans les tests, ce qui permet aux rédacteurs de tests d'ajouter plus d'instrumentation.

DeviceTestCase - Style JUnit3

Si votre test étend DeviceTestCase dans un type de test de style JUnit3, vous pouvez appeler la méthode addTestMetric(String key, String value) depuis n'importe quel cas de test pour signaler une métrique. Cela peut être appelé plusieurs fois tant que la clé est unique.

Exemple:

    public static class TestMetricTestCase extends DeviceTestCase {

        public void testPass() {
            addTestMetric("key1", "metric1");
        }

        public void testPass2() {
            addTestMetric("key2", "metric2");
        }
    }

Si vous souhaitez enregistrer un fichier pour qu'il soit disponible dans result_reporters , vous pouvez appeler la méthode addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) depuis n'importe quel cas de test pour signaler un fichier à enregistrer.

Exemple:

    public static class TestLogTestCase extends DeviceTestCase {

        public void testPass() {
            try (InputStreamSource source = getDevice().getScreenshot()) {
                addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

TestCase - test régulier JUnit3

Si vous souhaitez rapporter des métriques dans Tradefed à partir d'une classe JUnit3 TestCase standard, vous devrez la convertir en MetricTestCase à la place, qui est exactement la même classe avec une méthode supplémentaire : addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - style JUnit4

Si votre test de style JUnit4 est en cours d'exécution avec DeviceJUnit4ClassRunner , vous pouvez également enregistrer des métriques dans un cas de test (dans @Test) à signaler par Tradefed. Vous devrez utiliser les règles TestMetrics pour rapporter vos métriques.

Exemple:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestMetrics metrics = new TestMetrics();

        @Test
        public void testPass5() {
            // test log through the rule.
            metrics.addTestMetric("key", "value");
        }

        @Test
        public void testPass6() {
            metrics.addTestMetric("key2", "value2");
        }
    }

Afin de signaler des fichiers, vous utiliserez la règle TestLogData pour le signaler.

Exemple:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            try (InputStreamSource source = getDevice().getScreenshot()) {
                logs.addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

IRemoteTest - pur test Tradefed

Si vous écrivez votre propre classe ou exécuteur Tradefed Test, vous implémenterez IRemoteTest et obtiendrez un ITestInvocationListener via la méthode run() . Cet écouteur peut être utilisé pour consigner les métriques comme suit :

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

Collecteurs de métriques Tradefed

Tradefed fournit un objet metrics_collector dédié pour collecter des métriques en parallèle des tests.

Du côté de l'hôte

BaseDeviceMetricCollector peut être implémenté pour collecter toutes les métriques du côté hôte et les signaler dans le cadre de l'invocation du test. Un certain nombre de collecteurs génériques sont déjà disponibles pour différents cas d'utilisation, mais nous accueillons toujours de nouvelles contributions.

Afin de spécifier le collecteur à utiliser dans votre invocation Tradefed, il vous suffit d'ajouter l'objet à votre configuration XML Tradefed :

Exemple:

  <metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
      <option name="categories" value="freq"/>
  </metrics_collector>

Quelques capteurs actuellement existants : * TemperatureCollector qui collecte périodiquement la température pendant le test. * AtraceCollector qui collecte en utilisant 'atrace' pour chaque cas de test.

Du côté de l'appareil

Lors de l'exécution de tests côté appareil (Instrumentations, tests UIAutomator, etc.), la présence d'un collecteur côté hôte collectant de manière asynchrone peut ne pas être idéale. Par exemple, une capture d'écran prise de manière asynchrone manquera très probablement l'écran souhaité et sera inutile.

Afin de répondre à ces cas d'utilisation, une version côté appareil de nos collecteurs existe et peut être utilisée dans n'importe quelle instrumentation 'AndroidJUnitRunner'. BaseMetricListener peut être implémenté afin de rapporter automatiquement les métriques qui sont collectées d'une manière entièrement compatible avec le pipeline de reporting de Tradefed.

Si vous utilisez le runner ' AndroidJUnitTest ' de Tradefed, vous pouvez simplement spécifier l'option de ligne de commande suivante pour que votre collecteur s'exécute avec vos tests :

  --device-listeners android.device.collectors.ScreenshotListener

ATTENTION : Pour que les classes de collecteur soient résolues lors de l'exécution, votre APK d'instrumentation devra très probablement les inclure de manière statique en ajoutant à votre makefile les éléments suivants :

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Les contributions aux collecteurs côté appareil sont également les bienvenues.

Considération spéciale pour les suites

Pour les suites comme CTS qui ont une configuration de niveau supérieur exécutant certaines configurations de module, il n'est pas nécessaire de spécifier metrics_collector dans chaque configuration de module ( AndroidTest.xml ). C'est effectivement interdit.

Pour garantir que la collection de métriques est appliquée de manière égale à chaque module, seule la configuration de niveau supérieur (par exemple, cts.xml ) peut spécifier metrics_collector comme expliqué ci-dessus. Ces collecteurs seront appliqués et exécutés sur chaque module de la suite.

Comment collecter les fichiers journaux de l'appareil à partir d'un module ?

Une configuration est disponible pour qu'un test côté appareil notifie que certains fichiers doivent être collectés.

AndroidTest.xml peut spécifier un collecteur qui recherchera des fichiers sur l'appareil et les extraira.

  <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
      <!-- repeatable: Pattern of key of a FILE we listen on that should be pulled -->
      <option name = "pull-pattern-keys" value = "ScreenshotListener_.*" />

      <!-- repeatable: The key of the DIRECTORY to pull -->
      <option name = "directory-keys" value = "<example-key: /sdcard/atrace_logs>" />
  </metrics_collector>

En spécifiant ces modèles et cette clé, le collecteur, s'il voit la clé, tentera d'extraire et de consigner le fichier associé.

Pour que ces clés soient générées, un test côté appareil (instrumentation) doit spécifier le fichier qui doit être journalisé. Cela se fait de la même manière que le côté hôte (décrit ci-dessus).

  1. Ajoutez le collector-device-lib à votre APK de test dans les fichiers make :
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilisez la @rule que nous fournissons pour enregistrer les fichiers :
    @RunWith(AndroidJUnit4.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            File logFile = new File("whatever");
            logs.addTestLog("KEY", logFile);
        }
    }

Le nom KEY dans l'exemple ci-dessus est le nom sous lequel le fichier sera signalé. C'est le nom que vous devez faire correspondre dans le FilePullerDeviceMetricCollector pour qu'il soit extrait automatiquement. ce devrait être un nom unique.

REMARQUE : Une fois le fichier extrait, FilePullerDeviceMetricCollector le nettoie automatiquement de l'appareil.

Où trouver les métriques ?

Cela dépend du result_reporter spécifié dans votre configuration XML.