Generare report sulle metriche o sui dati di un test TradeFed

Questa pagina descrive come generare report sulle metriche insieme ai risultati dei test durante la scrittura un test in Tradefed.

Il vantaggio del logging tramite la pipeline Tradefed è trovare le metriche insieme i risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, consentendo agli autori di test di aggiungere la strumentazione di lavoro.

DeviceTestCase - Stile JUnit3

Se il test estende DeviceTestCase in un tipo di test di tipo JUnit3, puoi chiamare il metodo addTestMetric(String key, String value) da qualsiasi scenario di test da segnalare di 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 vuoi registrare un file affinché sia disponibile nell'result_reporters, puoi chiama il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) all'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 generare report sulle metriche all'interno di Tradefed da un normale testCase JUnit3 , dovrà essere convertita in MetricTestCase, ovvero 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 registrare da 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 - Test puro Tradefed

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

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

Raccoglitori delle metriche scambiate

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

Sul lato host

BaseDeviceMetricCollector può essere implementato per raccogliere le metriche lato host e registrarle come parte dell'invocazione del test. È già disponibile un certo numero di collezionisti generici per diversi casi d'uso, ma accogliamo sempre con entusiasmo nuovi contributi.

Per specificare il raccoglitore da utilizzare nell'invocazione di Tradefed, basta 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 collezionisti attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie i dati utilizzando "atrace" per ogni test case.

Lato dispositivo

Durante l'esecuzione di test lato dispositivo (strumentazioni, test UIAutomator e così via), un raccoglitore sul lato host che raccoglie in modo asincrono potrebbe ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente non conterrà la schermata che ti interessa e sarà inutile.

Per soddisfare questi casi d'uso, esiste una versione lato dispositivo dei nostri raccoglitori e può essere utilizzato in qualsiasi "AndroidJUnitRunner" la strumentazione di lavoro. BaseMetricListener può essere implementato per generare automaticamente report sulle metriche raccolte in un modo completamente compatibile con la pipeline di generazione di report di TradeFed.

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

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

ATTENZIONE: affinché le classi di collector vengano risolte in fase di runtime, è molto probabile che l'APK di ispezione debba includerle in modo statico aggiungendo al file make quanto segue:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Sono benvenuti anche i contributi ai collector lato dispositivo.

Considerazione speciale per le suite

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

Per garantire che la raccolta delle metriche venga applicata allo stesso modo a ogni modulo, solo la configurazione di primo livello (ad esempio cts.xml) può specificare metrics_collector come spiegato sopra. Questi collezionisti 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à il file nella dispositivo ed eseguire il pull.

  <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 pattern e la chiave, il raccoglitore, se vede la chiave, di eseguire il pull e il log del file associato.

Affinché queste chiavi vengano generate, un test lato dispositivo (strumentazione) deve specificare il file da registrare. Viene fatto in modo simile lato host (descritto sopra).

  1. Aggiungi collector-device-lib all'APK di test nei file make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Utilizza la @regola fornita per i 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 il file verrà segnalato. Questo è il nome che devi trovare nel FilePullerDeviceMetricCollector per eseguire l'estrazione automatica. dovrebbe essere un nome univoco.

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

Dove si trovano le metriche?

Dipende dal valore result_reporter specificato nella configurazione XML.