UI 测试 (Testing)
Compose 测试使用 Semantics 树来查找元素并与其交互,这使得测试不依赖于具体的实现细节。
1. 依赖配置
kotlin
// UI 测试
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
// 调试工具 (Layout Inspector 需要)
debugImplementation("androidx.compose.ui:ui-test-manifest")2. 编写测试
Rule
使用 createComposeRule 启动测试环境。
kotlin
class MyComposeTest {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun myTest() {
// 1. 设置内容
composeTestRule.setContent {
MyAppTheme {
MainScreen()
}
}
// 2. 查找节点并断言
composeTestRule.onNodeWithText("欢迎")
.assertIsDisplayed()
// 3. 执行操作
composeTestRule.onNodeWithText("点击我")
.performClick()
// 4. 验证结果
composeTestRule.onNodeWithText("已点击")
.assertIsDisplayed()
}
}3. 常用查找器 (Finders)
| API | 描述 |
|---|---|
onNodeWithText("text") | 查找显示特定文本的节点 |
onNodeWithContentDescription("desc") | 查找具有特定无障碍描述的节点 |
onNodeWithTag("tag") | 查找带有 Modifier.testTag("tag") 的节点 |
onAllNodesWith... | 查找多个节点 |
4. 常用断言 (Assertions)
| API | 描述 |
|---|---|
assertIsDisplayed() | 验证可见 |
assertDoesNotExist() | 验证不存在 |
assertIsEnabled() | 验证已启用 |
assertTextEquals("text") | 验证文本内容 |
5. 独立于 Activity 测试
如果只想测试一个简单的 Composable 函数,不需要启动真正的 Activity,createComposeRule 足矣。如果需要访问 Activity 资源(如 getString),则使用 createAndroidComposeRule<MainActivity>()。