หน้านี้อธิบายวิธีการรายงานตัววัดพร้อมกับผลการทดสอบเมื่อเขียนการทดสอบใน Tradefed
ประโยชน์ของการบันทึกผ่านไปป์ไลน์ Tradefed คือการค้นหาตัวชี้วัดของคุณควบคู่ไปกับผลลัพธ์การทำงานของคุณ การบันทึกเมตริกสามารถทำได้อย่างเป็นธรรมชาติในการทดสอบ ซึ่งทำให้ผู้เขียนทดสอบสะดวกที่จะเพิ่มเครื่องมือวัดมากขึ้น
DeviceTestCase - สไตล์ JUnit3
หากการทดสอบของคุณขยาย DeviceTestCase ในประเภทการทดสอบแบบ JUnit3 คุณสามารถเรียกเมธอด 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 ปกติ
หากคุณต้องการรายงานตัววัดภายใน Tradefed จากคลาส JUnit3 TestCase ปกติ จะต้องแปลงเป็น 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 Test หรือ runner ของคุณเอง คุณจะใช้งาน IRemoteTest และรับ ITestInvocationListener
ผ่านเมธอด run()
Listener นี้สามารถใช้เพื่อบันทึกเมตริกได้ดังนี้:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
ตัวสะสมเมทริกที่ซื้อขายกัน
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 โดยอัตโนมัติ
หากคุณกำลังใช้รันเนอร์ ' AndroidJUnitTest ' จาก Tradefed คุณสามารถระบุตัวเลือกบรรทัดคำสั่งต่อไปนี้เพื่อให้ตัวสะสมของคุณทำงานกับการทดสอบของคุณ:
--device-listeners android.device.collectors.ScreenshotListener
ข้อควรระวัง: เพื่อให้คลาสตัวรวบรวมได้รับการแก้ไขขณะรันไทม์ APK เครื่องมือของคุณมักจะต้องรวมคลาสเหล่านี้โดยเพิ่มไปยัง makefile ของคุณดังต่อไปนี้:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
การมีส่วนร่วมกับนักสะสมด้านอุปกรณ์ก็ยินดีต้อนรับ
พิจารณาเป็นพิเศษสำหรับห้องชุด
สำหรับห้องชุด เช่น CTS ที่มีการกำหนดค่าระดับบนสุดที่เรียกใช้การกำหนดค่าโมดูลบางอย่าง ไม่จำเป็นต้องระบุ metrics_collector
ในแต่ละการกำหนดค่าโมดูล ( AndroidTest.xml
) อันที่จริงเป็นสิ่งต้องห้าม
เพื่อให้แน่ใจว่าคอลเล็กชันเมทริกซ์ถูกนำไปใช้กับแต่ละโมดูลอย่างเท่าเทียมกัน เฉพาะคอนฟิกูเรชันระดับบนสุด (เช่น 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>
โดยการระบุรูปแบบและคีย์เหล่านี้ ตัวรวบรวมหากเห็นคีย์จะพยายามดึงและบันทึกไฟล์ที่เกี่ยวข้อง
เพื่อให้คีย์เหล่านี้ถูกสร้างขึ้น การทดสอบฝั่งอุปกรณ์ (เครื่องมือ) ควรระบุไฟล์ที่ควรได้รับการบันทึก มันทำในลักษณะเดียวกับฝั่งโฮสต์ (อธิบายไว้ด้านบน)
- เพิ่ม
collector-device-lib
ไปยัง APK ทดสอบของคุณในไฟล์ make:
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
จะล้างไฟล์ออกจากอุปกรณ์โดยอัตโนมัติ
จะหาเมตริกได้ที่ไหน
ขึ้นอยู่กับ result_reporter
ที่ระบุในการกำหนดค่า XML ของคุณ