หน้านี้จะอธิบายวิธีเขียนการทดสอบอุปกรณ์สไตล์ JUnit4 ที่ขับเคลื่อนโดยโฮสต์ ซึ่งหมายความว่าฝั่งโฮสต์ของ Harness จะทริกเกอร์การดำเนินการกับอุปกรณ์
โปรดทราบว่าเราถือว่าการทดสอบ "ฝั่งโฮสต์" และการทดสอบ "ที่ขับเคลื่อนโดยโฮสต์" แตกต่างกันเล็กน้อย ดังนี้
- การทดสอบที่ขับเคลื่อนโดยโฮสต์: เป็นการทดสอบที่ทำงานบนโฮสต์ซึ่งโต้ตอบกับอุปกรณ์อย่างน้อย 1 เครื่อง ระบบที่อยู่ระหว่างการทดสอบ (SUT) ไม่ได้อยู่บนโฮสต์เอง แต่ได้รับการทดสอบจากโฮสต์
- การทดสอบฝั่งโฮสต์: เป็นการทดสอบที่ทำงานบนโฮสต์อย่างเดียวและทดสอบเฉพาะสิ่งที่อยู่บนโฮสต์ เช่น การทดสอบยูนิต
เหตุใดจึงควรสร้างการทดสอบที่ขับเคลื่อนโดยโฮสต์แทนการทดสอบการวัดคุม
การทดสอบบางอย่างอาจกำหนดให้คุณต้องส่งผลต่อสถานะโดยรวมของอุปกรณ์ เช่น การออกคำสั่งรีบูต ในกรณีการทดสอบการวัดคุม การรีบูตจะหยุดการวัดคุม การทดสอบจะดำเนินการต่อไม่ได้ และจะไม่มีผลลัพธ์
การทดสอบที่ขับเคลื่อนโดยโฮสต์ยังสามารถขับเคลื่อนขั้นตอนการตั้งค่าเพิ่มเติมที่ต้องมีการโต้ตอบกับอุปกรณ์ภายนอกที่การทดสอบขึ้นอยู่กับอุปกรณ์เหล่านั้น
การทดสอบที่ขับเคลื่อนโดยโฮสต์สามารถจัดการกรณีการใช้งานเหล่านี้และอนุญาตให้มีการทดสอบอุปกรณ์ขั้นสูงด้วยสถานการณ์ที่มากขึ้น หากคุณอยู่ในสถานการณ์ดังกล่าว การเขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์จะเป็นวิธีที่สมเหตุสมผลที่สุด
การทดสอบที่ขับเคลื่อนโดยโฮสต์เขียนขึ้นใน TF อย่างไร
ตัวอย่าง
@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
@Before
public void setUp() throws Exception {
// Some setup
}
@Test
public void testCheckWeHaveDevice() throws Exception {
Assert.assertNotNull(getDevice());
}
}
การทดสอบที่ขับเคลื่อนโดยโฮสต์ใน Trade Federation ขับเคลื่อนโดย DeviceJUnit4ClassRunner ซึ่งเป็นตัวเรียกใช้การทดสอบ JUnit4 โครงสร้างโดยรวมของคลาสการทดสอบจะเหมือนกับการทดสอบ JUnit4 ทั่วไป ดังนี้
@BeforeClass@Before@Test@After@AfterClassAssume,Assert
การขยาย BaseHostJunit4Test เป็นวิธีหนึ่งในการรับช่วงต่อ API ยูทิลิตีการทดสอบที่มีประโยชน์ เช่น
installPackage: อนุญาตให้ติดตั้ง APK ในอุปกรณ์เป้าหมายinstallPackageAsUser: อนุญาตให้ติดตั้ง APK เป็นผู้ใช้ในอุปกรณ์เป้าหมายuninstallPackage: อนุญาตให้ถอนการติดตั้ง APKisPackageInstalled: ตรวจสอบว่ามีการติดตั้งแพ็กเกจหรือไม่hasDeviceFeature: ตรวจสอบว่าอุปกรณ์รองรับฟีเจอร์หรือไม่ (pm list features)runDeviceTests(DeviceTestRunOptions options): เรียกใช้การทดสอบการใช้เครื่องมือ กับอุปกรณ์เป้าหมายโดยใช้ DeviceTestRunOptions เพื่อจัดการตัวเลือกที่เป็นไปได้ทั้งหมด
นอกจากนี้ยังให้สิทธิ์เข้าถึงออบเจ็กต์อุปกรณ์ Tradefed ด้วย
getDevice(): แสดงผลออบเจ็กต์อุปกรณ์ TF สำหรับการจัดการอุปกรณ์getBuild(): แสดงผลออบเจ็กต์ TF ข้อมูลบิลด์เพื่อรับข้อมูลเกี่ยวกับบิลด์getAbi(): แสดงผล ABI ที่การทดสอบกำลังทำงานอยู่
การสนับสนุน Tradefed: การเตรียมอุปกรณ์และการล้างข้อมูลต่อคลาส
@BeforeClass และ @AfterClass ของ JUnit4 ใช้ได้กับเมธอดแบบคงที่เท่านั้น ซึ่งทำให้ไม่สามารถใช้ตัวแฮนเดิล #getDevice() เพื่อทำการตั้งค่าหรือล้างข้อมูลเฉพาะอุปกรณ์แบบครั้งเดียวต่อคลาส หากต้องการแก้ปัญหานี้ ให้ใช้คำอธิบายประกอบ Tradefed
- @BeforeClassWithInfo: ทำงานก่อนคำอธิบายประกอบ @BeforeClass
- @AfterClassWithInfo: ทำงานหลังคำอธิบายประกอบ @AfterClass
@BeforeClassWithInfo
public static void beforeClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
@AfterClassWithInfo
public static void afterClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
TestInformation ช่วยให้คุณใช้อุปกรณ์และจัดเก็บพร็อพเพอร์ตี้ที่ใช้ได้ทั้งในขอบเขตแบบคงที่และไม่ใช่แบบคงที่ BaseHostJUnit4Test รองรับ
การรับ TestInformation ในขอบเขตที่ไม่ใช่แบบคงที่ผ่าน #getTestInformation()
หากคุณไม่ได้ขยาย BaseHostJUnit4Test คุณสามารถใช้
ITestInformationReceiver เพื่อรับออบเจ็กต์ TestInformation
วิธีกำหนดค่าการทดสอบที่ขับเคลื่อนโดยโฮสต์ใน Tradefed
ในไฟล์การกำหนดค่า XML ของ Tradefed การทดสอบที่ขับเคลื่อนโดยโฮสต์จะทำงานผ่านตัวเรียกใช้ HostTest
<test class="com.android.tradefed.testtype.HostTest" >
<option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>