Come riportare metriche o dati da un test Tradefed

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

Il vantaggio di accedere tramite la pipeline Tradefed è 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 più strumentazione.

DeviceTestCase - stile JUnit3

Se il test si estende DeviceTestCase in una sorta di stile JUnit3 di test, è possibile chiamare il metodo addTestMetric(String key, String value) dall'interno eventuali casi di test per segnalare una metrica. Questo può essere chiamato più volte fintanto che la chiave è 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 di essere disponibile nei result_reporters , è possibile chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) dall'interno eventuali casi 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 - normale test JUnit3

Se vuoi segnalare metriche all'interno Tradefed da una normale classe di JUnit3 TestCase, avrà bisogno di essere convertito in una MetricTestCase invece che è la stessa classe con un metodo in più: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - stile JUnit4

Se il test stile JUnit4 è in esecuzione con DeviceJUnit4ClassRunner , allora si può anche registrare metriche all'interno di un banco di prova (all'interno @Test) per essere riportato da Tradefed. Sarà necessario utilizzare TestMetrics regole 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");
        }
    }

Al fine di file di report, si utilizzerà la TestLogData regola 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 si sta scrivendo la propria classe Tradefed di prova o un corridore si implemement IRemoteTest e ottenere un ITestInvocationListener attraverso il run() metodo. Questo listener può essere utilizzato per registrare le metriche come segue:

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

Raccoglitori di metriche Tradefed

Tradefed fornisce un apposito metrics_collector oggetto metriche raccogliersi in parallelo delle prove.

Dalla parte dell'host

BaseDeviceMetricCollector può essere implementato per raccogliere metriche dal lato host e segnalarli come parte della invocazione di prova. Sono già disponibili numerosi raccoglitori generici per diversi casi d'uso, ma accogliamo sempre con favore nuovi contributi.

Per specificare il raccoglitore 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 collezionisti attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie utilizzando 'Atrace' per ogni caso di test.

Sul lato del dispositivo

Quando si eseguono test sul lato del dispositivo (Strumenti, test UIAutomator e così via), avere un collector sul lato host che raccoglie in modo asincrono potrebbe non essere l'ideale. Ad esempio, uno screenshot eseguito in modo asincrono molto probabilmente mancherà lo schermo desiderato 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 al fine di segnalare automaticamente metriche che vengono raccolti in modo pienamente compatibile con la segnalazione gasdotto Tradefed.

Se si utilizza il ' AndroidJUnitTest corridore' dal Tradefed, è possibile specificare semplicemente la seguente opzione riga di comando per avere il vostro raccoglitore in esecuzione con i test:

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

ATTENZIONE: Affinché le classi di raccolta vengano risolte in fase di esecuzione, è molto probabile che l'APK di strumentazione debba includerle staticamente aggiungendo al makefile quanto segue:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Sono benvenuti anche i contributi ai raccoglitori lato dispositivo.

Considerazione speciale per le suite

Per suite come CTS che hanno una configurazione a livello di top esecuzione di alcune configurazioni del modulo, non c'è bisogno di specificare metrics_collector in ogni configurazione del modulo ( AndroidTest.xml ). In realtà è vietato.

Garantire la raccolta metrica viene applicato allo stesso modo 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.

Come raccogliere i file di registro del dispositivo da un modulo?

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

AndroidTest.xml può specificare un collezionista che cercherà di file sul dispositivo e tirare.

  <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 la chiave, il collector, se vede la chiave, tenterà di estrarre e registrare il file associato.

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

  1. Aggiungere il collector-device-lib al tuo APK di test nei file di make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Usa 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 KEY nome nell'esempio di sopra è il nome con cui verrà segnalato il file. Questo è il nome che dovrebbe corrispondere al FilePullerDeviceMetricCollector per farlo tirato automaticamente. dovrebbe essere un nome univoco.

NOTA: Una volta che il file è tirato, FilePullerDeviceMetricCollector pulisce automaticamente dal dispositivo.

Dove trovare le metriche?

Dipende della result_reporter specificato nella configurazione XML.