Messwerte oder Daten aus einem Tradefed-Test melden

Auf dieser Seite wird beschrieben, wie Sie beim Erstellen eines Tests in Tradefed Messwerte zusammen mit Testergebnissen erfassen.

Der Vorteil der Protokollierung über die Tradefed-Pipeline besteht darin, dass Sie Ihre Messwerte neben Ihren funktionalen Ergebnissen finden. Das Logging von Messwerten kann ganz einfach innerhalb von Tests erfolgen, was es für Testautoren bequem macht, weitere Instrumentierung hinzuzufügen.

DeviceTestCase – JUnit3-Stil

Wenn Ihr Test DeviceTestCase in einem JUnit3-Test erweitert, können Sie die Methode addTestMetric(String key, String value) innerhalb von Testfällen aufrufen, um einen Messwert zu erfassen. Diese Funktion kann mehrmals aufgerufen werden, solange der Schlüssel eindeutig ist.

Beispiel:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Wenn Sie eine Datei protokollieren möchten, die im result_reporters verfügbar sein soll, können Sie die Methode addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) innerhalb von Testfällen aufrufen, um eine Datei zum Protokollieren anzugeben.

Beispiel:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase – regulärer JUnit3-Test

Wenn Sie Messwerte in Tradefed aus einer regulären JUnit3-TestCase-Klasse erfassen möchten, muss sie in eine MetricTestCase umgewandelt werden. Das ist dieselbe Klasse mit einer zusätzlichen Methode: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner – JUnit4-Stil

Wenn Ihr JUnit4-Test mit DeviceJUnit4ClassRunner ausgeführt wird, können Sie auch Messwerte innerhalb eines Testfalls (in @Test) protokollieren, die von Tradefed erfasst werden. Sie müssen TestMetrics-Regeln verwenden, um Ihre Messwerte zu erfassen.

Beispiel:

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

Wenn Sie Dateien melden möchten, verwenden Sie die Regel TestLogData.

Beispiel:

    @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 – reiner Tradefed-Test

Wenn Sie Ihre eigene Tradefed-Testklasse oder ‑Ausführung schreiben, implementieren Sie IRemoteTest und erhalten eine ITestInvocationListener über die Methode run(). Mit diesem Listener können Sie Messwerte wie folgt protokollieren:

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

Erfasser von Tradefed-Messwerten

Tradefed bietet ein spezielles metrics_collector-Objekt, mit dem Messwerte parallel zu den Tests erfasst werden können.

Auf der Hostseite

BaseDeviceMetricCollector kann implementiert werden, um alle Messwerte auf Hostseite zu erfassen und im Rahmen der Testausführung zu melden. Es gibt bereits eine Reihe von generischen Collectorn für verschiedene Anwendungsfälle. Wir freuen uns aber immer über neue Beiträge.

Um den Collector anzugeben, der in Ihrem Tradefed-Aufruf verwendet werden soll, müssen Sie das Objekt einfach Ihrer Tradefed-XML-Konfiguration hinzufügen:

Beispiel:

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

Einige derzeit vorhandene Messwerte: * TemperatureCollector, mit dem die Temperatur während des Testlaufs regelmäßig erfasst wird. * AtraceCollector, der Daten mit 'atrace' für jeden Testlauf erfasst.

Auf Geräteseite

Wenn Sie geräteseitige Tests (Instrumentierungen, UIAutomator-Tests usw.) ausführen, ist es möglicherweise nicht ideal, einen Hosts-basierten Listener zu verwenden, der asynchron Daten erhebt. Ein asynchron erstellter Screenshot wird beispielsweise höchstwahrscheinlich den gewünschten Bildschirm übersehen und nutzlos sein.

Um diese Anwendungsfälle zu erfüllen, ist eine geräteseitige Version unserer Collectors vorhanden, die in jeder „AndroidJUnitRunner“-Instrumentierung verwendet werden kann. BaseMetricListener kann implementiert werden, um Messwerte automatisch zu erfassen, die auf eine Weise erfasst werden, die vollständig mit der Tradefed-Berichtspipeline kompatibel ist.

Wenn Sie den AndroidJUnitTest-Auslöser von Tradefed verwenden, können Sie einfach die folgende Befehlszeilenoption angeben, damit der Profiler mit Ihren Tests ausgeführt wird:

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

ACHTUNG: Damit die Collector-Klassen zur Laufzeit aufgelöst werden, muss das Instrumentierungs-APK sie höchstwahrscheinlich statisch einbinden. Dazu fügt das Makefile Folgendes in das Makefile ein:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Beiträge zu geräteseitigen Collectors sind ebenfalls willkommen.

Besondere Überlegungen zu Suiten

Bei Suites wie CTS, die eine Top-Level-Konfiguration mit einigen Modulkonfigurationen haben, muss metrics_collector nicht in jeder Modulkonfiguration (AndroidTest.xml) angegeben werden. Dies ist sogar verboten.

Damit die Messwerterhebung auf alle Module gleichermaßen angewendet wird, kann metrics_collector wie oben beschrieben nur in der Konfigurationsebene auf oberster Ebene (z. B. cts.xml) angegeben werden. Diese Collectors werden auf jedes Modul der Suite angewendet und ausgeführt.

Geräteprotokolldateien aus einem Modul erfassen

Es ist eine Konfiguration verfügbar, mit der über einen geräteseitigen Test benachrichtigt werden kann, dass einige Dateien erfasst werden sollten.

AndroidTest.xml kann einen Aggregator angeben, der nach Dateien auf dem Gerät sucht und sie abruft.

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

Wenn Sie diese Muster und den Schlüssel angeben, versucht der Collector, die zugehörige Datei abzurufen und zu protokollieren.

Damit diese Schlüssel generiert werden können, muss in einem geräteseitigen Test (Instrumentierung) die Datei angegeben werden, die protokolliert werden soll. Die Einrichtung erfolgt ähnlich wie auf der Hostseite (siehe oben).

  1. Fügen Sie in den Make-Dateien die collector-device-lib zu Ihrem Test-APK hinzu:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Verwenden Sie die von uns bereitgestellte @rule, um Dateien zu protokollieren:
    @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);
        }
    }

Der Name KEY im obigen Beispiel ist der Name, unter dem die Datei gemeldet wird. Dieser Name muss mit dem in der FilePullerDeviceMetricCollector übereinstimmen, damit er automatisch abgerufen wird. Er muss eindeutig sein.

HINWEIS: Nachdem die Datei abgerufen wurde, wird sie von FilePullerDeviceMetricCollector automatisch vom Gerät gelöscht.

Wo finde ich die Messwerte?

Das hängt von result_reporter ab, das in Ihrer XML-Konfiguration angegeben ist.