報告來自 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」收集每個測試案例。

在裝置端

在執行設備端測試(Instrumentations、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. 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