Gerar relatórios sobre métricas ou dados de um teste Tradefed

Esta página descreve como relatar métricas junto com os resultados do teste ao gravar um teste no Tradefed.

O benefício de fazer o registro pelo pipeline Tradefed é encontrar suas métricas junto aos resultados funcionais. O registro de métricas pode ser feito de modo muito natural nos testes. Assim, os criadores de testes podem adicionar mais e instrumentalização.

DeviceTestCase: estilo JUnit3

Se o teste estender DeviceTestCase em um tipo de teste no estilo JUnit3, será possível chamar o método addTestMetric(String key, String value) dentro de qualquer caso de teste para informar uma métrica. Ele pode ser chamado várias vezes, desde que a chave seja exclusiva.

Exemplo:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Se você quiser registrar um arquivo para que ele fique disponível no result_reporters, chame o método addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) de dentro de qualquer caso de teste para informar um arquivo para registro.

Exemplo:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase: teste JUnit3 regular

Se você quiser relatar métricas dentro do Tradefed de um TestCase JUnit3 normal, classe, ele precisará ser convertido em um MetricTestCase, que é o exatamente a mesma classe com um método extra: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner: estilo JUnit4

Se o teste no estilo JUnit4 estiver sendo executado com DeviceJUnit4ClassRunner, você também poderá registrar métricas em um caso de teste (dentro de @Test) para serem relatadas pelo Tradefed. Você vai precisar usar TestMetrics regras para gerar relatórios sobre as métricas.

Exemplo:

    @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 arquivos, você usará a regra TestLogData.

Exemplo:

    @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: teste Tradefed puro

Se você estiver escrevendo sua própria classe ou executor de teste Tradefed, vai implementar IRemoteTest e receber um ITestInvocationListener pelo método run(). Esse listener pode ser usado para registrar métricas da seguinte maneira:

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

Coletores de métricas da Tradefed

A Tradefed fornece um objeto metrics_collector dedicado para coletar métricas em paralelo dos testes.

Do lado do host

O BaseDeviceMetricCollector pode ser implementado para coletar métricas do lado do host e informar como parte da invocação do teste. Vários coletores genéricos já estão disponíveis para diferentes casos de uso, mas sempre aceitamos novas contribuições.

Para especificar o coletor a ser usado na invocação do Tradefed, basta adicionar o objeto à configuração XML do Tradefed:

Exemplo:

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

Alguns coletores atuais: * TemperaturaCollector que coleta a temperatura periodicamente durante a execução do teste. * AtraceCollector que coleta usando "atrace" para cada caso de teste.

No dispositivo

Ao executar testes no lado do dispositivo (Instrumentações, testes do UIAutomator etc.), ter um coletor no lado do host coletando de forma assíncrona pode não ser ideal. Por exemplo, uma captura de tela tirada de forma assíncrona provavelmente não vai mostrar a tela desejada e será inútil.

Para atender a esses casos de uso, existe uma versão dos coletores do dispositivo que pode ser usada em qualquer instrumentação do "AndroidJUnitRunner". O BaseMetricListener pode ser implementado para informar automaticamente as métricas coletadas de maneira totalmente compatível com o pipeline de relatórios do Tradefed.

Se você estiver usando o AndroidJUnitTest, runner do Tradefed, basta especificar a seguinte opção de linha de comando para executar o coletor com os testes:

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

ATENÇÃO: para que as classes de coletor sejam resolvidas no tempo de execução, seu APK de instrumentação provavelmente precisará incluí-las de forma estática adicionando ao makefile o seguinte:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Contribuições para coletores do dispositivo também são bem-vindas.

Considerações especiais para suítes

Para pacotes como o CTS, que têm uma configuração de nível superior executando algum módulo configurações diferentes, não é necessário especificar metrics_collector em cada módulo (AndroidTest.xml). Na verdade, isso é proibido.

Para garantir que a coleta de métricas seja aplicada igualmente a cada módulo, somente a configuração de nível superior (por exemplo, cts.xml) pode especificar metrics_collector, conforme explicado acima. Esses coletores serão aplicados e executados em cada módulo do pacote.

Coletar arquivos de registros do dispositivo de um módulo

Uma configuração está disponível para que um teste no lado do dispositivo notifique que alguns arquivos devem ser coletados.

AndroidTest.xml pode especificar um coletor que vai procurar e extrair arquivos no dispositivo.

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

Ao especificar esses padrões e a chave, o coletor se encontrar a chave extrair e registrar o arquivo associado.

Para que essas chaves sejam geradas, um teste do lado do dispositivo (instrumentação) especificar o arquivo que será registrado. Isso é feito de maneira semelhante do host (descrito acima).

  1. Adicione collector-device-lib ao APK de teste nos arquivos de criação:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Use a @rule que fornecemos para registrar arquivos:
    @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);
        }
    }

O nome KEY no exemplo acima é o nome sob o qual o arquivo será relatadas. Esse é o nome que você precisa corresponder no FilePullerDeviceMetricCollector para que ele seja extraído automaticamente. Ele precisa ser um nome exclusivo.

OBSERVAÇÃO: depois que o arquivo é extraído, o FilePullerDeviceMetricCollector o limpa automaticamente do dispositivo.

Onde encontro as métricas?

Depende do result_reporter especificado na configuração XML.