WeTest腾讯质量开发平台 一种精准 monkey 测试的方法

腾讯WeTest · 2018年10月23日 · 最后由 Joe 回复于 2018年10月25日 · 3946 次阅读

作者:王薇,腾讯云与智慧产业高级工程师
商业转载请联系腾讯 WeTest 获得授权,非商业转载请注明出处。
原文链接:https://wetest.qq.com/lab/view/413.html

WeTest 导读

相信大家都知道移动端应用的 monkey 测试吧,不知你们有没有为 monkey 测试的太过于随机性的特性有过困扰,至少在我们这种界面控件较少且控件位置较偏的 app 的使用上其测试有效性大打折扣。因此本文主要针对这个问题,提供了一种解决方案。


1. 问题背景

Monkey 测试:是 Android 自动化测试的一种手段,简单的说是像猴子一样乱点,它向系统发送伪随机的用户事件流 (如按键输入、触摸屏输入、手势输入等),是一种随机性测试,为了测试软件的健壮性和稳定性,通常用于安卓应用的压力测试。

因此,我们的产品也用了这种传统的 monkey 手段进行 app 稳定性测试,在使用一段时间后,并未发现实际性问题。通过观察一段时间的执行过程,发现由于我们 app 几个页面控件布局是比较偏上和偏下边缘,中间只有一个大按钮,这样中间大按钮命中率比较高经常会进入同一个页面,那么其他页面和按钮的功能几乎没有被点击到。这种传统 monkey 测试控件命中率太低!

市面上有很多类似布局的 app,相信在采用传统 monkey 测试时也存在此类问题。

2. 解决方案

我们知道,对于 app 页面布局的控件位置、属性等信息是可以用 android sdk 工具包中的 uiautomatorviewer.bat 查看的,如果在 monkey 测试时能获得这些控件的位置信息,那么就可以实现控件的精准点击。android sdk 提供了这个命令 “adb shell uiautomator dump”,可以实现将当前 activity 布局文件 dump 到 xml 文件中,这样问题就得到了解决。

dump 布局文件:

得到的 window_dump.xml 内容:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>



...

uiautomatorviewer.bat 查看控件属性:

但是,又一问题,xml 中的控件非常多,并非每个控件都可以点击,如果挨个尝试点击那么执行效率也是非常慢的,不符合预期。幸好,控件有个 clickable 属性,当其等于 true 时,表示该控件可点,反之不可点。那么,我们将控件信息 xml 文件中 “clickable=true” 的控件过滤出来,再去计算这些控件的位置进行点击,就可以实现精准点击。到此,问题得到完美解决。

举例,执行流程如下:

当然,在实际中,还存在控件的点击顺序问题,如果点击顺序不合适,也会存在有些控件被频繁点击、有些控件可能点击不到的情况。这就需要根据实际的测试目标来指定执行策略,例如,在当前页可点击的控件列表中,随机点击、顺序点击,或存储各页面控件的目录树,进行深度遍历点击等等。

随机测试完后,有时还需要还原执行过程,定位发现的问题,所以在执行过程中,我还加入了一些截图操作,在每次点击控件前进行点击坐标的标记、截图,这样,测试完后就能根据这些截图很完美的还原出了整个随机测试的过程,大大简化的问题的定位。举例,下图是执行过程中的几张连续截图:



图中,红点位置就是点击位置,很直观的展示了执行过程。

总结

本文所述的方案很好的解决了 monkey 测试在控件布局不均衡的 app 上执行有效性低的问题。同时,实现了一种自适应的随机测试手段,也就是无需针对不同 app 编写不同的随机测试脚本,实现了一套测试代码用于所有 app 的随机性测试。


“自动化兼容测试” 服务将提供云端自动化兼容服务,提交云端百台真机,并行测试。快速发现游戏/应用兼容性和性能问题,覆盖安卓主流机型

点击:https://wetest.qq.com/product/auto-compatibility-testing 了解更多详情。

如果使用当中有任何疑问,欢迎联系腾讯 WeTest 企业 QQ:2852350015

共收到 8 条回复 时间 点赞

一顿操作猛如虎,最后给个商业工具地址 😂 这很腾讯

老马 回复

腾讯不是全靠技术推动的,技术肯定不如阿里。

但是数据驱动还是很厉害的,数据驱动比技术驱动跟重要。

老马 回复

文章的思路也很好啊,不一定要人家给你代码,才能得到启发呀

思路有了,剩下的就是干了

和 monkey 没啥关系啊,这不就是 UI 遍历吗?
adb shell uiautomator dump 效率相当感人,再加上截图耗时,一个小时遍历不了多少场景。
还是@zhangzhao_lenovo 的 Maxim 效率高实用性强,只可惜没开源。

很好的思路,让很多有能力写,但是没有相关方面经验的人,可以开始做了

这个只能获取当前的 android 系统的屏幕,如何获取投屏出去的屏幕呢。比如爱奇艺中的视频投屏到电视上,如何确定投屏出去是正确的呢?

脚本工具选择有什么推荐的吗?appium 还是 uiautomator

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册