SuperAPI AI 工具集

asserting-node-state-and-text

测试与质量

查看项目

更新于 10-16 01:57

技能介绍

用途

在 Compose UI 测试中,当查找器(finder)已经将目标解析为 SemanticsNodeInteraction 之后,下一步就是对其进行断言。本技能指导如何为语义属性选择正确的断言方式:Compose 为几乎每种语义属性都提供了类型化断言,其余情况可用通用的 assert(matcher) 覆盖。技能帮助挑选合适的断言、区分“存在”与“显示”,并说明布尔谓词何时应放入 waitUntil。

适用情形包括:验证 Switch 是否打开、Checkbox 是否未选中、Button 是否启用、Text 是否等于预期字符串;询问 assertIsDisplayed 与 assertExists 的区别(前者验证在屏幕上,后者验证在树中存在);对没有类型化扩展的属性需要通过 assert(matcher) 自定义断言;验证集合条件(“恰好 3 项”“至少一个被选中”“全部启用”);以及当测试直接比较 node.config[...] 而非使用类型化断言时。

不适用情形:无法定位正确的节点(应参见按 tag/文本/内容查找节点的技能);断言是几何性的(宽、高、位置);检查需要自定义 SemanticsMatcher;状态异步变化、断言对时序敏感(应参见与 idle 同步的技能)。

前置条件

可用的 ComposeTestRule / ComposeUiTest;节点已通过 onNode* / onAllNodes* / navigator 定位;对于 assertIsDisplayed 语义,节点必须已组合(composed)且已放置(placed)且在裁剪后至少部分位于屏幕上。

主要能力

技能提供一张“问题 → API”映射表,覆盖:是否在树中(assertExists)、是否已消失(assertDoesNotExist)、是否为 SubcomposeLayout 保留的子项(assertIsDeactivated)、是否对用户可见(assertIsDisplayed / assertIsNotDisplayed)、是否可交互(assertIsEnabled / assertIsNotEnabled)、开关是否打开(assertIsOn / assertIsOff / assertIsToggleable)、单选/标签是否被选中(assertIsSelected / assertIsNotSelected / assertIsSelectable)、是否有焦点(assertIsFocused / assertIsNotFocused)、文本是否相等(assertTextEquals)、是否包含某字符串(assertTextContains)、内容描述是否相等/包含(assertContentDescriptionEquals / assertContentDescriptionContains)、Value 是否等于 X(assertValueEquals)、ProgressBar 位置(assertRangeInfoEquals)、是否有点击动作(assertHasClickAction / assertHasNoClickAction),以及其它情况使用 assert(matcher)。

技能强调 assertExists 与 assertIsDisplayed 的刻意区分:节点在语义树中即 assertExists;节点已组合、已放置且裁剪后至少部分可见才 assertIsDisplayed。对未滚动进视图的 LazyColumn 项,assertExists 可能失败(未组合)也可能成功(已组合但在屏幕外),而“用户能看到”应使用 assertIsDisplayed。

技能要求使用类型化断言而非直接读取 fetchSemanticsNode().config[...],因为类型化断言委托给 matcher 库并产生框架格式化错误,会指出失败的属性并转储节点。

对集合,技能说明 assertCountEquals 用于数量、assertAny 用于“至少一个匹配”(空集合会失败)、assertAll 用于“每个节点都匹配”(空集合会通过)。

对 waitUntil 谓词,应使用返回布尔值的 isDisplayed()(适合 rule.waitUntil { node.isDisplayed() })与 isNotDisplayed();二者在多个节点匹配时抛异常,但零节点时不抛。对没有类型化断言的一次性属性,使用 assert(matcher),可结合预置或组合的 matcher,messagePrefixOnError 用于为更大操作的前置条件添加上下文。

使用方式

按问题类型挑选单一断言调用;优先使用类型化断言;集合操作使用集合类型化断言;waitUntil 内使用布尔 API;对无类型化断言的属性使用 assert(matcher)。可选:优先使用基于 tag 的查找再断言。

验证方式

确保没有断言直接读取 node.config[...],所有属性检查都通过 assertIs* / assertTextEquals / assert(matcher);用户可见检查使用 assertIsDisplayed,仅在屏幕可见性无关时使用 assertExists;waitUntil 块内使用布尔 API;assertAny / assertAll 的选择与期望的空集合语义一致;运行 ./gradlew :app:connectedDebugAndroidTest(设备)或 :app:testDebugUnitTest(主机)通过;失败信息按名称提及违规的语义属性。

限制

以上为基于所提供资料整理的内容;关于具体收费、价格、平台支持范围等其它信息,资料暂未提供。