客户端自动化测试在网易云音乐的实践与落地

本文作者:吕雨强

一、背景

时间线回到 2021 年

云音乐目前版本双周迭代,在集成测试阶段会花费两天时间,在这两天时间里面有相当部分时间是人工进行用例回归,而且目前 UI 自动化现有方案会存在较多问题,导致目前这块的效率和质量均不太理想,而对业务侧又希望能降低业务上线的周期。

目前云音乐每个新版本质量稳定性不是很理想,在前一个版本上崩溃率做到了质量基线,下个版本很可能就快速反弹。

同时伴随着的以下一些痛点:

  • 测试回归人工效率低,目前使用的 appium、smartAuto 等框架均有部分缺陷,主要集中在用例维护成本高、UI 检索稳定性保障难、新版本用例录入不及时、双端一致性难保障、问题回溯定位效率低下等;

  • 自动化测试对于用例和设备调度及管理基本靠人工进行;

  • 冒烟测试等工作没有对应的高效验收机制和服务能力,主要依赖线下沟通;

  • 自动化用例没有统一的调度管理平台,在 tc 用例平台执行用例时,无法精准筛选自动化用例执行,且每次执行结果保存也不直观。

二、Saturn 平台简介

基于上述背景,2021 年下半年云音乐大前端 QA 与公技团队共同搭建 Saturn 平台。Saturn 的核心功能主要包括:

  • 用例录制:手机端操作录制,录制过程记录控件信息、操作信息、埋点信息、截图等扩展信息;

  • 用例管理:录制的用例上传到 Saturn 后,进行维护、分类、放到各自模块以及执行集等;

  • 执行集:定义各自需要执行的用例的集合,方便用例快速执行与制定执行计划;

  • 设备调度:支持私有化部署、支持私有化调度、支持按测试类型调度、支持多 APP 之间调度、支持指定设备调度、支持随机分配设备等;

  • 用例执行:根据执行设置分配执行机,把用例分发到指定 provider 端,provider 根据下发消息调度 Athena/NETestWD 执行自动化;

  • 报告:报告汇总、执行步骤展示及执行截图、手动标记 check、失败原因归类、执行过程录屏与日志;

  • 设备管理:自有设备的上下线、自有设备的用途、自有设备的部署类别;

  • 各个专项,UI 自动化,RN 自动化,启动性能自动化,稳定性测试,覆盖安装等等

接下来,本文讲重点介绍 Saturn 平台设计思路、技术演进,专项,落地成果。

三、Saturn 平台架构

Saturn 平台主要分为

  1. 平台端:主要是用户交互、设备管理与调度;

  2. Android provider 端:部署在 mac 或者 pc 上用于 Android 手机的监控、与平台端交互、下发执行自动化任务;

  3. Athena APP:主要用于录制与回放自动化用例、上报用例、上报用例执行结果;

  4. Android 端内置 SDK:辅助 Athena 录制与回放自动化用例、准备用例执行环境(登录、mock、后台环境等);

  5. iOS provider 端:部署在 mac 上用于 iOS 设备监控、与平台端交互、下发执行自动化任务、维护 WDA、NETestWD 的稳定;

  6. NETestWD:用于启动被测应用、接收用例、上报自动化用例执行结果;

  7. WDA(WebDriverAgent):处理 iOS 端设备上的系统弹框;

  8. iOS 端内置 SDK:主要用于录制自动化用例、准备用例执行环境(登录、mock、后台环境等)、执行自动化用例;

如下面架构图所示:

四、Saturn 设计原理

4.1 Saturn 平台设备调度工作流程

设备调度工作流程用户执行用例,后台逻辑处理然后入库 history 表、发送 SystemHistory 消息入库 queue 表;SystemHistory 消息消费线程监听 queue 表中 SystemHistory 消息,获取消息后进行处理按照 Android/iOS 设备发送新的消息入库 queue 表;Android/iOS 消息消费线程监听 queue 表中 Android/iOS 消息,获取消息并锁定消息,之后检测可用设备,如果无空闲设备则释放消息,如果有空闲设备通过 websocket 下发消息并删除 queue 表中消息,provider 端接收到消息进行解析,执行自动化用例,执行完成后上报执行结果到平台,平台会更新用例执行结果并释放设备。

设备调度支持私有化部署、支持私有化调度、支持按测试类型调度、支持多 APP 之间调度、支持指定设备调度、支持随机分配设备等;

4.1.1 设备管理页面

4.2 Saturn 平台 Athena 工作流程

Athena 通过 adb 在录制时监听事件,回放时发送时间;通过 Accessibility 遍历节点、获取节点信息;

录制时

  • Athena 记录操作节点信息、操作信息、埋点信息;

回放时

  • Athena 通过内置 SDK 快速准备环境,免去大量前置步骤执行;

  • Athena 优先通过埋点信息确定目标节点,无埋点信息时通过使用多种查找方式遍历多次计算综合得分确定目标节点;

  • Athena 会自动处理系统弹框,防止弹框对自动化执行的影响。

4.3 Saturn 平台 iOS 内置 SDK 工作流程

录制时

  • 触摸、滚动事件的采集是通过 AOP 的方式进行采集信息,比如点击事件,通过拦截 UIControl 的 sendAction 方法和 UIView 的 addGestureRecognizer 方法,滚动时间通过 hook UISCrollViewDelegate 进行消息转发;

  • 键盘输入、断言事件的采集目前没有很自然的方式,所以都是通过一个交互工具来手动进行录制;

回放时

  • 回放的核心点是 UIAppliction 的 sendEvent 方法,sendEvent 方法是触摸事件分发的入口,回放时通过构造 UIEvent 再通过 sendEvent 方法进行事件分发;

  • 快速环境准备,免去大量前置步骤执行;

  • 执行时会优先使用埋点信息确定目标节点,无埋点信息时通过 xpath 定位的方式确定目标节点。

4.4 Saturn 自动化用例平台存储

用例以 json 表达式,保存自动化的执行环境,需要 mock 的接口, 账号密码, 自动化步骤等信息。

4.5 设备机房

五、在云音乐中的应用

UI 自动化测试

可定时触发,可以手动触发, 与能效平台打通能 CI 触发。

执行情况

算上失败重跑 2 次, 一小时单台设备平均是能执行 30 条以上自动化用例

对用例执行情况,可查看截图和视频

兼容性测试

对需要测试兼容性的用例,可选择兼容性测试,自动从每一个系统中选出设备进行测试

稳定性测试

双端都可定时触发,可以手动触发 ,底层采用开源项目 Fastbot

启动性能自动化

通过定时打包,定时启动自动化,获取平台埋点的启动数据,可视化展示启动数据。 跟踪启动数据,防止启动劣化。

RN 自动化

图像对比 RN 页面

六、云音乐客户端自动化效果

  • 有效降低学习成本:人人均可录制测试用例;

  • Android 端 P0 级用例覆盖率 72.95%,执行成功率 91.87%;

  • iOS 端 P0 级用例覆盖率 71.86%,执行成功率 91.33%;

  • 用例创建和维护效率,相比 Appium 和 Smartauto,分别提升了 9 倍和 3 倍;

  • 用例执行效率提升 1.5 倍以上;

  • 用例执行成功率提升 2 倍以上,稳定在 90%以上;

  • 问题定位效率从天级别缩短小时;

  • 迭代回归缩短 0.5 天;

  • 双端同一埋点自动化用例可以复用;

  • 用例易修改,位置变动可直接更新自动化用例的 json 数据;

  • 平台整体录制自动化用例两千条以上;

  • 执行自动化用例年均二十万次以上;

  • 发现功能问题和稳定性问题几十个;

七、参考资料

1\] [github.com/appium/WebD...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fappium%2FWebDriverAgent "https://github.com/appium/WebDriverAgent") \[2\] [github.com/alipay/Solo...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Falipay%2FSoloPi "https://github.com/alipay/SoloPi") \[3\] [github.com/openatx/atx...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fopenatx%2Fatxserver2 "https://github.com/openatx/atxserver2") \[4\] [github.com/bytedance/F...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fbytedance%2FFastbot_iOS "https://github.com/bytedance/Fastbot_iOS") \[5\] [github.com/bytedance/F...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fbytedance%2FFastbot_Android "https://github.com/bytedance/Fastbot_Android") \[6\] [github.com/alibaba/tid...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Falibaba%2Ftidevice "https://github.com/alibaba/tidevice") # 最后 ![](https://file.jishuzhan.net/article/1745674176603099138/1fcaa186dffbedc30eaf13743687a21d.webp) 更多岗位,可进入网易招聘官网查看 [hr.163.com/](https://link.juejin.cn?target=https%3A%2F%2Fhr.163.com%2F "https://hr.163.com/")

相关推荐
song_ly0018 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
试着4 天前
【AI面试准备】掌握常规的性能、自动化等测试技术,并在工作中熟练应用
面试·职场和发展·自动化·测试
waves浪游5 天前
论坛系统测试报告
测试工具·测试用例·bug·测试
灰色人生qwer6 天前
使用JMeter 编写的测试计划的多个线程组如何生成独立的线程组报告
jmeter·测试
.格子衫.6 天前
powershell批处理——io校验
测试·powershell
试着6 天前
【AI面试准备】TensorFlow与PyTorch构建缺陷预测模型
人工智能·pytorch·面试·tensorflow·测试
waves浪游7 天前
博客系统测试报告
测试工具·测试用例·bug·测试
智云软件测评服务9 天前
数字化时代下,软件测试中的渗透测试是如何保障安全的?
渗透·测试·漏洞
试着10 天前
【AI面试准备】XMind拆解业务场景识别AI赋能点
人工智能·面试·测试·xmind
waves浪游11 天前
性能测试工具篇
测试工具·测试用例·bug·测试