如何报告 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”收集每个测试用例。

在设备端

在运行设备端测试(仪器、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>

通过指定这些模式和密钥,收集器如果看到密钥将尝试提取并记录关联的文件。

为了生成这些密钥,设备端测试(仪器)应指定应记录的文件。它以与主机端类似的方式完成(如上所述)。

  1. 在 make 文件中将collector-device-lib添加到您的测试 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