测试是开发过程的重要组成部分,Android测试自动化多年来一直在发展。为了跟上最新趋势,Mercari(日本最大的网购平台之一)工程部门始终寻找改进的机会。在本文中,我将讨论用于自动化UI测试的Compose框架及其优点以及我们如何在Mercari使用它的一些示例。(https://developer.android.com/jetpack/compose)
之前,我们的UI测试是使用 Espresso 框架编写的。虽然 Espresso 是测试 Android UI 的强大工具,但它可能非常冗长且难以阅读。另一方面,Compose 使用更直观、更易于阅读的声明性语法。这意味着你可以使用更少的代码更快地编写测试。
-
Compose 提供了一种更直观的 UI 测试编写方式
Compose 的声明式语法比 Espresso 的命令式语法更直观、更容易阅读。Compose 允许将 UI 组件创建为接受输入参数并返回 UI 树的函数。这样可以轻松地单独测试各个 UI 组件,而无需浏览整个应用程序。使用 Compose,可以使用更少的代码更快地编写测试,从而加快开发速度并提高测试效率。
-
Compose 允许单独测试 UI 组件
测试 Android UI 的挑战之一是很难隔离各个 UI 组件进行测试。使用 Compose,可以将 UI 组件创建为接受输入参数并返回 UI 树的函数。这样可以轻松地单独测试各个 UI 组件,而无需浏览整个应用程序。通过单独测试 UI 组件,可以在开发过程的早期发现问题,并节省调试时间和精力。
-
Compose 提供了一种更可靠的方法来测试 UI 更改
UI 测试的常见问题之一是很难可靠地测试 UI 更改。通过 Compose,可以使用assert() 函数来检查UI 组件是否按预期呈现。能够更可靠地测试 UI 更改并在开发过程的早期发现问题。通过尽早发现 UI 问题,可以降低引入错误的风险并提高应用的整体质量。
-
Compose 的执行速度比传统 UI 测试更快
使用 Compose 进行 Android 测试自动化的另一个优点是它比传统的 UI 测试执行速度更快。这是因为 Compose UI 组件被编译成树结构,可以在多个测试中缓存和重用。这意味着测试将运行得更快并且开销更少。通过使用 Compose,可以节省测试时间和精力,并提高开发过程的整体效率。
-
Compose 为可测试性提供更好的支持
最后,Compose 比传统 Android UI 框架提供了更好的可测试性支持。这是因为 Compose 组件被设计得更加模块化和可测试。可以使用 MockK 等工具为 Compose 组件创建模拟对象,这使得单独测试它们变得更加容易。UI 组件更加模块化和可测试,可以提高应用的整体质量并降低引入错误的风险。
在本文中,我将展示我们在 Mercari 使用的一些最佳实践,以展示易用性和简单性。
实施例1
fun goToMyPage() = MyPage.apply {
composeTestRule.onNodeWithText(R.string.bottom_nav_title_my_page)
.performClick()
}
R.string.bottom_nav_title_my_page 是 strings.xml 中定义的用于本地化的字符串资源
<string name="bottom_nav_title_my_page">My Page</string>
此操作点击底部菜单选项卡上的“我的页面”并返回 MyPage 对象。
如果屏幕上有可用文本,我们可以使用该文本来点击或断言字符串。
大多数时候你可以这样写:
实施例2
fun tapBack() = TopPage.apply{
composeTestRule.onAllNodersWithTag("go back")[0]
.onChildren()[0]
.onChildAt(0)
.performClick()
}
这是点击左侧的箭头从项目详细信息页面返回。
由于没有文字,我必须以其他方式按下箭头按钮。
在 Compose 中,我们可以使用语义来标记用于测试的值。
语义=“的含义”;在本例中,它为一段 UI 赋予了意义。
我已将箭头标记如下:
项目详细信息屏幕.kt
topBar = {
TopNavigation(
title = stringResource(id = R.string.title_itemDetailFragment),
navigationIcon = DsIcons.arrowback,
onNavigationClick = onUpPress,
modifier = Modifier.testTag("go back")
)
},
到目前为止,我使用两种方法来标记值。
-
Use Modifier
modifier = Modifier.testTag("go back") 是我添加的内容,这样我就可以点击箭头了。
-
使用内容描述
Thumbnail(
data = item.thumbnails.firstOrNull(),
contentDescription = THUBNAIL_CONTENT_DESCRIPTION,
fadeIn = fadeIn,
)
SearchResultScreen.kt
如果填写了 contentDescription,也可以使用它。
要在所有节点中指定目标节点,请定义一个条件来过滤并查找树中的特定节点。
此外,我们可以使用onChildren().onFirst,它也可以获取第一个节点。
要查看树节点,请使用 composeTestRule.onRoot().printToLog("TAG") 打印节点结构。
在这里可以看到返回标签和结构,它显示如下:
这非常易读,允许我们查看树中的元素。
我们可以知道具有 Button 和 OnClick Action 的节点是后退箭头。
只需找到如何定位相对于其他节点的位置即可。
还可以通过设置断点并在评估窗口中键入 printLog 语句来查看测试执行期间的层次结构。
实施例3
composeTestRule.onNode(
hasText(R.string.email_login_button) and
hasClickAction(),
).performClick()
你还可以使用此样式来查找特定节点。上面的代码告诉我们单击一个节点,该节点具有由 email_login_button 标识的字符串,并且它还具有 ClickAction。
结论
在我们团队(Mercari QA)中,我们发现这个框架很流畅,因为它是 Android 开发的原生框架。正如你从上面的示例中看到的,我们的代码非常可读且易于维护。我们的开发人员可以阅读我们的测试代码,因为它采用与他们使用的相同语言和技术堆栈。目前,我们在发布健全性检查中使用 Compose,并每周运行一次以查找应用程序中的任何回归,希望这篇文章对你有有用!
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,
请及时加入群: 786229024
,里面有各种测试开发资料和技术可以一起交流哦。
最后:
下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取
【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。