Auf dieser Seite wird beschrieben, wie Sie Messwerte zusammen mit Testergebnissen melden, wenn Sie einen Test in Tradefed schreiben.
Der Vorteil der Protokollierung über die Tradefed-Pipeline besteht darin, dass Sie Ihre Messwerte zusammen mit Ihren funktionalen Ergebnissen finden. Messwerte können ganz einfach in Tests protokolliert werden, was es Testautoren erleichtert, weitere Instrumentierung hinzuzufügen.
DeviceTestCase – JUnit3-Stil
Wenn Ihr Test DeviceTestCase in einem JUnit3-ähnlichen Test erweitert, können Sie die Methode addTestMetric(String key, String value) in einem beliebigen Testfall aufrufen, um einen Messwert zu melden. 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, damit sie in result_reporters verfügbar ist, können Sie die Methode addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) in einem beliebigen Testfall aufrufen, um eine zu protokollierende Datei zu melden.
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 melden möchten, muss diese in eine MetricTestCase konvertiert werden. Das ist genau 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 in einem Testlauf (innerhalb von @Test) protokollieren, die von Tradefed gemeldet werden sollen. Sie müssen TestMetrics-Regeln verwenden, um Ihre Messwerte zu melden.
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 Ihren eigenen Tradefed-Runner schreiben, implementieren Sie IRemoteTest und erhalten ein ITestInvocationListener über die Methode run(). Mit diesem Listener können Sie Messwerte so protokollieren:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Tradefed-Messwerterfassung
Tradefed bietet ein spezielles metrics_collector-Objekt zum Erfassen von Messwerten parallel zu den Tests.
Auf der Hostseite
BaseDeviceMetricCollector kann implementiert werden, um beliebige Messwerte von der Hostseite zu erfassen und sie als Teil des Testaufrufs zu melden. Für verschiedene Anwendungsfälle sind bereits eine Reihe generischer Collectors verfügbar. Wir freuen uns aber immer über neue Beiträge.
Wenn Sie den Collector angeben möchten, 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 Collectors: * TemperatureCollector: Er erfasst die Temperatur während des Testlaufs in regelmäßigen Abständen. * AtraceCollector, der für jeden Testfall Daten mit „atrace“ erfasst.
Auf dem Gerät
Wenn Sie geräteseitige Tests (Instrumentations-, UIAutomator-Tests usw.) ausführen, ist es möglicherweise nicht ideal, wenn ein Collector auf der Hostseite asynchron Daten erfasst. Wenn beispielsweise ein Screenshot asynchron aufgenommen wird, wird wahrscheinlich nicht der gewünschte Bildschirm erfasst und der Screenshot ist nutzlos.
Um diese Anwendungsfälle zu erfüllen, gibt es eine geräteseitige Version unserer Collectors, die in jeder „AndroidJUnitRunner“-Instrumentierung verwendet werden kann. BaseMetricListener kann implementiert werden, um Messwerte, die auf eine Weise erfasst werden, die vollständig mit der Tradefed-Berichtspipeline kompatibel ist, automatisch zu melden.
Wenn Sie den Runner AndroidJUnitTest von Tradefed verwenden, können Sie einfach die folgende Befehlszeilenoption angeben, damit der Collector mit Ihren Tests ausgeführt wird:
--device-listeners android.device.collectors.ScreenshotListener
ACHTUNG: Damit die Collector-Klassen zur Laufzeit aufgelöst werden können, müssen sie höchstwahrscheinlich statisch in Ihr Instrumentierungs-APK eingebunden werden. Fügen Sie dazu Ihrer Make-Datei Folgendes hinzu:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Beiträge zu geräteseitigen Collectors sind ebenfalls willkommen.
Besondere Überlegungen für Suiten
Bei Suiten wie CTS, bei denen in einer Konfiguration auf oberster Ebene einige Modulkonfigurationen ausgeführt werden, muss metrics_collector nicht in jeder Modulkonfiguration (AndroidTest.xml) angegeben werden. Das ist sogar verboten.
Damit die Erfassung von Messwerten für alle Module gleich erfolgt, kann metrics_collector nur in der Konfiguration auf oberster Ebene (z. B. cts.xml) angegeben werden, wie oben beschrieben. Diese Collectors werden auf jedes Modul der Suite angewendet und für jedes Modul ausgeführt.
Gerätelogdateien aus einem Modul erfassen
Es ist eine Einrichtung verfügbar, damit bei einem geräteseitigen Test gemeldet wird, dass einige Dateien gesammelt werden sollten.
AndroidTest.xml kann einen Collector angeben, der auf dem Gerät nach Dateien 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, sobald er den Schlüssel sieht.
Damit diese Schlüssel generiert werden, muss in einem geräteseitigen Test (Instrumentation) die Datei angegeben werden, die protokolliert werden soll. Das Verfahren ist ähnlich wie auf der Hostseite (siehe oben).
- Fügen Sie der Test-APK in den Makefiles Folgendes hinzu:
collector-device-lib
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- 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. Das ist der Name, der in der FilePullerDeviceMetricCollector übereinstimmen muss, damit er automatisch abgerufen wird. Er sollte eindeutig sein.
HINWEIS: Sobald die Datei abgerufen wurde, wird sie von FilePullerDeviceMetricCollector automatisch vom Gerät gelöscht.
Wo finde ich die Messwerte?
Das hängt von der in Ihrer XML-Konfiguration angegebenen result_reporter ab.