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. Die Protokollierung von Messwerten kann sehr einfach innerhalb von Tests erfolgen, was es für Testautoren bequem macht, weitere Instrumentierung hinzuzufügen.
DeviceTestCase – JUnit3-Stil
Wenn Sie DeviceTestCase in einem JUnit3-Test erweitern, können Sie die Methode addTestMetric(String key, String value)
innerhalb von Testfällen aufrufen, um einen Messwert zu erfassen. Dieser 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 so erfassen:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Tradefed-Messwert-Collectors
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 beliebige 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.
Wenn Sie den in Ihrer Tradefed-Aufrufanfrage zu verwendenden Collector angeben möchten, fügen Sie das Objekt einfach Ihrer Tradefed-XML-Konfiguration hinzu:
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 für jeden Testfall mit „atrace“ erfasst.
Auf Geräteseite
Wenn Sie geräteseitige Tests (Instrumentierungen, UIAutomator-Tests usw.) ausführen, ist es möglicherweise nicht ideal, einen geräteseitigen Listener zu verwenden, der asynchron Daten erhebt. Ein asynchron aufgenommener Screenshot enthält beispielsweise höchstwahrscheinlich nicht den gewünschten Bildschirm und ist daher nutzlos.
Für diese Anwendungsfälle gibt es eine geräteseitige Version unserer Collectors, 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 können, müssen sie in Ihrem Instrumentation-APK höchstwahrscheinlich statisch eingebunden werden. Fügen Sie dazu Ihrem Makefile Folgendes hinzu:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Beiträge zu geräteseitigen Collectors sind ebenfalls willkommen.
Besondere Hinweise für 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 gibt eine Einrichtung, mit der bei einem geräteseitigen Test angegeben werden kann, dass einige Dateien erfasst werden sollen.
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, wenn er den Schlüssel erkennt.
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).
- Fügen Sie in den Make-Dateien die
collector-device-lib
zu Ihrem Test-APK hinzu:
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. 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.