回報交易測試中的指標或資料

本頁面說明如何在 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 測試

如要自行撰寫交易測試類別或執行器,則需導入 IRemoteTest,並透過 run() 方法取得 ITestInvocationListener。這個事件監聽器可用於記錄指標,如下所示:

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

交易指標收集器

交易提供專屬的 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