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

Esta página describe cómo informar las métricas junto con los resultados de las pruebas al escribir una prueba en Tradefed.

El beneficio de iniciar sesión a través de la canalización de Tradefed es encontrar sus métricas junto con sus resultados funcionales. El registro de métricas se puede realizar de forma muy natural dentro de las pruebas, lo que facilita que los redactores de pruebas agreguen más instrumentación.

DeviceTestCase - estilo JUnit3

Si su prueba extiende DeviceTestCase en un tipo de prueba de estilo JUnit3, puede llamar al método addTestMetric(String key, String value) desde dentro de cualquier caso de prueba para informar una métrica. Esto se puede llamar varias veces siempre que la clave sea única.

Ejemplo:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

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

Ejemplo:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase - prueba regular JUnit3

Si desea informar métricas dentro de Tradefed desde una clase JUnit3 TestCase regular, deberá convertirse a MetricTestCase que es exactamente la misma clase con un método adicional: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - estilo JUnit4

Si su prueba de estilo JUnit4 se ejecuta con DeviceJUnit4ClassRunner , también puede registrar métricas dentro de un caso de prueba (dentro de @Test) para que Tradefed las informe. Deberá usar las reglas de TestMetrics para informar sus 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 informar archivos, utilizará la regla TestLogData para informarlo.

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 está escribiendo su propia clase o corredor de prueba de Tradefed, implementará IRemoteTest y obtendrá un ITestInvocationListener a través del método run() . Este oyente se puede utilizar para registrar métricas de la siguiente manera:

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

Recolectores de métricas Tradefed

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

En el lado del anfitrión

BaseDeviceMetricCollector se puede implementar para recopilar métricas del lado del host e informarlas como parte de la invocación de prueba. Ya hay disponibles varios recopiladores genéricos para diferentes casos de uso, pero siempre damos la bienvenida a nuevas contribuciones.

Para especificar el recopilador que se usará en su invocación de Tradefed, simplemente necesita agregar el objeto a su configuración XML de Tradefed:

Ejemplo:

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

Algunos colectores existentes actualmente: * TemperatureCollector que recoge la temperatura periódicamente durante la ejecución de la prueba. * AtraceCollector que recopila usando 'atrace' para cada caso de prueba.

En el lado del dispositivo

Cuando se ejecutan pruebas del lado del dispositivo (instrumentación, pruebas de UIAutomator, etc.), tener un recopilador en el lado del host que recopile de forma asincrónica podría no ser lo ideal. Por ejemplo, una captura de pantalla tomada de forma asíncrona probablemente perderá la pantalla deseada y será inútil.

Para cumplir con estos casos de uso, existe una versión del lado del dispositivo de nuestros recopiladores y se puede usar en cualquier instrumentación '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 está utilizando el corredor ' AndroidJUnitTest ' de Tradefed, simplemente puede especificar la siguiente opción de línea de comando para que su recopilador se ejecute con sus pruebas:

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

PRECAUCIÓN: Para que las clases de recopiladores se resuelvan en tiempo de ejecución, lo más probable es que su APK de instrumentación deba incluirlas estáticamente agregando a su archivo MAKE lo siguiente:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Las contribuciones a los recopiladores del lado del dispositivo también son bienvenidas.

Consideración especial para suites

Para conjuntos como 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 ). En realidad está prohibido.

Para garantizar que la recopilación de métricas se aplique por igual 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 de la suite.

¿Cómo recopilar archivos de registro de dispositivos de un módulo?

Hay una configuración disponible para que una prueba del lado 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>

Al especificar estos patrones y 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 debe registrarse. Se realiza de manera similar al lado del host (descrito anteriormente).

  1. Agregue el collector-device-lib a su APK de prueba en los archivos de creación:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilice 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 bajo el cual se informará el archivo. Este es el nombre que debe hacer coincidir en FilePullerDeviceMetricCollector para que se extraiga automáticamente. debe ser un nombre único.

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

¿Dónde encontrar las métricas?

Depende del result_reporter especificado en su configuración XML.