本页面介绍了在 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
。