背景
测试中的的覆盖率指标会影响测试结果,在Android Monkey测试中也存在同样的道理,由于Android Monkey执行的随机性很大, 可能会导致核心页面不能被覆盖到或者测试结果是一个较低的覆盖率,不能拦截发现到Crash。本文就来介绍下如何提高Android Monkey的覆盖率。
覆盖率计算
我们先了解下业界几种覆盖率计算方式:
1、按照Activity计算覆盖率
FastBot是按照已跑到的activity/所有的的activity。从packagemanager service获取。获取的的activity肯定会有没入口的废弃的。
Fastbot 模型介绍:
我们将页面的 GUI 信息抽象成模型中的 State,将执行的动作抽象成模型中的 Action,通过 State 作为图的节点,Action 作为图的边,连接形成有向有环图模型。图中展示了有向有环图的局部示例,其中箭头虚线代表着执行动作,连接起了各个节点。
执行逻辑图:
优点: 最简单、快速能计算一个覆盖率出来。
缺点:
(1)、activity不能代表一个页面,activity是粗力度的计算方式、activity可能存在已经被下掉的情况、缺乏准确性。(2)、通过activity看覆盖率不准,因为Activity不能代表一个功能上的页面。
2、统计代码覆盖率的方式
Java层的覆盖率数据统计使用Jacoco,C 层的代码覆盖率使用gcov,gcov是Linux下GCC自带的一个C/C 代码覆盖率分析工具,关于Jacoco和gcov这边不做过多的介绍,自行搜索了解即可。
因此我们需要通过类似jacoco的集成测试覆盖率统计框架,来衡量测试人员的回归范围是否精准、测试场景是否遗漏;
保障上线的代码都已经经过测试人员验证。针对这一点,我们提出了Android测试覆盖率统计工具, 借此来提升测试人员精准测试的能力,借助覆盖率数据补充测试遗漏的测试用例。
Android APP开发主流语言就是Java语言,而Java常用覆盖率工具为Jacoco、Emma和Cobertura。
优点: 计算覆盖的方式更精细和准确到方法和函数级别。
缺点: 在打包的时候注入覆盖率框架、解析生成覆盖率报告,在测试技术上有一定的门槛、需要研发配合。
3、埋点数据
以前听说过,但是网上没有找到例子。大概思路: Monkey测试也是会产生埋点行为数据的,比如: PageShow、Click等事件。
那么我们可以先使用PageShow来统计页面级别的覆盖情况,只有结合埋点平台获取Monkey期间的埋点数据即可。
使用埋点的覆盖率计算公式: Monkey的PageShow(分子) / 线上最近几个版本的Top覆盖率(分母)
优点: 统计的覆盖率更贴近用户维度,
缺点: 依靠公司内部埋点数据建设
提高覆盖率
1、增加Monkey测试的覆盖范围
经过基础版的常规测试和压测,到发版的阶段用常规的方式测试已经不太能发现问题,最好能用一些伪随机的测试制造一些可能导致时序问题的场景。
2、使用自动化界面遍历 adb
Monkey的方式来提高Monkey测试的覆盖率,因为Monkey测试有很高的随机性,一些界面在测试的时候很可能不会走到,自动化界面遍历跳转到指定的界面之后再触发Monkey测试,保证测试的覆盖范围。
3、通过路由跳转
基于一些路径比较深,也是核心功能的页面,可以使用路由直接跳转。
Android路由主要是映射页面跳转关系,根据路由表将页面请求分发到指定页面。
Android路由使用场景:
- App接收到一个通知,点击通知打开App的某个页面
- 浏览器App中点击某个链接打开App的某个页面
- 运营活动需求,动态把原生的页面替换成H5页面
- 打开页面需要某些条件,先验证完条件,再去打开那个页面
- 不合法的打开App的页面被屏蔽掉
- H5打开链接在所有平台都一样,方便统一跳转
- 打开某个APP,如果APP存在就直接打开,不存在就去下载页面下载
可以使用adb命令跳转到路由
代码语言:javascript复制adb shell am start -a android.intent.action.VIEW -d "custom-scheme://custom-host?itemId=17331" com.foreverstar.test
4、提高执行时间
根据数据统计,每次执行60分钟 提升到 执行120分钟,覆盖率会提升几个百分点的提升,但是有提升上限。
小结
Android Monkey的覆盖率越多越好,但是不要渴望达到100%,一般来说在30%到 40%就可以了,可以通过客户端后门和客户端路由可以快速跳转到某个页面。