测试

测试无障碍功能的一种基本方法是手动测试:开启 TalkBack 或 Switch Access 等无障碍服务,并检查一切是否按预期工作。这可直接了解有无障碍需求的用户可能会如何体验您的应用。

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

现有的 Compose 测试 API 允许您编写与语义元素交互的自动化测试,并断言您 UI 中定义的属性

无障碍性检查

对于自动化无障碍测试,您还可以使用 无障碍测试框架(为 Accessibility Scanner 和 Espresso 中的无障碍检查提供支持的同一底层框架),从 Compose 1.8.0 开始自动执行一些与无障碍相关的检查。

要启用检查,请添加 ui-test-junit4-accessibility dependency 依赖项,在 enableAccessibilityChecks() 中调用 AndroidComposeTestRule,然后触发操作或 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()
}

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

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

如果您在 Compose 中混合使用视图,并且已经在使用 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 和无障碍测试框架的自动化测试可以帮助您在开发过程的早期发现可能的问题。