在 Trade Federation 中编写主机驱动型测试

本页介绍如何编写由主机驱动的 JUnit4 型设备测试。由主机驱动意味着自动化测试框架的主机端将触发针对设备的操作。

请注意,我们认为“主机端”测试与“主机驱动型”测试略有不同:

  • 主机驱动型测试:是在与一个或多个设备进行交互的主机上运行的测试。被测系统 (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
  • @AfterClass
  • AssumeAssert

您可以通过扩展 BaseHostJunit4Test 以继承有用的测试实用程序 API,如:

  • installPackage:允许在目标设备上安装 APK。
  • installPackageAsUser:允许在目标设备上以用户身份安装 APK。
  • uninstallPackage:允许卸载 APK。
  • isPackageInstalled:检查是否安装了某个软件包。
  • hasDeviceFeature:检查设备是否支持某项功能。(pm list features)
  • runDeviceTests(DeviceTestRunOptions options):使用 DeviceTestRunOptions 对目标设备运行插桩测试,以处理所有可能的选项。

此外,还可以通过这种方法访问 Tradefed 设备对象:

  • getDevice():返回用于操控设备的 TF 设备对象。
  • getBuild():返回 build 信息 TF 对象以获取有关 build 的信息。
  • 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 支持通过 #getTestInformation() 获取非静态范围中的 TestInformation

如果您没有扩展 BaseHostJUnit4Test,可以实现 ITestInformationReceiver 以便接收 TestInformation 对象。

如何在 Tradefed 中配置主机驱动型测试?

在 Tradefed XML 配置文件中,主机驱动型测试通过 HostTest 运行程序运行。

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>