本页介绍了如何在 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”进行收集。
在设备端
当运行设备端测试(Instrumentation、UIAutomator 测试等)时,在主机端异步收集的收集器可能并不理想。例如,异步拍摄的屏幕截图很可能会错过想要的屏幕并且毫无用处。
为了满足这些用例,存在设备端版本的收集器,并且可以在任何“AndroidJUnitRunner”Instrumentation 中使用。BaseMetricListener 可以实现,以便自动报告以与 Tradefed 报告管道完全兼容的方式收集的指标。
如果您使用的是 Tradefed 中的“AndroidJUnitTest”运行程序,您可以简单地指定以下命令行选项,以便让您的收集器与您的测试一起运行
--device-listeners android.device.collectors.ScreenshotListener
注意:为了使收集器类在运行时得到解析,您的 Instrumentation 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>
通过指定这些模式和键,收集器如果看到键,将尝试拉取并记录关联的文件。
为了生成这些键,设备端测试 (Instrumentation) 应指定应记录的文件。其完成方式与主机端类似(如上所述)。
- 将
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
。