Monkey框架(测试方法篇) - monkey测试实例

一、常规的稳定性测试          

测试背景:
这是一个海外的合作项目,被测程序是Android应用(App)。测试希望通过Monkey来模拟用户长时间的随机操作,检查被测应用是否会出现异常(应用崩溃或者无响应)。
测试脚本:
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch
10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts
-v 500000
显而易见,这个Monkey测试的命令相比上一节提到的要复杂得多,主要是对一些操作事件做了限制,从而减少了Monkey伪随机化的无效操作。这体现在以下几个方面。

1)使用-p参数来制定测试应用的包名(Package)

因为被测程序是一个特定的Android应用程序,需要指定被测程序的包名。指定包名后,Monkey会根据包名找到对应的应用,并启动其main activity,然后执行Monkey测试。
技巧
查找应用包名的方法有很多,这里简单列举几个常用方法:
(1)通过pm命令查看。
在命令行窗口输入:
>adb shell
>pm list package
此时将列出手机上所有的应用包名,在列表中找到要测试的应用包名即可。
(2)通过查看APK源码下的AndroidManifest.xml文件。
(3)通过aapt命令查看。
(4)通过adb logcat抓取当前Android机运行的App的包名。

2)使用--pct-xxx参数限制Monkey执行的事件类型和占比

前面已经说了,这个测试的目的是希望模拟用户操作,因此需要让Monkey执行的事件尽可能地接近用户的常规操作,这样才可以最大限度地发现用户使用过程中可能出现的问题。因此需要对Monkey执行的事件百分比做一些调整。
触摸事件和手势事件是用户最常见的操作,所以通过--pct-touch和--pct-motion将这两个事件的占比调整到40%与25%;目标应用包含了多个Activity,为了能覆盖大部分的Activity,所以通过--pct-appswitch将Activity切换的事件占比调整到10%;被测应用之前在测试中出现过不少横竖屏之间切换的问题,这个场景也必须关注,因此通过--pct-rotation把横竖屏切换事件调整到10%。

3)使用-s参数来指定命令执行的seed值

Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。

4)使用--throttle参数来控制Monkey每个操作之间的时间间隔

指定操作之间的时间间隔,一方面是希望能更接近用户的操作场景,正常用户操作都会有一定的时间间隔;另一方面也是不希望因为过于频繁的操作而导致系统崩溃,尤其是在比较低端的手机上执行测试时。因此通过--throttle设置Monkey每个操作固定延迟0.4秒。

5)使用--ignore-crash和--ignore-timeouts参数使Monkey遇到意外时能继续执行

在执行Monkey测试时,会因为应用的崩溃或没有响应而意外终止,所以需要在命令中增加限制参数--ignore-crash和--ignore-timeouts,让Monkey在遇到崩溃或没有响应的时候,能在日志中记录相关信息,并继续执行后续的测试。

6)使用-v指定log的详细级别

Monkey的日志输出有3个级别:默认的是level 0, -v -v日志级别为level 1, -v -v日志级别为level 2。日志的级别越高,其详细程度也越高。为了方便问题的定位,将日志级别设置为level2。
在常规的稳定性测试中,虽然可以自定义各种事件的操作占比,但毕竟是随机事件流。在实际测试过程中,难免会遇到Monkey点了我们不希望它点击的地方,比如误点了工具栏导致网络断开的情况等。当测试过程中Wi-Fi断开时,是否有可能自动重连呢?这在后面会讲到

二、自定义脚本的稳定性测试                          

常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景(执行固定的事件流)呢?这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Monkey脚本的规范编写好脚本,存放到手机上,启动Monkey通过-f scriptfile参数调用脚本即可。
Monkey自定义脚本的编写模板如代码清单4-1所示。
代码清单4-1 Monkey自定义脚本的编写模板
#头文件,控制Monkey发送消息的参数,固定写即可
#脚本类型,一般不用更改
type=raw events
#脚本执行次数,但是由于Monkey命令本身可以指定执行次数,所以这里的设置是不生效的
count=10
#命令执行速率,速率也可以通过Monkey命令设置,这里的设置是不生效的
speed=1.0
#以下为Monkey命令
start data>>
LaunchActivity(pkg_name, cl_name)
DispatchPress(KEYCODE_HOME)
 
monkey脚本常见API
 
技巧
Monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息
 
下面来看一个简单的例子:
这里要测试的是应用宝App,测试的操作是打开应用宝,点击输入框,输入“yyb”,点击搜索。搜索完成后,点击返回键返回应用宝首页。
首先,将在本地编写需要的测试脚本命名为monkey.script(文件格式无要求),脚本内容如代码清单4-2所示。
代码清单4-2 Monkey自定义脚本实现进入应用宝进行搜索
 
#启动测试
type = user
count = 49
speed = 1.0
start data >>
#启动应用宝
LaunchActivity(com.tencent.android.qqdownloader, com.tencent.assistant.activity.
SplashActivity)
UserWait(2000)
#点击搜索框
Tap(463,150,1000)
UserWait(2000)
#输入字母“yyb”
DispatchString(yyb)
UserWait(2000)
#点击搜索
Tap(960,150,1000)
UserWait(2000)
#点击返回键返回首页
DispatchPress(KEYCODE_BACK)
其次,将文件push到手机或模拟器的sdcard中:
>adb push monkey.script /sdcard/
最后,执行脚本:
>adb shell monkey -f /sdcard/monkey.script -v 1
 
如果需要重复执行某个脚本,只要在monkey启动命令中修改执行次数即可。例如
>adb shell monkey -f /sdcard/monkey.script -v 10
 

三、结合辅助命令,获取更多信息                        

常规测试只要记录下Monkey日志,再分析Monkey日志检查是否有异常即可。但是,很多时候,测试除了想知道执行过程是否有异常,还需要能获取执行过程中的一些详细信息或性能数据,比如想知道Monkey执行过程中是否存在内存泄漏,需要获取内存信息。这时候就需要借助一些辅助的命令来获取更多信息了。下面列举了几种Monkey测试中常用的辅助命令,使用方法也非常简单,只要在执行Monkey的同时,另起一个CMD命令行窗口输入对应命令执行即可。
❑ 获取logcat日志信息:
adb shell logcat -v time>log.txt
❑ 获取内存信息:
adb shell dumpsys meminfo <进程名>
❑ 获取CPU消耗信息:
adb shell top -n 1 |find“进程名”
❑ 获取电量信息:
adb shell dumpsys battery
❑ 获取GPU信息:
GPU信息命令:adb shell dumpsys gfxinfo <进程名>
❑ 获取流量信息:
adb shell cat/proc/uid_stat/<被测应用的uid>/tcp_rcv
技巧
如何获取被测应用的UID
步骤1:查看被测应用的进程ID(PID)
adb shell ps | grep <被测应用包名>
步骤2:查看被测应用的用户ID(UID)
adb shell cat /proc/$pid/status

四、Monkey测试策略制定思路             

前面介绍了几种常见的Monkey测试方法,但在实际项目中,选择哪种Monkey测试策略,则需要根据实际项目的情况来做判断。主要是看测试目的及被测应用自身的特点。假如我们想测试浏览器的双指缩放功能是否有异常,那就需要选择--pct-pinchzoom参数,调大双指缩放事件的占比进行Monkey测试;假如我们想验证ROM的横竖屏切换功能是否正常,那就需要选择--pct-rotation参数,调大横竖屏切换事件的占比进行Monkey测试;假如我们想验证重复某种特定操作时,应用是否会存在异常,那可以选择-f参数,自定义Monkey脚本进行验证;假如我们想验证长时间操作时应用是否会存在内存泄漏,那就需要结合-hprof参数和dumpsys meminfo <进程名>进行Monkey测试。
总之,Monkey测试策略是需要依据测试目的和被测程序的特点来制定的。
 
posted @ 2019-05-28 23:18  一加一  阅读(3457)  评论(0编辑  收藏  举报