回報 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