如何報告 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