本頁說明在 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>
指定這些模式和金鑰後,收集器如果看到金鑰,就會嘗試提取並記錄相關聯的檔案。
如要產生這些金鑰,裝置端測試 (插樁) 應指定要記錄的檔案。做法與主機端類似 (如上所述)。
- 在 make 檔案中,將
collector-device-lib
新增至測試 APK:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- 使用我們提供的 @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
。