Android Instrumentation测试无法识别嵌套Composable的testTag节点
解决嵌套Composable中.testTag无法被AndroidTest识别的问题
问题背景
在测试嵌套层级的Composable组件时,叶子节点的testTag无法被测试框架找到,报错提示:
java.lang.AssertionError: Failed: assertExists. Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'Text of AComposable') However, the unmerged tree contains '1' node that matches. Are you missing `useUnmergedNode = true` in your finder?
解决方案
方案1:在单个查找方法中指定useUnmergedTree = true
在测试代码里,调用节点查找方法时添加useUnmergedTree参数并设为true,让测试框架遍历未合并的Composable节点树:
// 使用onNodeWithTag的写法 onNodeWithTag("Text of AComposable", useUnmergedTree = true) .assertExists() .assertTextEquals("stringOfText") // 或者用findByTestTag的写法 val textNode = findByTestTag("Text of AComposable", useUnmergedTree = true) textNode.assertExists()
方案2:全局设置默认使用未合并树
如果测试中大部分节点都需要遍历未合并树,可以在Compose测试规则里全局开启useUnmergedTree,避免每个查找都重复加参数:
@get:Rule val composeTestRule = createAndroidComposeRule<MainActivity>().apply { // 全局启用未合并树查找 useUnmergedTree = true } // 后续查找无需再指定参数 @Test fun testLeafComposableText() { onNodeWithTag("Text of AComposable") .assertExists() .assertTextEquals("stringOfText") }
原因说明
Compose为优化渲染性能,会把多个相邻的Composable节点合并成单个渲染节点,这个过程会让叶子节点的testTag被包裹在合并后的节点中。默认的测试查找只会遍历合并后的渲染节点,因此找不到标记;而useUnmergedTree = true会让测试框架遍历原始的、未合并的Composable调用树,从而定位到嵌套层级里的testTag。
内容的提问来源于stack exchange,提问作者Alexandru Gheorghe
相关产品推荐
相关产品推荐

