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 di accedere tramite la pipeline Tradefed è quello di 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 strumentazione.

DeviceTestCase - JUnit3 style

Se il test estende DeviceTestCase in un test in stile JUnit3, puoi chiamare il metodo addTestMetric(String key, String value) dall'interno di qualsiasi caso di test per segnalare una metrica. 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 - regular JUnit3 test

Se vuoi generare report sulle metriche all'interno di Tradefed da una normale classe JUnit3 TestCase, dovrai convertirla in un 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) da segnalare a Tradefed. Per generare report sulle metriche, devi utilizzare le regole TestMetrics.

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 - pure Tradefed Test

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 nel seguente modo:

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

Raccolta di metriche Tradefed

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

Per quanto riguarda l'organizzatore

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

Per specificare il raccoglitore da utilizzare nell'invocazione di 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>

Alcuni raccoglitori attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie i dati utilizzando "atrace" per ogni scenario di test.

Sul lato del dispositivo

Quando esegui test lato dispositivo (strumentazioni, test UIAutomator e così via), avere un raccoglitore 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 lato dispositivo dei nostri raccoglitori che può essere utilizzata in qualsiasi strumentazione "AndroidJUnitRunner". BaseMetricListener può essere implementato per generare automaticamente report sulle metriche raccolte in modo completamente compatibile con la pipeline di generazione dei report di Tradefed.

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

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

ATTENZIONE: affinché le classi di raccolta vengano risolte in fase di runtime, l'APK di strumentazione dovrà probabilmente includerle staticamente aggiungendo quanto segue al makefile:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Sono ben accetti anche i contributi ai raccoglitori 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 moduli (AndroidTest.xml). È effettivamente vietato.

Per garantire che la raccolta delle 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 sopra. Questi raccoglitori verranno applicati ed eseguiti su ogni modulo della suite.

Raccogliere i file di log del dispositivo da un modulo

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

AndroidTest.xml può specificare un raccoglitore che cercherà i file sul dispositivo e li estrarrà.

  <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 il raccoglitore rileva la chiave, specificando questi pattern e la chiave, tenterà di estrarre e registrare il file associato.

Affinché queste chiavi vengano generate, un test lato dispositivo (strumentazione) deve specificare il file da registrare. L'operazione viene eseguita in modo simile a quella lato host (descritta sopra).

  1. Aggiungi collector-device-lib all'APK di test nei file make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilizza la regola @che forniamo ai file di log:
    @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 abbinare in FilePullerDeviceMetricCollector per recuperarlo automaticamente. Deve essere un nome univoco.

NOTA: una volta estratto il file, FilePullerDeviceMetricCollector lo cancella automaticamente dal dispositivo.

Dove si trovano le metriche?

Dipende dal result_reporter specificato nella configurazione XML.