使用投影测试规则自动执行虚拟设备管理

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
音频和
显示眼镜

当代码依赖于物理硬件时,很难实现测试自动化。例如,您可能需要手动连接和断开物理设备的连接,以验证连接状态。由于音频眼镜和显示眼镜有不同类型功能设备状态,因此这一挑战可能会变得更加复杂。为了测试这些不同的情况,请使用 Projected Test Rule API 来自动设置和管理投影测试环境。该库会处理投影设备的创建、连接状态和功能验证,因此您可以专注于测试应用的核心逻辑。使用这些 API 可以构建强大的测试套件,而无需编写样板代码。

添加库依赖项

如需使用测试规则,请将测试工件添加到应用的 build.gradle 文件中:

Groovy

dependencies {
// JXR Projected testing library
testImplementation "androidx.xr.projected:projected-testing:1.0.0-alpha07"
}

Kotlin

dependencies {
  // JXR Projected testing library
  testImplementation("androidx.xr.projected:projected-testing:1.0.0-alpha07")
}

设置测试规则

如需设置基本测试规则,请在测试类中对该规则进行注释。默认情况下,该规则会在每次测试运行之前连接投影设备并启用其视觉功能。

@get:Rule
val projectedTestRule = ProjectedTestRule()

private val context: Context
    get() = ApplicationProvider.getApplicationContext()

@Test
fun testWithConnectedDevice() {
    val projectedContext = ProjectedContext.createProjectedDeviceContext(context)

    assertThat(ProjectedContext.isProjectedDeviceContext(projectedContext)).isTrue()
}

测试其他常见场景

现在,您已使用基本测试规则设置了投影测试环境,接下来可以测试无屏眼镜和带屏眼镜的其他常见场景,以验证应用的功能。

测试设备断开连接

如需测试应用在与眼镜的连接断开时的反应,请使用 isDeviceConnected 属性:

@Test
fun testDeviceDisconnection() {
    // manually disconnect the device via the rule
    projectedTestRule.isDeviceConnected = false

    assertThrows(IllegalStateException::class.java) {
        ProjectedContext.createProjectedDeviceContext(context)
    }
}

代码要点

  • 该规则会在每次测试之前将 isDeviceConnected 等属性重置为默认值。您无需在 @After 方法中手动重置这些属性。

测试不同的设备功能

带屏眼镜可以显示使用 Jetpack Compose Glimmer 构建的界面。默认情况下,ProjectedTestRule 会启用 CAPABILITY_VISUAL_UI。如需确切定义投影设备支持的功能,请使用 capabilities 集。这有助于验证您的应用是否在尝试将内容投影到眼镜之前正确检查了硬件支持。

@Test
fun testAppBehaviorWithoutDisplayCapabilities() = projectedTestRule.launchTestProjectedDeviceActivity { activity ->
    // disable display capability
    projectedTestRule.capabilities = setOf()

    runBlocking {
        // create the controller
        val controller = ProjectedDeviceController.create(activity)

        // verify the app recognizes the lack of visual UI support
        assertThat(controller.capabilities).doesNotContain(ProjectedDeviceController.Capability.CAPABILITY_VISUAL_UI)
    }
}

代码要点

  • 该规则会在每次测试之前将 capabilities 等属性重置为默认值。您无需在 @After 方法中手动重置这些属性。
  • 当您需要专门针对预计会显示带屏眼镜的 activity 验证行为时,请使用 launchTestProjectedDeviceActivity