从 Tradefed 测试中报告指标或数据

本页介绍了如何在 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) 应指定应记录的文件。其完成方式与主机端类似(如上所述)。

  1. collector-device-lib 添加到 make 文件中的测试 APK
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. 使用我们提供的 @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