Appcrawler自动遍历工具-智能遍历测试与测试用例生成
效率与成本的抉择
在软件开发过程中,测试环节直接影响产品质量和用户体验。随着系统迭代频繁、功能复杂化,企业在测试方法的选择上面临困境:手工测试灵活却效率低,自动化测试高效却前期投入大。那么,我们到底应该如何选择合适的测试方法,以兼顾质量、效率与成本呢?
手工测试与自动化测试的对比
维度 | 手工测试 | 自动化测试 |
质量 | 灵活性高,适合发现界面细节和用户体验问题;但容易受人为失误影响 | 稳定性高,结果一致,可覆盖大规模回归;对复杂交互判断依赖脚本设计 |
效能 | 执行速度慢,重复测试耗时长,不适合大规模或高频回归 | 执行速度快,可批量、多环境、多数据运行,高效回归测试 |
成本 | 前期投入低,仅需人工和用例;长期重复测试人工成本高 | 前期投入高,需要工具和脚本开发;长期可降低人工成本,规模化应用 ROI 高 |
手工测试与自动化测试的困境
测试类型 | 困境 | 严重度/影响 |
手工测试 | 执行效率低,重复测试耗时长 | 高 |
易受人为失误影响,结果不稳定 | 高 | |
难以覆盖大规模数据和复杂场景 | 中 | |
对频繁迭代的需求适应慢 | 中 | |
长期人工成本高,难以规模化 | 高 | |
自动化测试 | 前期投入高,需要工具、环境和脚本开发 | 高 |
脚本维护成本高,需求变动容易导致脚本失效 | 高 | |
对复杂交互和体验类问题判断能力有限 | 中 | |
初学者门槛高,需要一定技术背景 | 中 | |
自动化覆盖率与测试设计质量高度依赖测试人员能力 | 中 |
图例:
高:影响大,必须关注
中:影响中等,需要注意
我们到底需要什么样的测试方法
模块类型 | 推荐测试方法 | 原因 |
稳定功能 / 核心流程 | 自动化测试 | 高重复性,降低长期成本,提高回归效率 |
新功能 / 高变动 | 手工测试 | 灵活快速,发现用户体验与细节问题 |
高风险 / 关键路径 | 手工 + 自动化 | 结合探索性和回归性,保障质量 |
性能 / 压力需求 | 自动化测试 | 批量、高并发测试,手工难以实现 |
界面 / 用户体验 | 手工测试 | 感知真实用户体验,发现自动化难覆盖问题 |
智能遍历测试
- 将被测系统理解为一个有限状态机,通过遍历的方式达到充分的路径覆盖
- 通过对模型的分析实现自动断言与测试用例自动生成
- 自动遍历测试是基于模型的测试方法的一种应用场景
基于模型的测试方法
- 将 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 中文介绍
Robo 测试
Firebase 在线的 AppCrawler 云服务
霍格沃兹测试开发学社 AppCrawler
AppCrawler 介绍
- Appcrawler 是一个基于自动遍历的 App 爬虫工具,支持 Android 和 I0S,支持真机和模拟器。最大的特点是灵活性高,可通过配置来设定遍历的规则
appcrawler 全平台自动遍历测试工具 0&A:https://ceshiren.com/c/opensource/appcrawler author:seveniruby
基于模型分享探索路径与测试用例生成
保留每一步截图
AppCrawler 报告
AppCrawler quick start
#Android时钟a
ppcrawler --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,xuegiu,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界面结构获取
遍历策略列表优先策略
深度优先策略
列表项代码逻辑基本相同
默认只遍历其中的部分数据,可大大减少遍历工作量
少部分列表项每个逻辑都不同全部遍历
对特殊的菜单与相似项提供额外的遍历额度
遍历算法的综合
- 基于界面流程
- 深度优先
- 广度优先
- 基于 U 控件属性的遍历策略
- 深度:控件在布局中的层级
- 列表优先: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 测试报告
写在最后
- 智能遍历测试通过模型驱动,实现对应用的高覆盖、快速执行和低维护成本,为手工测试和传统自动化测试提供了有力补充。无论是App还是Web系统,都可以通过智能遍历实现更全面的测试覆盖,降低人力成本并提升效率。
- 如果你希望在企业内部实现私有部署,保障数据安全与可控性,同时享受智能遍历测试带来的高效回归能力,欢迎联系我们获取更多方案和技术支持。
相关文章
- Spring Boot中对接Twilio以实现发送验证码和验证短信码
- Spring Boot 3.5:这次更新让你连配置都不用写了,惊不惊喜?
- Spring Boot+Pinot实战:毫秒级实时竞价系统构建
- SpringBoot敏感配置项加密与解密实战
- SpringBoot 注解最全详解,建议收藏!
- Spring Boot 常用注解大全:从入门到进阶
- SpringBoot启动之谜:@SpringBootApplication如何让配置化繁为简
- Springboot集成Kafka原理_spring集成kafka的原理
- Spring Boot中@Data注解的深度解析与实战应用
- 大佬用1000字就把SpringBoot的配置文件讲的明明白白!