Riporta metriche o dati da un test Tradefed

Questa pagina descrive come riportare le metriche insieme ai risultati del test quando si scrive un test in Tradefed.

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

DeviceTestCase: stile JUnit3

Se il test estende DeviceTestCase in un tipo di test in stile JUnit3, puoi chiamare il metodo addTestMetric(String key, String value) dall'interno di qualsiasi test case per segnalare una metrica. Questo 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 si desidera registrare un file affinché sia ​​disponibile in result_reporters , è possibile chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) dall'interno di qualsiasi test case 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 regolare di JUnit3

Se desideri riportare le metriche all'interno di Tradefed da una normale classe JUnit3 TestCase, dovrà invece essere convertita in MetricTestCase che è esattamente la stessa classe con un metodo aggiuntivo: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner: stile JUnit4

Se il tuo test di stile JUnit4 è in esecuzione con DeviceJUnit4ClassRunner , puoi anche registrare i parametri all'interno di un test case (all'interno di @Test) per essere segnalati da Tradefed. Dovrai utilizzare le regole TestMetrics per segnalare le tue 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 per segnalarlo.

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

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

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

Raccoglitori di metriche Tradefed

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

Dalla parte dell'ospite

BaseDeviceMetricCollector può essere implementato per raccogliere eventuali parametri dal lato host e segnalarli come parte dell'invocazione del test. Sono già disponibili numerosi raccoglitori generici per diversi casi d'uso, ma siamo sempre benvenuti a nuovi contributi.

Per specificare il collector da utilizzare nella tua invocazione Tradefed, devi semplicemente aggiungere l'oggetto alla tua configurazione XML Tradefed:

Esempio:

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

Alcuni collettori attualmente esistenti: * TemperatureCollector che raccoglie periodicamente la temperatura durante il test. * AtraceCollector che raccoglie utilizzando 'atrace' per ogni caso di test.

Lato dispositivo

Quando si eseguono test lato dispositivo (strumentazioni, test UIAutomator e così via), avere un raccoglitore sul lato host che raccoglie in modo asincrono potrebbe non essere l'ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente mancherà 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 segnalare automaticamente le metriche raccolte in modo pienamente compatibile con la pipeline di reporting di Tradefed.

Se stai utilizzando il runner " AndroidJUnitTest " di Tradefed, puoi semplicemente specificare la seguente opzione della riga di comando per far funzionare il tuo raccoglitore con i tuoi test:

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

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

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Sono benvenuti anche i contributi ai collezionisti lato dispositivo.

Considerazione speciale per le suite

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

Per garantire che la raccolta di parametri venga applicata equamente a ciascun modulo, solo la configurazione di livello superiore (ad esempio, cts.xml ) può specificare metrics_collector come spiegato sopra. Questi raccoglitori verranno applicati ed eseguiti su ciascun modulo della suite.

Raccogli i file di registro del dispositivo da un modulo

È disponibile una configurazione affinché un test lato dispositivo possa 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>

Specificando questi modelli e chiave, il raccoglitore se vede la chiave tenterà di estrarre e registrare il file associato.

Affinché queste chiavi possano essere generate, un test lato dispositivo (strumentazione) dovrebbe specificare il file che dovrebbe essere registrato. Viene eseguito in modo simile al lato host (descritto sopra).

  1. Aggiungi collector-device-lib al tuo APK di prova nei file make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilizza la @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 sopra è il nome con cui verrà riportato il file. Questo è il nome che dovresti abbinare in FilePullerDeviceMetricCollector per farlo estrarre automaticamente. dovrebbe essere un nome univoco.

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

Dove trovo le metriche?

Dipende dal result_reporter specificato nella configurazione XML.