Monkey稳定性测试 – 可定制模块级的内核稳定性工具

原生monkey工具是一种随机UI事件流,用来测试长时间随机操作是否会导致应用出现异常。因为原生monkey操作的随机性,所以在实际使用过程中,原生monkey会暴露出以下一些缺点:

1)原生monkey的测试对象是针对整个Android系统或者某个应用,但是无法针对应用里的某个模块或者界面。这样在产品迭代过程中存在的一个局限是:每个迭代时做的稳定性测试都重新做一遍,而无法针对该迭代新增的功能模块做单独的稳定性测试(或者叫做增量稳定性测试)。

以百度云这个应用为例,在某个迭代中集成了“百度钱包”这个新模块,使用原生的monkey工具可能出现的现象是大部分操作可能都落在了百度云的其他模块,而没有操作到“百度钱包”这个模块。

所以,我们期望的稳定性测试能够从系统和应用级范围转移到模块或者activity级别的范围。

图1

2)原生monkey工具的操作是随机的,这样可能导致一些用户路径操作不到或者操作时间过短;以百度直达号的支付业务为例,所有的支付操作必须是基于百度账号登录的前提下才能进行,这样在支付时就必须经历登录百度账号这个用户路径。那么问题来了,原生monkey因为是随机的,无法输入指定的用户名/密码来登录百度账户。

实现业务化配置

1.支持特定模块或者Activity

实现思路

一般进入一个模块会有一个固定的入口,而退出这个模块,也会退回到这个固定入口界面。在使用时,每次操作之后都去检查当前的界面是否为该界面,如果是,则去点击这个入口控件,就回到了这个模块,继续测试;这样即可保证稳定性测试一直保持在这个模块中进行。

检测到当前界面为关注的activity时,通过与手机上的ViewServer通信,获取该activiy的控件信息,得到指定的控件的坐标信息;再对这个坐标做一个点击的操作,即回到了指定的模块界面。

使用方法

在执行monkey命令时扩展一个sa参数,参数格式是package/activity/item,通过该参数可指定入口界面元素;同时再扩展一个ea参数,参数格式也是package/activity/item,通过该参数指定出口界面元素,当碰到出口界面元素时再次主动进入入口界面。

2.配置业务操作及比例

实现思路

大家知道,执行monkey命令时需要配置各个事件的比例,而该优化点的思路就是将业务操作写成自动化脚本,然后将该脚本抽象成一个monkey事件,并且可以配置执行比例。

使用方法

在执行monkey命令时扩展一个m参数,参数格式是 脚本路径 –pct-custom业务比例

例如,测试百度浏览器时定期去打开百度首页:

  • 将脚本browser_test.shpush 到/data/local/tmp/目录下(需要保证browser_test.sh有可执行权限)
  • monkey命令参数配置 -m /data/local/tmp/browser_test.sh –pct-custom 5
工具使用环境配置

从以上介绍可知,原生monkey测试技术的改进需要扩展monkey命令参数,为了实现这点,需要对Android官方自带的monkey.jar包进行源码修改,然后重新编译生成一个新的monkey jar包。下面的介绍是针对新monkey jar生成以后用户的配置步骤,而对于android各平台的monkey jar的下载地址可参考附录。

  1. 根据android平台版本,将对应平台的monkey.jar push到/data/local/tmp/monkey.jar
  2. 生成以下可执行文件/data/local/tmp/monkey

# Script to start”monkey” on the device, which has a very rudimentary

# shell.

#

base=/data/local/tmp

exportCLASSPATH=$base/monkey.jar

trap “”HUP

exec app_process/system/bin com.android.commands.monkey.Monkey $*

  1. 对data/local/tmp/monkey增加执行权限
  2. 使用该扩展功能的monkey 运行命令类似:

adb -d shell/data/local/tmp/monkey -s 0 -p packagename –throttle 2000 –pct-touch 15–kill-process-after-error –pct-nav 25 –pct-majornav 15 –pct-appswitch 2–pct-anyevent 16 –monitor-native-crashes -a package/activity/itemname/[index]-v -v 100

-a 参数即指定需要关注的activity,以及入口控件名称,格式为:

-apackage/activity/itemname/[index]

其中,package/activity可通过HierarchyViewer来查看,如下图

itemname也可通过HierarchyViewer来查看,如下图

index是指这个item名称在这个界面上出现的位置,使用hierarchyviewer从上面开始数从左到右,从上到下。例如,关注的item名称为TextView,需要从hierarchyviewer上看,从左到右,从上到下数所有出现的TextView,找到关注的TextView的index。

Index是一个可选字段,如果不填则默认为0,index用于在同一个activity上有多个相同名称的item时,指定特定的item。

使用备注

Android出于安全考虑,当系统属性ro.secure=0且ro.debuggable=1时才允许开启viewServer服务,所以只有满足这个条件的手机才能使用本文所述的-a参数扩展功能。如果需要更改系统属性ro.secure=0 且ro.debuggable=1,可以通过先root手机,再修改boot.img的方法来实现。

共有 0 条评论评论