Generare report sulle metriche o sui dati di un test TradeFed

Questa pagina descrive come segnalare le metriche insieme ai risultati dei test quando scrivi un test in Tradefed.

Il vantaggio della registrazione tramite la pipeline di Tradefed è che puoi trovare le metriche insieme ai risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, il che rende più comodo per gli autori dei test aggiungere più strumentazione.

DeviceTestCase - stile JUnit3

Se il test estende DeviceTestCase in un test di tipo JUnit3, puoi chiamare il metodo addTestMetric(String key, String value) dall'interno di qualsiasi scenario di test per segnalare una metrica. Questo metodo può essere chiamato più volte, purché la chiave sia univoca.

Esempio:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Se vuoi registrare un file in modo che sia disponibile in result_reporters, puoi chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) dall'interno di qualsiasi scenario di test per segnalare un file da registrare.

Esempio:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase - test JUnit3 standard

Se vuoi segnalare le metriche all'interno di Tradefed da una classe TestCase JUnit3 standard, dovrai convertirla in una MetricTestCase, che è la stessa classe con un metodo aggiuntivo: addTestMetric(String key, String value).

DeviceJUnit4ClassRunner - stile JUnit4

Se il test in stile JUnit4 viene eseguito con DeviceJUnit4ClassRunner, puoi anche registrare le metriche all'interno di uno scenario di test (all'interno di @Test) in modo che vengano segnalate da Tradefed. Dovrai utilizzare le regole TestMetrics per segnalare le metriche.

Esempio:

    @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");
        }
    }

Per segnalare i file, utilizzerai la regola TestLogData.

Esempio:

    @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 - test Tradefed puro

Se stai scrivendo la tua classe o il tuo runner di test Tradefed, implementerai IRemoteTest e otterrai un ITestInvocationListener tramite il metodo run(). Questo listener può essere utilizzato per registrare le metriche come segue:

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

Raccolte di metriche Tradefed

Tradefed fornisce un oggetto metrics_collector dedicato per raccogliere le metriche in parallelo ai test.

Sul lato host

BaseDeviceMetricCollector può essere implementato per raccogliere qualsiasi metrica dal lato host e segnalarla come parte della chiamata di test. Sono già disponibili diverse raccolte generiche per diversi casi d'uso, ma accettiamo sempre nuovi contributi.

Per specificare l'agente di raccolta da utilizzare nella chiamata Tradefed, devi semplicemente aggiungere l'oggetto alla configurazione XML di Tradefed:

Esempio:

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

Alcune raccolte esistenti: * TemperatureCollector che raccoglie periodicamente la temperatura durante l'esecuzione del test. * AtraceCollector che raccoglie utilizzando 'atrace' per ogni scenario di test.

Sul lato dispositivo

Quando esegui test sul lato dispositivo (strumentazioni, test UIAutomator e così via), avere un agente di raccolta sul lato host che raccoglie in modo asincrono potrebbe non essere l'ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente non mostrerà la schermata desiderata e sarà inutile.

Per soddisfare questi casi d'uso, esiste una versione sul lato dispositivo delle nostre raccolte che può essere utilizzata in qualsiasi strumentazione "AndroidJUnitRunner". BaseMetricListener può essere implementato per segnalare automaticamente le metriche raccolte in modo completamente compatibile con la pipeline di reporting di Tradefed.

Se utilizzi il runner "AndroidJUnitTest" di Tradefed, puoi semplicemente specificare la seguente opzione della riga di comando per eseguire l'agente di raccolta con i test:

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

ATTENZIONE: affinché le classi dell'agente di raccolta vengano risolte in fase di tempo di esecuzione, l'APK di instrumentazione dovrà molto probabilmente includerle staticamente aggiungendo quanto segue al makefile:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Sono benvenuti anche i contributi alle raccolte sul lato dispositivo.

Considerazione speciale per le suite

Per le suite come CTS che hanno una configurazione di primo livello che esegue alcune configurazioni di moduli, non è necessario specificare metrics_collector in ogni configurazione di modulo (AndroidTest.xml). In realtà è vietato.

Per garantire che la raccolta di metriche venga applicata in modo uniforme a ogni modulo, solo la configurazione di primo livello (ad esempio, cts.xml) può specificare metrics_collector come spiegato in precedenza. Queste raccolte verranno applicate ed eseguite su ogni modulo della suite.

Raccogliere i file di log del dispositivo da un modulo

È disponibile una configurazione che consente a un test sul lato dispositivo di notificare che alcuni file devono essere raccolti.

AndroidTest.xml può specificare un agente di raccolta che cercherà i file sul dispositivo e li recupererà.

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

Se l'agente di raccolta rileva queste chiavi e questi pattern, tenterà di eseguire il pull e registrare il file associato.

Affinché queste chiavi vengano generate, un test sul lato dispositivo (strumentazione) deve specificare il file da registrare. Questa operazione viene eseguita in modo simile al lato host (descritto in precedenza).

  1. Aggiungi collector-device-lib all'APK di test nei makefile:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilizza la regola @rule che forniamo per registrare i file:
    @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);
        }
    }

Il nome KEY nell'esempio precedente è il nome con cui verrà segnalato il file. Questo è il nome che devi corrispondere in FilePullerDeviceMetricCollector per recuperarlo automaticamente. Deve essere un nome univoco.

NOTA: una volta recuperato il file, FilePullerDeviceMetricCollector lo elimina automaticamente dal dispositivo.

Dove trovo le metriche?

Dipende da result_reporter specificato nella configurazione XML.