客户端健壮性测试实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 客户端健壮性测试实践
美团平台技术部
2023年06月
2. 分享要点
• 1、为什么关注客户端健壮性
• 2、App健壮性保障的思路
• 3、App健壮性检测方案设计
• 4、如何解决健壮性测试覆盖不足和测试耗时长问题
2
3. 01 | 什么是客户端健壮性
4. 定义
健壮性: 系统或组件在存在无效输入或压力环境条件下可以正常运行的程度。
移动端App健壮性: App运行时遭遇环境异常或者输入异常时客户端能够继续正常运行的能力。
4
5. 什么是客户端健壮性?
举个例子: 某服务触发限流向客户端返回状态码403,客户端未获取到预期的接口响应数据时发生了崩溃。
请求
响应
5
6. 移动端有哪些环境异常和输入?
内存
应用间
CPU
操作系统
交互
内容
系统输入
交互
硬件环境
网络
外部
环境
运行环境
事件
应用内
用户输入
数据
输入
6
7. 遭遇异常后产生的健壮性问题表现
异常类型
表现
加载过程中出现Crash/ANR/JS Error
展示异常
功能/模块缺失
界面错位
字体/颜色/文本内容异常
交互异常
性能问题
安全问题
交互过程中出现Crash/ANR/JS Error
交互无响应
CPU、内存、线程池等资源消耗异常
加载时间等时间维度性能指标劣化
出现安全漏洞产生被攻击或信息泄露等风险
7
8. 02 | 为什么关注客户端健壮性
9. 业务简介
业务特点:
· 用户规模持续增长,流量大、高频业务占比高
· 以基础功能和核心入口为主,影响范围广
外
卖
美
食
酒
店
旅
游
机
票
门
票
打
车
…
平台业务
基础组件
9
10. 业务简介
页面流量分布
页面数量分布
Native页面
动态化页面
H5页面
技术形态:
· 不同技术形态页面数量分布均衡
· 以页面流量占比看,
· Native原生页面占据大部分的曝光(重点关注)
· 动态化容器页面与H5页面相对曝光量极小
· Native问题修复周期长,故障恢复时间长
外
卖
美
食
酒
店
旅
游
机
票
门
票
打
车
…
平台业务
基础组件
10
11. 故障风险
客户端健壮性问题引发故障占比高
典型故障:
e.g. 核心模块入口丢失,影响十万级用户
e.g. 类型转换异常,用户使用App闪退,5分钟内降级仍累计影响百万级用户
// java.lang.NumberFormatException: For input string
int count = Interger.parseInt(key);
影响范围广
恢复周期⻓
故障⻛险高
=
急需改善
11
12. 03 | 如何开展客户端健壮性问题治理
• 基本思路
• 保障方案设计
13. 基本思路
制定治理
目标
建设度量
方案
辅助问题
分析
驱动问题
治理
持续控制
13
14. 制定治理目标
降低由于网络接口返回数据与预期不符导致的Crash或核心功能/模块缺失的线上问题数量
问题诱因分析:
运行环境
输入
- 网络接口返回数据占比100%
异常表现:
① 加载过程中出现Crash,占比Top 1
② 核心功能/模块缺失,占比Top 2
影响时长:
① 出现在Native页面/模块的问题占比100%,需要通过发版才能彻底修复问题,修复成本高、周期长
② 非Crash/ANR/JS Error类异常发现100%依赖于客诉反馈,发现问题时长不可控
14
15. 分析关键举措
根因分析:
关键举措:
① 健壮性检测工具优化建设
② 业务异常监控完善
③ 流程规范完善及管控手段建设,含技术设计、技术方案评审、测试用例设计、配置变更等
15
16. 客户端健壮性保障方案
整体保障方案
质量特性
健壮性
流程管控
实施策略: 聚焦通
制
定
流
程
规
范
用发现能力建设,重
点建设事前检测能力
手段
需求规范 研发规范
测试规范 发布规范
监
督
流
程
提测流水线
PR流水线
测试流水线
回归测试流水线
发布流水线
监控运营
静态代码扫描 监控告警建设
异常 稳定性
检测 异常
线上运维规范
Push流水线
测试
健
壮
性
测
试
功能异常
展示
运行
环境
异常
构造
异常
输入
构造
工具/平台
支撑
复盘
持续集成/交付平台
交互
业务层健壮性测试
组件/API健壮性测试
单元测试
线上巡检
对标
事件管理中心
…
运营机制建设
配置变更流水线
迭代
标准
性能异常
问题治理
云真机平台
可测性改造SDK
自动化测试管理工具
问题运营工具
…
16
17. 静态检测
工具类使用治理: 开发自定义静态代码扫描规则,增量管控新增代码,长期治理存量风险
如:PrimitiveParseDetector、ColorParseDetector
以此为契机初步完善了Android和iOS端共200+扫描规则和组件仓库的接入
17
18. 动态检测
新需求测试
人工配置触发健壮性测试
是否Crash
版本回归测试
进入Crash运营流程
是
监听事件中心触发健壮性测试
否
通知负责人确认
是否误报
自动录制数据
异常检测
是
标记误报
否
创建工单
自动生成用例
提交测试运行
结果记录
是否修复
是
修复验证测试
否
不修复确认
18
19. 04 | 客户端健壮性测试怎么做
• 方案调研分析
• 核心难点及解决方案
• 业务应用及效果
20. 什么是健壮性测试
e.g. 构造接口返回值中某个key对应的value的异常值,对客户端展示进行校验
核心动作:①构造异常;②完成校验
异常检测
稳定性异常
功能异常
性能异常
展示
运行环境异常
构造
…
交互
业务层健壮性测试
异常输入构造
组件/API健壮性测试
单元测试
20
21. 客户端健壮性测试怎么测
目标: 发现网络数据不符合预期导致的页面加载Crash或核心模块不展示问题 -“测什么”
“怎么测”- 客户端(App) vs 服务端
对比项
测试对象
客户端
被测页面或模块
异常构造所 接口返回数据、设备网络信息、系统状态信息、数据
库、缓存数据、配置信息、手势动作等
需信息
服务端
被测服务
依赖服务返回数据、数据库、缓存、MQ和LION配置等中间件数
据
异常检测 Crash、ANR、展示异常、交互异常、性能、安全问题
等 输入异常数据导致的服务异常,以及请求量过大或异常请求引发
的性能、可靠性、安全问题
环境差异 受设备系统、版本、硬件条件等外界因素影响 运行环境统一
测试执行
效率 低。客户端进行请求和交互相对耗时,且结果需要UI层
面进行观察,因此在用例数量相当的情况下,客户端执
行时长远超服务端 高
21
22. 方案对比
行业方案 - “怎么测”
拦截请求
请求
基本原理:
响应
检测
异常
美团内部工具A/B
对比项
数据构造
返回预置数据
按照基本数据类型设置异常值,根据权重随机构造;支
持自定义异常值和权重
数据生成未包含业务语义
数据覆盖 一次测试只覆盖一种异常数据
异常检测能力 Crash/ANR
执行效率
行业做法A/B
覆盖不足
不支持功能模块缺失检测
与UI自动化执行效率一致
按照基本数据类型设置异常值,支持自定义异常值,支持JSON数
据节点跳过
一次测试支持遍历所有异常数据组合情况,也支持只覆盖一种异
常结果
Crash/ANR
用例量大,测试耗时长
与UI自动化执行效率一致,测试耗时根据测试覆盖异常数据条数
几乎等比上涨
22
23. 面临挑战
挑战一:如何保障数据构造生成的全面性
e.g.
Response Header
Request-1
Request-2
…
Response Body
{
Request-n
key : value
// 基本类型:Int、Float…
// 复合类型:Array
//
}
如何唯一访问1种 哪些请求和当 基本数据类型相同但是包含
形态的首页? 前页面相关? 了不同的语义,如何处理?
23
24. 挑战一:数据构造生成全面性
解决方案:
测试对象
控制 数据录制
定义描述规则 用例“活”起来
结合语义的
变异规则
结合语义的变异规则
e.g. 响应体 Json的字符串可能代表时间戳、颜色、路由跳转链接、动态/静态资源链接(静态图片、动图、视频等)
24
25. 实现方案
可测性改造
观测
控制
登录状态 地理位置
数据构造 页面跳转
策略控制 缓存控制
…
语义差异化的数据异常构造
基本数据类型
跳链
颜色
资源
配置文件
文本
时间戳
…
25
26. 挑战一:数据构造生成全面性
产生问题: 用例生成数量级巨大,测试执行耗时长
e.g. 假设对于1个变量,有7种变异取值,存在n个此类型变量情况下,就会产生7^n种数据组合,当n=10时用例已经超过
亿级,假定一条用例执行1分钟,耗时约为537年
26
27. 面临挑战
挑战二:如何精简用例降低测试运行时长
基本思路:
①
相似节点识别,利用相似节点的相同key取值不同的变异数据,删减构造用例数
27
28. 挑战二:用例精简降低测试耗时
基本思路:
②
结合响应体层级,量化计算不同层级间响应体中节点的相似度,距离根节点越近,相似度越低,需要合并构造
e.g.
data.modules[0].proxyData.resourcesMap.utilInfoArea[0].materialMap.utilName
data.modules[1].proxyData.resourcesMap.utilInfoArea[0].materialMap.utilName
28
29. 挑战二:用例精简降低测试耗时
解决方案: 引入编辑距离和并查集算法,对于响应体中每一层构造N*N矩阵计算相似度,并通过距离根节点的距离赋予
不同权重。
为了合并最大用例,把同层节点的编辑距离矩阵做0,1转化,由于耦合关系的需要放在同一个组里分别构造,转化时把编辑
距离大于1的转化为了0;
29
30. 挑战二:用例精简降低测试耗时
解决方案: 利用图的联通性概念,认为如果A和B是相似节点,B和C是相似节点,则A与C相似。
e.g.
30
31. 挑战二:用例精简降低测试耗时
用例精简效果评估:
2000+
用例数
近40%
不变 基本持平
发现能力 代码覆盖率
31
32. 业务应用及效果
工具接入: 美团App、优选App
应用场景:
接入成本: 一次性接入成本;全量回归测试执行4小时
异常检测能力: Crash、ANR、功能模块缺失
问题发现能力: 目标范围内无漏测
32
33. 05 | 总结及展望
34. 总结回顾
工具建设:
异常检测
稳定性异常
功能异常
性能异常
展示
运行环境异常
构造
…
交互
业务层健壮性测试
异常输入构造
组件/API健壮性测试
单元测试
不足:在节点相似计算和用例精简上
34
35. 还在继续…
进一步探索方向:
① 异常检测能力增强
② 异常构造能力增强:
③
① 千人千面场景下保证录制数据的全面性、有效性
② 缓存、文件等数据环境构造能力增强
用例生成智能化,减少无效构造
① 算法优化
② 智能推荐
35
36. 更多挑战
36
37. 4.总结和展望
招聘:测试开发岗位
• 一些结果 邮箱:qinxin@meituan.com
• 不足和改进方向
• 未来挑战
更多技术干货
欢迎关注“美团技术团队”