Cómo generar informes de métricas o datos de una prueba de Tradefed

En esta página, se describe cómo informar métricas junto con los resultados de las pruebas cuando se escribe una prueba en Tradefed.

El beneficio de registrar a través de la canalización de Tradefed es encontrar tus métricas junto con tus resultados funcionales. El registro de métricas se puede realizar de forma muy natural en las pruebas, lo que facilita a los desarrolladores de pruebas agregar más instrumentación.

DeviceTestCase: estilo JUnit3

Si tu prueba extiende DeviceTestCase en un tipo de prueba de estilo JUnit3, puedes llamar al método addTestMetric(String key, String value) desde cualquier caso de prueba para informar una métrica. Se puede llamar a este método varias veces, siempre y cuando la clave sea única.

Ejemplo:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Si deseas registrar un archivo para que esté disponible en result_reporters, puedes llamar al método addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) desde cualquier caso de prueba para informar un archivo que se registrará.

Ejemplo:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase: Prueba JUnit3 normal

Si deseas informar métricas dentro de Tradefed desde una clase TestCase de JUnit3 normal, deberás convertirla en un MetricTestCase, que es exactamente la misma clase con un método adicional: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner: Estilo JUnit4

Si tu prueba de estilo JUnit4 se ejecuta con DeviceJUnit4ClassRunner, también puedes registrar métricas dentro de un caso de prueba (dentro de @Test) para que Tradefed las informe. Deberás usar reglas de TestMetrics para informar tus métricas.

Ejemplo:

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

Para denunciar archivos, usarás la regla TestLogData.

Ejemplo:

    @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: Prueba pura de Tradefed

Si escribes tu propia clase o ejecutor de pruebas de Tradefed, implementarás IRemoteTest y obtendrás un ITestInvocationListener a través del método run(). Este objeto de escucha se puede usar para registrar métricas de la siguiente manera:

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

Recopiladores de métricas de Tradefed

Tradefed proporciona un objeto metrics_collector dedicado para recopilar métricas en paralelo con las pruebas.

En el host

Se puede implementar BaseDeviceMetricCollector para recopilar cualquier métrica del host y registrarla como parte de la invocación de la prueba. Ya hay disponibles varios recopiladores genéricos para diferentes casos de uso, pero siempre agradecemos las nuevas contribuciones.

Para especificar el recopilador que se usará en tu invocación de Tradefed, solo debes agregar el objeto a tu configuración XML de Tradefed:

Ejemplo:

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

Algunos recopiladores existentes actualmente son los siguientes: * TemperatureCollector, que recopila la temperatura de forma periódica durante la ejecución de la prueba. * AtraceCollector que recopila datos con "atrace" para cada caso de prueba.

En el dispositivo

Cuando se ejecutan pruebas del lado del dispositivo (pruebas de instrumentación, pruebas de UIAutomator, etcétera), tener un recopilador del lado del host que recopile de forma asíncrona podría no ser lo ideal. Por ejemplo, es muy probable que una captura de pantalla tomada de forma asíncrona no muestre la pantalla deseada y sea inútil.

Para satisfacer estos casos de uso, existe una versión de nuestros recopiladores del lado del dispositivo que se puede usar en cualquier instrumentación de "AndroidJUnitRunner". BaseMetricListener se puede implementar para informar automáticamente las métricas que se recopilan de una manera totalmente compatible con la canalización de informes de Tradefed.

Si usas el ejecutor "AndroidJUnitTest" de Tradefed, puedes especificar la siguiente opción de línea de comandos para que tu recopilador se ejecute con tus pruebas:

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

PRECAUCIÓN: Para que las clases de recopiladores se resuelvan en el tiempo de ejecución, es muy probable que tu APK de instrumentación deba incluirlas de forma estática agregando lo siguiente a tu archivo makefile:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

También se aceptan contribuciones a los recopiladores del dispositivo.

Consideraciones especiales para los paquetes

En el caso de los conjuntos de pruebas, como el CTS, que tienen una configuración de nivel superior que ejecuta algunas configuraciones de módulos, no es necesario especificar metrics_collector en cada configuración de módulo (AndroidTest.xml). De hecho, está prohibido.

Para garantizar que la recopilación de métricas se aplique de manera equitativa a cada módulo, solo la configuración de nivel superior (por ejemplo, cts.xml) puede especificar metrics_collector, como se explicó anteriormente. Estos recopiladores se aplicarán y ejecutarán en cada módulo del paquete.

Cómo recopilar archivos de registro del dispositivo desde un módulo

Hay una configuración disponible para que una prueba del dispositivo notifique que se deben recopilar algunos archivos.

AndroidTest.xml puede especificar un recopilador que buscará archivos en el dispositivo y los extraerá.

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

Si se especifican estos patrones y la clave, el recopilador, si ve la clave, intentará extraer y registrar el archivo asociado.

Para que se generen estas claves, una prueba del lado del dispositivo (instrumentación) debe especificar el archivo que se debe registrar. Se realiza de manera similar a la del host (descrita anteriormente).

  1. Agrega collector-device-lib a tu APK de prueba en los archivos de compilación:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Usa la regla @que proporcionamos para registrar archivos:
    @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);
        }
    }

El nombre KEY en el ejemplo anterior es el nombre con el que se informará el archivo. Este es el nombre con el que debes coincidir en FilePullerDeviceMetricCollector para que se extraiga automáticamente. Debe ser un nombre único.

NOTA: Una vez que se extrae el archivo, FilePullerDeviceMetricCollector lo borra automáticamente del dispositivo.

¿Dónde puedo encontrar las métricas?

Depende del result_reporter especificado en tu configuración XML.