เขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์ใน Trade Federation

หน้านี้จะอธิบายวิธีเขียนการทดสอบอุปกรณ์สไตล์ JUnit4 ที่โฮสต์เป็นผู้ขับเคลื่อน ซึ่งหมายความว่าฝั่งโฮสต์ของสายจะทริกเกอร์การดำเนินการกับอุปกรณ์

โปรดทราบว่าเราถือว่าการทดสอบ "ฝั่งโฮสต์" และการทดสอบ "ที่ขับเคลื่อนโดยโฮสต์" มีความแตกต่างกันเล็กน้อย ดังนี้

  • การทดสอบที่ดำเนินการโดยโฮสต์: การทดสอบที่ทำงานบนโฮสต์ซึ่งโต้ตอบกับอุปกรณ์อย่างน้อย 1 เครื่อง ระบบที่ทดสอบ (SUT) ไม่ได้อยู่ในโฮสต์ แต่กำลังได้รับการทดสอบจากโฮสต์
  • การทดสอบฝั่งโฮสต์: เป็นการทดสอบที่ทำงานบนโฮสต์และทดสอบบางอย่างในโฮสต์เท่านั้น เช่น การทดสอบหน่วย

เหตุผลที่ควรสร้างการทดสอบที่ขับเคลื่อนโดยโฮสต์แทนการทดสอบการใช้เครื่องมือ

การทดสอบบางอย่างอาจกำหนดให้คุณส่งผลต่อสถานะโดยรวมของอุปกรณ์ เช่น ออกคำสั่งรีบูต ในเฟรมเวิร์กการทดสอบการวัดคุม การรีบูตจะปิดการวัดคุม การทดสอบจึงดำเนินการต่อไม่ได้และจะไม่มีผลลัพธ์

การทดสอบที่ขับเคลื่อนโดยโฮสต์ยังอาจทําให้ขั้นตอนการตั้งค่าเพิ่มเติมซึ่งต้องมีการโต้ตอบกับอุปกรณ์ภายนอกที่การทดสอบนั้นใช้อยู่

การทดสอบที่ขับเคลื่อนโดยโฮสต์สามารถจัดการ Use Case เหล่านี้และอนุญาตให้ทำการทดสอบขั้นสูงของอุปกรณ์ด้วยสถานการณ์เพิ่มเติม หากคุณอยู่ในสถานการณ์ดังกล่าว การเขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์จะเหมาะที่สุด

การทดสอบที่ขับเคลื่อนโดยโฮสต์เขียนเป็น 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
  • @AfterClass
  • Assume, Assert

การขยาย BaseHostJunit4Test เป็นวิธีรับค่า API ยูทิลิตีการทดสอบที่มีประโยชน์ เช่น

  • installPackage: อนุญาตให้ติดตั้ง APK ในอุปกรณ์เป้าหมาย
  • installPackageAsUser: อนุญาตให้ติดตั้ง APK ในฐานะผู้ใช้ในอุปกรณ์เป้าหมาย
  • uninstallPackage: อนุญาตให้ถอนการติดตั้ง APK
  • isPackageInstalled: ตรวจสอบว่ามีการติดตั้งแพ็กเกจหรือไม่
  • hasDeviceFeature: ตรวจสอบว่าอุปกรณ์รองรับฟีเจอร์หรือไม่ (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): เรียกใช้การทดสอบเครื่องมือวัดค่ากับอุปกรณ์เป้าหมายโดยใช้ DeviceTestRunOptions เพื่อจัดการตัวเลือกที่เป็นไปได้ทั้งหมด

และให้สิทธิ์เข้าถึงออบเจ็กต์อุปกรณ์ Tradefed ด้วย

  • getDevice(): แสดงผลออบเจ็กต์อุปกรณ์ TF สําหรับการจัดการอุปกรณ์
  • getBuild(): แสดงผลออบเจ็กต์ TF ข้อมูลบิลด์เพื่อรับข้อมูลเกี่ยวกับบิลด์
  • getAbi(): แสดง ABI ที่การทดสอบทํางานอยู่

การสนับสนุน Tradefed: การเตรียมและล้างข้อมูลอุปกรณ์ตามคลาส

JUnit4 @BeforeClass และ @AfterClass ใช้ได้กับเมธอดแบบคงที่เท่านั้น ซึ่งทำให้ใช้ตัวแฮนเดิล #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>