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 del registro a través de la canalización de Tradefed es que permite encontrar tus métricas tus resultados funcionales. El registro de métricas se puede hacer de forma muy natural dentro de las pruebas, lo que permite que los autores de pruebas agreguen más instrumentación.
DeviceTestCase: Estilo JUnit3
Si la prueba extiende DeviceTestCase
En una 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 esta función 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 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 una MetricTestCase
, que es 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) que se informarán
Tradefed. Deberás usar reglas TestMetrics
para generar informes de 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 prueba 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);
Colectores de métricas de Tradefed
Tradefed proporciona un objeto metrics_collector
exclusivo para recopilar métricas en
paralelo con las pruebas.
Del lado del host
Se puede implementar BaseDeviceMetricCollector para recopilar métricas del host y, luego, informarlas como parte de la invocación de prueba. Ya hay varios recopiladores genéricos disponibles para diferentes casos de uso, pero siempre recibimos con gusto nuevas contribuciones.
Para especificar el recopilador que se usará en tu invocación de Tradefed, solo debes agregar el objeto a la configuración de XML de Tradefed:
Ejemplo:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
Estos son algunos de los recopiladores existentes actualmente: * TemperatureCollector, que recopila la temperatura periódicamente 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 dispositivo (instrumentaciones, pruebas de UIAutomator, etc.), es posible que tener un recopilador en el host recolecta de forma asíncrona no sea lo ideal. Por ejemplo, es probable que una captura de pantalla tomada de forma asíncrona no incluya la pantalla que se desea y sea inútil.
Para cumplir con estos casos de uso, existe una versión del dispositivo de nuestros recopiladores y puede usarse en cualquier instancia de "AndroidJUnitRunner" y la instrumentación. Se puede implementar BaseMetricListener 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 el recopilador se ejecute con tus pruebas:
--device-listeners android.device.collectors.ScreenshotListener
CUIDADO: Para que las clases del recopilador se resuelvan en el tiempo de ejecución, es probable que tu APK de instrumentación deba incluirlas de forma estática. Para ello, agrega lo siguiente a tu archivo de configuración:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
También se aceptan contribuciones a los recopiladores del dispositivo.
Consideraciones especiales para los paquetes
Para paquetes como CTS que tienen una configuración de nivel superior que ejecuta algún módulo
no es necesario especificar metrics_collector
en cada módulo
configuración (AndroidTest.xml
). En realidad, está prohibido.
Para garantizar que la recopilación de métricas se aplique de la misma manera 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 lateral del dispositivo notifique que algunos archivos que se deben recopilar.
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>
Cuando se especifican estos patrones y esta clave, el recopilador, si ve la clave, intenta extraer y registrar el archivo asociado.
Para que se generen estas claves, se debe realizar una prueba del lado del dispositivo (instrumentación) debe especificar el archivo que se debe registrar. Se hace de una manera similar al lado del host (descrito anteriormente).
- Agrega el
collector-device-lib
a tu APK de prueba en los archivos make:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Usa la @rule 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 que debes hacer coincidir en la
FilePullerDeviceMetricCollector
para que se extraiga automáticamente. debería ser
con 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.