本頁面介紹了在 Tradefed 中編寫測試時如何報告指標以及測試結果。
透過 Tradefed 管道進行日誌記錄的好處是可以在功能結果旁邊找到您的指標。指標的記錄可以在測試中非常自然地完成,這使得測試編寫者可以輕鬆添加更多工具。
DeviceTestCase - JUnit3 風格
如果您的測試在 JUnit3 風格的測試中擴充了DeviceTestCase ,則可以從任何測試案例內部呼叫方法addTestMetric(String key, String value)
來報告指標。只要密鑰是唯一的,就可以多次呼叫它。
例子:
public static class TestMetricTestCase extends DeviceTestCase {
public void testPass() {
addTestMetric("key1", "metric1");
}
public void testPass2() {
addTestMetric("key2", "metric2");
}
}
如果您想要記錄result_reporters
中可用的文件,您可以從任何測試案例內部呼叫方法addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
報告要記錄的文件。
例子:
public static class TestLogTestCase extends DeviceTestCase {
public void testPass() {
try (InputStreamSource source = getDevice().getScreenshot()) {
addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
TestCase - 常規 JUnit3 測試
如果您想從常規 JUnit3 TestCase 類別報告 Tradefed 內的指標,則需要將其轉換為MetricTestCase
,而該類別與具有額外方法的完全相同的類別: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner - JUnit4 風格
如果您的 JUnit4 風格測試使用DeviceJUnit4ClassRunner運行,那麼您也可以記錄測試案例中的指標(在 @Test 內)以由 Tradefed 報告。您將需要使用TestMetrics
規則來報告您的指標。
例子:
@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");
}
}
為了報告文件,您將使用TestLogData
規則來報告它。
例子:
@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 - 純 Tradefed 測試
如果您正在編寫自己的 Tradefed 測試類別或運行程序,您將實作IRemoteTest並透過run()
方法取得ITestInvocationListener
。此偵聽器可用於記錄指標,如下所示:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Tradefed 指標收集器
Tradefed 提供了專用的metrics_collector
物件來在測試的同時收集指標。
在主機端
可實作BaseDeviceMetricCollector以從主機端收集任何指標並將其報告為測試呼叫的一部分。許多通用收集器已經可用於不同的用例,但我們始終歡迎新的貢獻。
為了指定 Tradefed 呼叫中使用的收集器,您只需將該物件新增至 Tradefed XML 配置中:
例子:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
目前存在的一些收集器: * TemperatureCollector ,在測試運行期間定期收集溫度。 * AtraceCollector使用「atrace」收集每個測試案例。
在裝置端
在執行設備端測試(Instrumentations、UIAutomator 測試等)時,在主機端使用收集器非同步收集可能並不理想。例如,非同步截取的螢幕截圖很可能會錯過想要的螢幕並且毫無用處。
為了滿足這些用例,我們存在收集器的裝置端版本,並且可以在任何「AndroidJUnitRunner」工具中使用。可以實施BaseMetricListener ,以便自動報告以與 Tradefed 報告管道完全相容的方式收集的指標。
如果您使用 Tradefed 的「 AndroidJUnitTest 」運行程序,您只需指定以下命令列選項即可讓收集器與測試一起執行:
--device-listeners android.device.collectors.ScreenshotListener
注意:為了在執行時間解析收集器類,您的偵測 APK 很可能需要透過將以下內容新增至 makefile 來靜態包含它們:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
也歡迎設備端收集者做出貢獻。
套房的特別考慮
對於像 CTS 這樣具有運行某些模組配置的頂級配置的套件,無需在每個模組配置 ( AndroidTest.xml
) 中指定metrics_collector
。這實際上是被禁止的。
為了確保指標收集同等地應用於每個模組,只有頂層配置(例如cts.xml
)可以指定metrics_collector
,如上所述。這些收集器將針對套件的每個模組應用和運行。
從模組收集設備日誌文件
可以進行設置,以便設備端測試通知應收集某些文件。
AndroidTest.xml
可以指定一個收集器,它將在裝置上尋找檔案並提取它們。
<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>
透過指定這些模式和金鑰,收集器如果看到該金鑰將嘗試拉取並記錄關聯的檔案。
為了產生這些密鑰,設備端測試(檢測)應指定應記錄的檔案。它的完成方式與主機端類似(如上所述)。
- 將
collector-device-lib
加入 make 檔案中的測試 APK 中:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- 使用我們提供的@rule來記錄文件:
@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);
}
}
上例中的KEY
名稱是報告文件的名稱。這是您應該在FilePullerDeviceMetricCollector
中匹配的名稱,以使其自動拉取。它應該是一個獨特的名稱。
注意:拉取檔案後, FilePullerDeviceMetricCollector
會自動將其從裝置中清除。
我可以在哪裡找到指標?
它取決於 XML 配置中指定的result_reporter
。