智能遍历测试技术

智能遍历测试与测试用例生成


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 dump
  • adb shell screencap
  • adb input
  • 设计通用遍历算法

Web 遍历技术


Web 遍历的流程

  • 需要首先解决 page source 为 html 的问题
  • 利用 ExecuteScript 植入 js 获取页面结构
  • 转成兼容 android 的格式


测试用例生成


大前端(Web/App)测试框架


测试用例生成价值

  • 行业目前问题
  • 行业目前还没有统一的测试框架
  • 编写测试用例费时费力
  • 用例无法自动生成与探索


  • 解决方案
  • 打造统一测试框架
  • 提供多种测试框架的测试用例生成
  • 利用模型驱动测试方法自动扩展测试用例

App Diff 测试方法


diff 方法 diffy 思路的借鉴


Diff 测试结果


diff 测试案例


通过 DOM 对比差异



Diff 测试报告


Q&A

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

思寒二维码