测试

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

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

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

无障碍检查

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

如需启用检查,请添加 ui-test-junit4-accessibility 依赖项,在 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,或者需要配置一个,则可以在规则中进行设置:

@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 以及无障碍功能测试框架的自动化测试,可以帮助您在开发过程的早期阶段检测可能存在的问题。