一种精准monkey测试的方法
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' ?>
<hierarchy rotation="0">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.bass.cleaner.security" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,1776]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.bass.cleaner.security" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,1776]">
...
</hierarchy>
uiautomatorviewer.bat查看控件属性:

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

当然,在实际中,还存在控件的点击顺序问题,如果点击顺序不合适,也会存在有些控件被频繁点击、有些控件可能点击不到的情况。这就需要根据实际的测试目标来指定执行策略,例如,在当前页可点击的控件列表中,随机点击、顺序点击,或存储各页面控件的目录树,进行深度遍历点击等等。
随机测试完后,有时还需要还原执行过程,定位发现的问题,所以在执行过程中,我还加入了一些截图操作,在每次点击控件前进行点击坐标的标记、截图,这样,测试完后就能根据这些截图很完美的还原出了整个随机测试的过程,大大简化的问题的定位。举例,下图是执行过程中的几张连续截图:



图中,红点位置就是点击位置,很直观的展示了执行过程。
总结
本文所述的方案很好的解决了monkey测试在控件布局不均衡的app上执行有效性低的问题。同时,实现了一种自适应的随机测试手段,也就是无需针对不同app编写不同的随机测试脚本,实现了一套测试代码用于所有app的随机性测试。
“自动化兼容测试” 服务将提供云端自动化兼容服务,提交云端百台真机,并行测试。快速发现游戏/应用兼容性和性能问题,覆盖安卓主流机型
点击:https://wetest.qq.com/product/auto-compatibility-testing 了解更多详情。
如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015
一种精准monkey测试的方法的更多相关文章
- 转: 将Eclipse代码导入到AndroidStudio的两种方式 ,测试了方法2,成功。
蛋疼,不知道为什么我的eclipse的logcat总是莫名其妙的显示一堆黄色字体的字,看不懂的那种,如下图: 然后查了一下资料,说可能是adt版本太低,手机系统太高. 然后本来想升级adt,但是各种折 ...
- Monkey测试结果分析
Monkey测试结果分析 什么是monkey Monkey 测试是 Android 自动化测试的手段之一,它通过模拟用户的按键输入.触摸屏输入等,测试设备多长时间出现异常.Monkey 是一个命令行工 ...
- centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课
centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB ...
- 手机monkey测试BUG重现及解决方法
目录 1.1 Monkey测试简介...1 1.2 Monkey程序介绍...1 1.3 Monkey命令的简单帮助...2 1.4 Monkey命令参数介绍...2 1.5 Monkey测试步骤.. ...
- Android软件测试Monkey测试工具
前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其 ...
- 安卓手机APP压力monkey测试
一.Monkey概述 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行 ...
- Monkey测试4——Monkey命令行可用的全部选项
Monkey命令行可用的全部选项 常规 --help 列出简单的用法. -v 命令行的每一个-v将增加反馈信息的级别. Level 0(缺省值)除启动提示.测试完成和最终结果之外,提供较少信息. Le ...
- Monkey测试1——Monkey的使用
Monkey工具使用 一. 什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实 ...
- monkey测试
一.理解monkey测试 1.Monkey测试是Android自动化测试的一种手段.Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常. 2.当Mon ...
随机推荐
- perl学习---控制:unless,until,next,redo,last
1.1.unless unless 的含义是:除非条件为真,否则执行块中的代码,和if正好相反 unless($fred=~ /^[A-Z_]\w*$/i){ print “The value of ...
- mapper.xml中动态sql抽取重复项
mabatis重点是通过标签对sql灵活的组织,通过配置的方式完成输入 输出映射. 1.对mapper.xml中重复的sql抽取统一维护,以及foreach使用 UserMapperCustom.xm ...
- CPP-基础:互斥量
互斥量的用途和临界区很像.它与临界区的差别在于可以跨线程使用,可以用来同步进行多个线程间的数据访问,但是是以牺牲速度为代价的.只有临界区是非核心对象,那么互斥量就是一个核心对象了.核心对象的特点是有所 ...
- qt+vs2005新建配置不自动加载Generated Files进工程(个人备份)
工程右键Qt Project Settings 的Moc Directory路径删除 确定,再进入将删除路径加上
- Gradle Goodness: Check Task Dependencies With a Dry Run
We can run a Gradle build without any of the task actions being executed. This is a so-called dry ru ...
- java SSM 框架 代码生成器 websocket即时通讯 shiro redis
1. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限. 按钮权限: 给角色分配按钮权限. ...
- 选择排序_c++
选择排序_c++ GitHub 文解 选择排序的核心思想是对于 N 个元素进行排序时,对其进行 K = (N - 1) 次排序,每次排序从后(N + 1 - K)个数值中选择最小的元素与以 (K - ...
- 【HDOJ 1285】确定比赛名次(拓扑排序+优先队列)
Problem Description有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员 ...
- chromium之ScopedNSAutoreleasePool浅析
上代码,看看注释 ScopedNSAutoreleasePool只有Mac系统特有的,也可以理解为OC特有的函数, 其他系统为空实现 // On the Mac, ScopedNSAutorele ...
- Linux 实时查看进程网络的使用情况
一行代码实现 linux 指定进程网络的使用情况 pid=4203;count=0;while true;do info2=`sed -n '4,100p' /proc/$pid/net/dev |a ...