Informar métricas o datos de una prueba Tradefed

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

El beneficio de iniciar sesión en el canal 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 hace que sea conveniente para los redactores de pruebas agregar 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 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 JUnit3 normal

Si desea informar métricas dentro de Tradefed desde una clase JUnit3 TestCase normal, deberá convertirla 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á utilizar las reglas 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 reportar archivos, utilizará la regla TestLogData para reportarlo.

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

Si está escribiendo su propia clase o corredor de prueba 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);

Recopiladores de métricas comercializadas

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

Del lado anfitrión

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

Para especificar el recopilador que se utilizará 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 utilizando 'atrace' para cada caso de prueba.

Del lado del dispositivo

Al ejecutar pruebas del lado del dispositivo (instrumentos, pruebas de UIAutomator, etc.), tener un recopilador en el lado del host que recopile de forma asincrónica puede no ser lo ideal. Por ejemplo, una captura de pantalla tomada de forma asincrónica 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 métricas que se recopilan de una manera totalmente compatible con el canal de informes 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 del recopilador 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

También son bienvenidas las contribuciones a los coleccionistas del lado del dispositivo.

Consideración especial para suites

Para suites como CTS que tienen una configuración de nivel superior que ejecuta algunas configuraciones de módulo, no es necesario especificar metrics_collector en cada configuración de módulo ( AndroidTest.xml ). De hecho, está prohibido.

Para garantizar que la colecció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.

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 (instrumentación) del lado del dispositivo debe especificar el archivo que debe registrarse. Se hace de manera similar al lado del host (descrito anteriormente).

  1. Agregue el collector-device-lib a su APK de prueba en los archivos make:
  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 coincidir en FilePullerDeviceMetricCollector para que se extraiga automáticamente. debería ser un nombre único.

NOTA: Una vez extraído el archivo, FilePullerDeviceMetricCollector lo limpia automáticamente del dispositivo.

¿Dónde encuentro las métricas?

Depende del result_reporter especificado en su configuración XML.