Relatar métricas ou dados de um teste Tradefed

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

A vantagem de registrar através do pipeline Tradefed é encontrar suas métricas junto com seus resultados funcionais. O registro de métricas pode ser feito naturalmente nos testes, o que torna conveniente para os redatores de testes adicionarem mais instrumentação.

DeviceTestCase - estilo JUnit3

Se o seu teste estender DeviceTestCase em um tipo de teste no estilo JUnit3, você poderá chamar o método addTestMetric(String key, String value) de dentro de qualquer caso de teste para relatar uma métrica. Isso pode ser chamado várias vezes, desde que a chave seja única.

Exemplo:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Se você deseja registrar um arquivo para estar disponível em result_reporters , você pode chamar o método addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) de dentro de qualquer caso de teste para relatar um arquivo para registrar.

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ê deseja relatar métricas dentro do Tradefed a partir de uma classe JUnit3 TestCase regular, ela precisará ser convertida em um MetricTestCase , que é exatamente a mesma classe com um método extra: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - estilo JUnit4

Se o seu teste de 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ê precisará usar regras TestMetrics para relatar suas 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 reportar arquivos, você usará a regra TestLogData para reportá-los.

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, você implementará IRemoteTest e obterá um ITestInvocationListener por meio do método run() . Este 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 Tradefed

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

Do lado do anfitrião

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

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 existentes atualmente: * TemperatureCollector que coleta a temperatura periodicamente durante o teste. * AtraceCollector que coleta usando 'atrace' para cada caso de teste.

Do lado do dispositivo

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

Para atender a esses casos de uso, existe uma versão de nossos coletores no lado do dispositivo e pode ser usada em qualquer instrumentação 'AndroidJUnitRunner'. BaseMetricListener pode ser implementado para relatar automaticamente as métricas coletadas de uma forma totalmente compatível com o pipeline de relatórios do Tradefed.

Se você estiver usando o executor ' AndroidJUnitTest ' do Tradefed, você pode simplesmente especificar a seguinte opção de linha de comando para que seu coletor seja executado com seus testes:

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

CUIDADO: Para que as classes do coletor sejam resolvidas em tempo de execução, seu APK de instrumentação provavelmente precisará incluí-las estaticamente, adicionando ao seu makefile o seguinte:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

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

Consideração especial para suítes

Para suítes como o CTS que possuem uma configuração de nível superior executando algumas configurações de módulo, não há necessidade de especificar metrics_collector em cada configuração de módulo ( AndroidTest.xml ). Na verdade é proibido.

Para garantir que a coleção 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 conjunto.

Coletar arquivos de log do dispositivo de um módulo

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

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

  <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 chave, o coletor, se vir a chave, tentará extrair e registrar o arquivo associado.

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

  1. Adicione o collector-device-lib ao seu APK de teste nos arquivos make:
  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á relatado. Este é o nome que você deve corresponder no FilePullerDeviceMetricCollector para que ele seja extraído automaticamente. deve ser um nome exclusivo.

NOTA: Depois que o arquivo é extraído, FilePullerDeviceMetricCollector o limpa automaticamente do dispositivo.

Onde encontro as métricas?

Depende do result_reporter especificado na sua configuração XML.