测试

测试无障碍功能的一种基本方法是手动测试:开启 TalkBack 或开关控制等无障碍服务,然后检查一切是否按预期运行。这样,您就可以直接了解具有无障碍功能需求的用户可能会如何体验您的应用。

除了手动验证之外,您还应使用自动化测试,在不断更改应用时标记任何可能影响用户体验的潜在问题。

借助现有的 Compose 测试 API,您可以编写与语义元素交互的自动化测试,并断言界面中定义的属性

无障碍检查

对于自动化无障碍功能测试,您还可以使用无障碍功能测试框架(即 Espresso 中的无障碍功能扫描器和无障碍功能检查所依赖的底层框架)自动执行一些与无障碍功能相关的检查,从 Compose 1.8.0 开始。

如需启用这些检查,请添加 ui-test-junit4-accessibility dependency,在 AndroidComposeTestRule 中调用 enableAccessibilityChecks(),然后触发操作或 tryPerformAccessibilityChecks

@Rule
@JvmField
val composeTestRule = createAndroidComposeRule<ComponentActivity>()

@Test
fun noAccessibilityLabel() {
    composeTestRule.setContent {
        Box(
            modifier = Modifier
                .size(50.dp, 50.dp)
                .background(color = Color.Gray)
                .clickable { }
                .semantics {
                    contentDescription = ""
                }
        )
    }

    composeTestRule.enableAccessibilityChecks()

    // Any action (such as performClick) will perform accessibility checks too:
    composeTestRule.onRoot().tryPerformAccessibilityChecks()
}

此特定测试会失败并显示异常,并显示一条消息,指出相应项可能没有可供无障碍服务读取的标签。

其他可用的检查会查找色彩对比度、触摸目标大小过小或元素的遍历顺序方面的无障碍功能问题。

如果您将 View 与 Compose 混合使用,并且已经在使用 AccessibilityValidator,或者需要配置 AccessibilityValidator,则可以在规则中进行设置:

@Test
fun lowContrastScreen() {
    composeTestRule.setContent {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .background(color = Color(0xFFFAFBFC)),
            contentAlignment = Alignment.Center
        ) {
            Text(text = "Hello", color = Color(0xFFB0B1B2))
        }
    }

    // Optionally, set AccessibilityValidator manually
    val accessibilityValidator = AccessibilityValidator()
        .setThrowExceptionFor(
            AccessibilityCheckResult.AccessibilityCheckResultType.WARNING
        )

    composeTestRule.enableAccessibilityChecks(accessibilityValidator)

    composeTestRule.onRoot().tryPerformAccessibilityChecks()
}

结合使用手动测试和同时使用 Compose API 和无障碍功能测试框架的自动化测试,有助于您在开发过程中尽早发现可能存在的问题。