智能遍历测试技术
智能遍历测试与测试用例生成
About Me 黄延胜(思寒)
- 霍格沃兹测试开发学社创始人
- 测吧(北京)科技有限公司测试架构师
- 10+年测试从业经验的测试架构师,曾任职于阿里巴巴、百度等名企
- 开源自动化测试项目 AppCrawler 作者
- 厦门理工学院硕士研究生企业导师
- GMTC MTSC TID 等行业大会演讲嘉宾
- 技术支持与培训服务客户涵盖工信部、信通院、华为、小米、阿里、京东、中国移动、海关总署等众多知名企业

自动化测试与手工测试对比
| 手工测试 | 自动化测试 | |
|---|---|---|
| 质量(测试广度 测试深度) | 低 | 高 ❤️ |
| 效率(测试执行速度 质量反馈速度) | 低 | 高 ❤️ |
| 成本(维护成本 学习成本) | 低 ❤️ | 高 |
手工测试的困境
- 测试广度
- 回归测试覆盖度难以保证
- 兼容性测试难以保证,多环境多版本无法充分覆盖
- 专项测试回归难度大,内存泄漏、健壮性测试、弱网等测试过程太多
- 测试深度
- 断言校验效果难以保证,如何对密集的信息字段进行断言
- 路径覆盖不够深入
- 测试效率
- 投入成本大
- 质量反馈慢
自动化测试的困境
- 技术门槛高
- 需要一定的经验与能力
- 需要进行二次框架封装
- 投入成本大
- 有一定的测试用例维护成本
- 招聘经验丰富的测试开发工程师成本高
我们到底需要什么样的测试方法
| 手工测试 | 自动化测试 | 理想的测试方法 | |
|---|---|---|---|
| 质量(测试广度 测试深度) | 低 | 高 ❤️ | 高 ❤️ |
| 效率(测试执行速度 质量反馈速度) | 低 | 高 ❤️ | 高 ❤️ |
| 成本(维护成本 学习成本) | 低 ❤️ | 高 | 低 ❤️ |
智能遍历测试
- 将被测系统理解为一个有限状态机,通过遍历的方式达到充分的路径覆盖
- 通过对模型的分析实现自动断言与测试用例自动生成
- 自动遍历测试是基于模型的测试方法的一种应用场景
基于模型的测试方法
- 将 app 的业务行为理解为一个有向图
- 有向图中的节点代表业务状态
- 有向图中的路径代表达到特定状态的行为
- 以充分遍历所有状态为目标

智能遍历测试的特点
| 手工测试 | 自动化测试 | 智能遍历测试 | |
|---|---|---|---|
| 业务覆盖度 | 低 | 高 ❤️ 可累积的自动化用例 |
高 ❤️ 可累积的自动化模型 |
| 执行速度 | 低 | 高 ❤️ 使用自动化 |
高 ❤️ 使用自动化 |
| 维护成本 | 低 ❤️ 不需要维护代码 |
高 | 低 ❤️ 不需要维护代码 |
| 学习成本 | 低 ❤️ 不依赖自动化技术 |
高 | 低 ❤️ 不依赖自动化技术与经验 |
智能遍历测试相关的工具
| 是否开源 | Android | iOS | 用途 | 方法论 | |
|---|---|---|---|---|---|
| monkey | 开源 | 支持 | 压力测试工具 健壮性测试 |
||
| 百度 smart_monkey | 支持 | 健壮性测试 | 改进版 monkey | ||
| 腾讯 newmonkey | 支持 | 健壮性测试 | 改进版 monkey | ||
| Android App Crawler | 开源 | 支持 | 遍历测试 | 基于模型 | |
| zhangzhao/Maxim | 支持 | 健壮性测试 遍历测试 |
基于模型 | ||
| 蚂蚁金服 macaca/nosmoke |
开源 | 支持 | 支持 | 遍历测试 | 基于模型 |
| 霍格沃兹测试开发学社 appcrawler |
开源 | 支持 | 支持 | 遍历测试 | 基于模型 |
| 字节跳动 Fastbot | 支持 | 支持 | 遍历测试 | 基于模型 |
Google Android App Crawler
Android App Crawler

Android App Crawler 中文介绍

Robo 测试

Firebase 在线的 AppCrawler 云服务


霍格沃兹测试开发学社 AppCrawler
AppCrawler 介绍
Appcrawler 是一个基于自动遍历的 App 爬虫工具,支持 Android 和 IOS,支持真机和模拟器。最大的特点是灵活性高,可通过配置来设定遍历的规则
---
appcrawler 全平台自动遍历测试工具
Q&A: https://ceshiren.com/c/opensource/appcrawler
author: seveniruby
---
基于模型分析探索路径与测试用例生成

保留每一步截图

AppCrawler 报告

AppCrawler quick start
#Android时钟
appcrawler --capability "appPackage=com.google.android.deskclock,appActivity=com.android.deskclock.DeskClock"
#生成默认配置文件
java -jar appcrawler.jar --demo
#使用配置文件
java -jar appcrawler.jar \
-c demo.yml \
--capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
核心配置
- capability 设置:与 selenium appium 完全一致
- testcase:用于启动 app 后的基础测试用例
- selectedList:遍历范围设定
- triggerActions:特定条件触发执行动作的设置
配置语法
- testcase 的简写形态
- xpath:对应 when 里的 xpath
- action:对应 when 的 action
- testcase 的完整形态
- given:所有的先决条件
- when:先决条件成立后的行为
- then:断言集合

递归遍历过程
- crawl():
- 把当前 app 的界面 dump 为 xml 结构
- 获取待遍历元素
- 遍历范围 selectedList
- 过滤黑名单 小控件 不可见控件 blackList
- 重排控件顺序 firstList lastList
- 跳过已点击 + 跳过限制点击的控件 tagLimit
- 根据匹配的规则执行 action
- crawl()
UI 界面结构获取
- Android
- tag class
- resource-id
- content-desc
- text
- iOS
- tag
- name
- label
- value

遍历策略
列表优先策略

深度优先策略

列表项代码逻辑基本相同
默认只遍历其中的部分数据,可大大减少遍历工作量

少部分列表项每个逻辑都不同全部遍历
对特殊的菜单与相似项提供额外的遍历额度

遍历算法的综合
- 基于界面流程
- 深度优先
- 广度优先
- 基于 UI 控件属性的遍历策略
- 深度:控件在布局中的层级
- 列表优先:ListView RecyclerView 通常是核心数据
- 非菜单优先:selected 属性为 true 的一般用于菜单展示
- 实现方式:sortByAttribute: [ depth, list, selected ]
智能遍历的三要素
- 界面与控件结构识别
- 自动化 RPA
- 遍历算法
纯 adb 也可以完成遍历测试
adb shell uiautomator dumpadb shell screencapadb input- 设计通用遍历算法
Web 遍历技术
Web 遍历的流程
- 需要首先解决 page source 为 html 的问题
- 利用 ExecuteScript 植入 js 获取页面结构
- 转成兼容 android 的格式

测试用例生成
大前端(Web/App)测试框架


测试用例生成价值
- 行业目前问题
- 行业目前还没有统一的测试框架
- 编写测试用例费时费力
- 用例无法自动生成与探索
- 解决方案
- 打造统一测试框架
- 提供多种测试框架的测试用例生成
- 利用模型驱动测试方法自动扩展测试用例
App Diff 测试方法
diff 方法 diffy 思路的借鉴

Diff 测试结果

diff 测试案例


通过 DOM 对比差异



Diff 测试报告

Q&A
思寒@霍格沃兹测试开发学社
