张杰 美团酒旅客户端自动化测试实践

1. 美团酒旅客户端⾃自动化测试实践 张杰 胡朝旭 हٖଶ‫؃‬
3. ⽬目录 CONTENTS 01. 背景 02. 技术⽅方案 03. 系统建设 04. 落地与规划 हٖଶ‫؃‬
4. 01 背景
5. ⾃自 动化测 试 伴随公司成⻓长的复杂度提升 应⽤用框架 特性 特性 特性 特性 业务发展 需求迭代 ⼈人员迭代 体验优化 特性兼容 通过个⼈人能⼒力力保证质量量越来越难 特性 特性 特性 特性 特性 特性 特性 特性 特性 整体优化⻛风险变⾼高
6. ⾃自 动化测 试 ⽇日常开发的困扰 需求开发 影响⾯面难以评估 实现⽅方式不不统⼀一 技术改进 整体需求不不可追溯 测试case描述过于抽象 • 这是啥! • 看不不懂! • 改不不动!
7. ⾃自 动化测 试 ⾃自动化测试的⽬目标 ⾼高效 完整 保证⽇日常迭代开发质量量 技术改进做到不不错不不漏漏 需求⼤大道 提升⽼老老化⻋车辆的⾏行行驶速度 客观 为⻋车辆检修提供说明书 重构
8. 02 技术⽅方案
9. ⾃自 动化测 试 测试全景图 case维护 case管理理 case编写 case关联 case选取 bug提报 bug跟踪 case执⾏行行 编译 结果分析 重运⾏行行 部署 执⾏行行 聚合分析
10. ⾃自 动化测 试 case选取 ⼈人⼒力力投⼊入 微观 基础sdk 单元测试 覆盖sdk全部功能正确可⽤用 ⽤用户伤害 ⾁肉体损伤 介观 宏观 测试粒度 ❓ 业务主流程 集成测试 保证主流程可⽤用 难以完全覆盖 容忍基线 财产损失 测试⽅方案的容忍基线 精神伤害
11. ⾃自 动化测 试 case选取 单元测试 接⼝口与API测试 case编写 功能测试 兼容、稳定性测试 性能测试 回归测试 业务逻辑测试 场景测试 埋点测试 截屏测试 Monkey测试 性能测试 全链路路回归测试 测试框架 基础设施 case管理理 持续集成 测试环境
12. ⾃自 动化测 试 功能测试⽤用例例 测试⽤用例例: 进⼊入⻚页⾯面 执⾏行行操作 观察结果 UI呈现 ⽹网络请求 ⽤用户操作 UI呈现 本地上下⽂文 ⽹网络请求
13. ⾃自 动化测 试 初版⽅方案 ⾏行行为模拟 UI呈现验证 iOS android View databinding 通过触发函数 (信号)模拟 View user events updates view 内存状态(信号) ViewModel Presenter updates model state-change events ⽅方法调⽤用(参数) Model Model 与实现⽅方案绑定、需要重构 抗重构能⼒力力差 验证能⼒力力有⽋欠缺 代码量量⼤大 ⽹网络请求验证 ⽅方法调⽤用(参数) 可读性差
14. ⾃自 动化测 试 迭代⽅方案 ⾏行行为模拟 iOS android View databinding 通过触发函数 (信号)模拟 View user events updates view ViewModel Presenter updates model state-change events Model Model UI呈现验证 内存状态(信号) ⽅方法调⽤用(参数) 截图对⽐比 ⽹网络请求验证 ⽅方法调⽤用(参数)
15. ⾃自 动化测 试 第三版⽅方案 ⾏行行为模拟 函数(信号)触 发 ⼿手势触发 UI呈现验证 ⽹网络请求\本地存储验证 ⽅方法调⽤用(参数) 截图对⽐比 ⽹网络请求对⽐比 本地存储对⽐比
16. ⾃自 动化测 试 Android实践—技术选型 测试⼯工具 运⾏行行环境 Mock⽅方式 主要优势 主要问题 Roboletric Espresso JVM 真机 通过Shadow类及 •可以Mock所有涉及的类 PowerMock •执⾏行行速度⾼高效 •需要构造⼤大量量Shadow类 •执⾏行行逻辑与真实环境存在差异 •只能通过属性检查UI •⼿手势受限 通过Mockito •⼿手势⽐比较完备、有较强拓拓展性 •具有⼀一定的执⾏行行中Mock能⼒力力 •同时⽀支持⻚页⾯面级和流程级测试 •⽆无法Mock静态⽅方法和final类 •在⽣生命周期执⾏行行中缺乏Mock 能⼒力力 UiAutomator Robotium Appium 真机 通过代码内置 •完全⽀支持⿊黑盒测试 •可Mock范围有限 Debug能⼒力力及外部 •⽀支持跨应⽤用测试(Robotium除 •测试需要⾛走完整流程,执⾏行行效 Mock Server 外) 率低
17. ⾃自 动化测 试 iOS实践—技术选型 测试⼯工具 Mock⽅方式 主要优势 主要问题 •简单,适合快速开发 KIF OHHTTPStubs OCMock •版本覆盖⼴广 •像⽤用户⼀一样操作 EarlGrey OHHTTPStubs OCMock •同步 •可⻅见性检查 •像⽤用户⼀一样操作 •查找与操作分离,更更加灵活 Appium 通过代码内置Debug能 ⼒力力及外部Mock Server •完全⽀支持⿊黑盒测试 •⽀支持跨应⽤用测试 •⼯工具链完善 •查找与操作绑定,不不灵活 •查找⽅方式单⼀一,代码改造成本⾼高 •⼯工具链相对缺失 •可Mock范围有限 •测试需要⾛走完整流程,执⾏行行效率低 •Python脚本,学习成本
18. ⾃自 动化测 试 Mock上下⽂文 静态⽅方法及final类 APK对象⽅方法 系统对象⽅方法 APKfinal类、静态⽅方法 系统静态⽅方法 Mockito 静态插桩 ⽣生命周期内返回值mock 暂不不处理理 启动待测App 替换App持有 对象 启动待测⻚页⾯面 替换⻚页⾯面持有 对象 测试执⾏行行 通过请求参数建⽴立 对象返回值映射关系 执⾏行行测试 制作Mock对象 设置插桩类返 回 启动测试App 启动测试⻚页⾯面 测试执⾏行行
19. ⾃自 动化测 试 模拟操作 espresso⼿手势执⾏行行流程 测试线程 定位控件 注册动作 注册断⾔言 UI线程 等待空闲 定位控件 执⾏行行动作 等待空闲 定位控件 判断断⾔言 空闲 AsyncTask线程池为空 Looper队列列⽆无⽴立即执⾏行行任务 IdleResource.isIdleNow()全部为true 默认实现:MainLooper没有需要⽴立即执⾏行行的message,AsyncTask对应的线程池中⽆无正在执⾏行行和需要执⾏行行的任务 异步IO线程 延时动画 React Native
20. ⾃自 动化测 试 模拟操作 espresso等待机制改进 空闲 AsyncTask Looper IdleResource.isIdleNow() RN Looper IO线程池 测试线程 动作等待条件 定位控件 注册动作 断⾔言等待条件 注册断⾔言 UI线程 等待空闲 动作等待条件 定位控件 执⾏行行动作 等待空闲 断⾔言等待条件 定位控件 判断断⾔言
21. ⾃自 动化测 试 模拟操作 通过插桩修改约束 定位控件 原有 Click DoubleClick LongClick TypeText Swipe RepeatUtil 判定约束 注⼊入MotionEvent 拓拓展 PrecisionTouch PrecisionSwipe WrapperAction 提供更更多常⽤用⼿手势 兼容⾮非Android标准操作(screenshot等)
22. ⾃自 动化测 试 iOS-EarlGrey对RN的⽀支持
23. ⾃自 动化测 试 截屏验证 android WindowManagerGlobal iOS 获取全部Window并截屏 PC存储空间 FBSnapshot imageMagick 参考图 实际效果 Diff分析
24. 03 系统建设
25. ⾃自 动化测 试 下⼀一步 还缺什什么????
26. ⾃自 动化测 试 下⼀一步 RD 代码编写 静态检查 提PR ⾃自动化测试编写 case信息获取 测试框架 Aden QA case编写、管理理和筛选 场景设计的质量量管控 测试进度查询 测试⽤用例例编写 精准测试 上报测试结果 ⽣生成测试报告 拉取case信息 发版 集成/打包 QA⿊黑盒测试 QA稳定性 交付QA 和兼容测试 准⼊入判断 运⾏行行RD⽩白盒测试 CI 上报测试结果 核⼼心指标系统 获取⾃自动化测试结果 ⼈人⼯工测试
27. ⾃自 动化测 试 如何运⾏行行-CI 并发 + 重试
28. ⾃自 动化测 试 如何运⾏行行-并发 执⾏行行时间 9000s 7875s 6750s 5625s 4500s 3375s 2250s 1125s 0s 1 1359个Case 5 10 15 20 25 30 并发路路数
29. ⾃自 动化测 试 如何运⾏行行-减少失败重试 CI case编写 规范setup和teardown
30. ⾃自 动化测 试 如何运⾏行行-CI单业务线实施 case 1000个 + 并发 8路路 编译 5分钟 + case运⾏行行 15分钟 = 总耗时 20分钟
31. ⾃自 动化测 试 如何协作-以前的⽅方式 • 没有Case ID,RD的⾃自动化测试代码⽆无法与case做关联 • 版本变更更只有简单的⽂文字说明,难以做测试代码维护 • ⽆无法产⽣生QA和RD的协同
32. ⾃自 动化测 试 如何协作-业内系统 • 结构化⽂文本 不不直观, 不不易易读 多媒体展示差 存量量case难以迁移 • 多版本并⾏行行⽀支持差 • ⽆无法⽀支持截图对⽐比测试
33. ⾃自 动化测 试 如何协作-Aden 取名字⾃自Aden港,意为Case的集散地 提供case和case集管理理,⾃自动化测试和⼿手动测试管理理协同功能
34. ⾃自 动化测 试 如何协作-Aden 功能 系统 Case管理理 Case集管理理 前端展示层 测试框架⽀支持 UI测试系统 测试结果管理理 指标系统 SSO 基础 服务 ⽤用户 权限 ⽇日志 集团 设施 图⽚片服务 Git CI 接⼝口服务 核⼼心指标系统 Bug管理理系统 CI⾃自动化⼯工具
35. ⾃自 动化测 试 如何协作-Aden • 采⽤用脑图做线上case管理理 • 系统为每个case⽣生成唯⼀一ID • 通过标签等⽀支持灵活的测试集组合
36. ⾃自 动化测 试 如何协作-Aden 多版本⽀支持 • 每个版本都有⼀一个副本,相同case保持id不不变 • 写时复制,减少存储 • ⾃自动化测试代码仓库分⽀支保持和测试集⼀一致
37. ⾃自 动化测 试 如何协作-Aden
38. ⾃自 动化测 试 如何协作-Aden
39. 04 落地与规划
40. ⾃自 动化测 试 ⼈人效 测试代码编写时间/ 开发时间 40% 30% 31.6 20% 23.7 18 10% 0% 度假某⻚页⾯面 度假某筛选列列表⻚页 控件定 位⼯工具 37%
41. ⾃自 动化测 试 落地效果-某列列表⻚页重构 检出率 8 6 失效率 • Android共120个case,失效3个 • iOS共103个case,失效1个 4 2 0 iOS ⼈人⼯工检出 Android ⾃自动化检出
42. ⾃自 动化测 试 将来的路路-录制case? RD、QA录制 ⽤用户反馈 度假 住宿 交通 录制引擎 事件录制 ⽤用户事件 弹窗 ⻚页⾯面跳转 UI变化 数据录制 API请求 地理理坐标 ⻚页⾯面参数 缓存 回放引擎 私有API管理理 数据回放 事件回放 API参数校验 其他校验 结果上报 管理理系统 case存储 case关联 case分发 测试报告 通知报警 ……
45. Q&A