本頁面介紹了在 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”收集每個測試用例。
在設備端
在運行設備端測試(儀器、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>
通過指定這些模式和密鑰,收集器如果看到密鑰將嘗試提取並記錄關聯的文件。
為了生成這些密鑰,設備端測試(儀器)應指定應記錄的文件。它以與主機端類似的方式完成(如上所述)。
- 在 make 文件中將
collector-device-lib
添加到您的測試 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
。