Monkey——轻松带你上手安卓压力测试

生活真是不可预料,四月这个欲夏还春的季节,我的生活又搅起了一池涟漪。

今天谈谈Monkey:

Monkeytest也有人叫做 搞怪测试。就是用一些稀奇古怪的操作方式去测试被测试系统,以测试系统的稳定性。

Monkey测试是Android自动化测试的一种手段,Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常。
当Monkey程序在模拟器或设备运行的时候,如果用户触发了比如点击,触摸,手势或一些系统级别的事件的时候,它就会产生随机脉冲,所以可以用Monkey用随机重复的方法去负荷测试你开发的软件.


谈到Monkey,必须介绍一下ADB:

ADB是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备. 它的主要功能有:
* 运行设备的shell(命令行)
* 管理模拟器或设备的端口映射
* 计算机和设备之间上传/下载文件
* 将本地apk软件安装至模拟器或android设备
* ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备.


如何让ADB帮助我们工作呢?
只要在各操作系统的控制台(Windows 是 cmd, Mac OS 是Terminal ,Linux不用说了)执行相应的命令即可。

当然,在Android Studio 中的Terminal直接执行也是可以的。只要进行简单的配置:(Windows举例)

Monkey——轻松带你上手安卓压力测试_第1张图片

之后,在控制台输入 : adb version

Monkey——轻松带你上手安卓压力测试_第2张图片

如果能输出ADB的 版本号。就大功告成了。


以下是干货阶段:

adb 的常用命令:

adb devices 获取所有连接ADB的模拟器或者真机
adb install c:/xxx.apk 安装自己的apk到设备上
adb uninstall apk包名 从设备上卸载apk
adb -s emulator-5556 uninstall apk包名 指定某设备卸载apk
adb start-server 重启adb
adb kill-server 杀死adb
adb shell pm list packages 获取所有应用的包名


monkey的常用命令:

adb shell monkey –help (获取帮助命令)
adb shell monkey 1000 (随机执行1000个模拟事件)
adb shell monkey -p xxxx 1000 (指定某个应用随机执行1000个模拟事件,xxx填应用包名)
adb shell monkey (参数) 100 (带参数执行100个模拟事件)


关于各种命令,就不多说了,小伙伴们多敲就熟悉了。

这里主要讲讲monkey命令的各个参数

-v 参数
adb shell monkey -v 1000
adb shell monkey -v -v 1000
adb shell monkey -v -v -v 1000

用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
日志级别 Level 0
说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息

日志级别 Level 1
说明 提供较为详细的日志,包括每个发送到Activity的事件信息

日志级别 Level 2
说明 最详细的日志,包括了测试中选中/未选中的Activity信息

-s 参数
adb shell monkey -s xxx 1000

用于指定伪随机数生成器的seed值(int型),如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
这个参数在复现错误的时候非常好用

-p 参数
adb shell monkey -p com.xxx.xxx 1000
adb shell monkey -p com.xxx.xxx -p com.xxx.xxx 1000

用于指定产生随机事件的应用,如果想多个应用同时测试,就传多个-p 参数


这里是分割线,注意,以上参数是带一个”-“的,以下参数将是带两个”-“的


–throttle 参数
adb shell monkey –throttle 500 1000

用于指定用户操作(即事件)间的时延,单位是毫秒;这里我指定执行1000个事件,间隔是500毫秒.

–ignore-crashes 参数
adb shell monkey –ignore-crashes 1000

用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。

–ignore-timeouts 参数
adb shell monkey –ignore-timeouts 1000

用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。

–ignore-security-exceptions 参数
adb shell monkey –ignore-exceptions 1000

用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。


重中之重点来了


–pct-{事件类别} {事件类别百分比}
adb shell monkey –pct-touch 50 1000 示例

该参数用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)
本示例的含义是,指定monkey执行1000次随机事件,其中touch事件 占 总事件数的 比例为 50%

拿图说事:

第一次执行
adb shell monkey 1000
结果如下图:

Monkey——轻松带你上手安卓压力测试_第3张图片

第二次执行
adb shell monkey –pct-touch 50 1000
结果如下图:

Monkey——轻松带你上手安卓压力测试_第4张图片

这里我们看 Event percentages: 下的第一行

第一张图
0: 15.0%

第二张图
0: 50.0%

这里的0是指 touch事件, 第一次没有指定比例时,是随机的,第二次指定后,就固定是50%了。

重复执行第二次的命令。会发现,序号为0的事件是不变的,而序号为1~11的其他事件,则会随机变化


最后来说说这0~11大致是什么事件吧:

目前我所知如下:

0
–pct-touch
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置),即点按

1
–pct-motion
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成),即滑动

2
–pct-trackball
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)

3
–pct-nav
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)

4
–pct-majornav
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)

5
–pct-syskeys
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)

6
–pct-appswitch
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法

7
–pct-flip
调整“键盘翻转”事件的百分比。

8
–pct-anyevent
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等

此处可能有谬误,欢迎指正


大致梳理了monkey的要点,更深刻的研究争取下次有机会写

这里,我们不妨看看monkey的实战

相信小伙伴们都有过应用上架审核被拒的经历,以下是某次小米应用商店被拒后的反馈

Monkey——轻松带你上手安卓压力测试_第5张图片

我们重点来看中间的这段monkey命令:

adb shell monkey -v –throttle 300 –pct-touch 30 –pct-motion 20 –pct-nav 20 –pct-majornav 15 –pct-appswitch 5 –pct-anyevent 5 –pct-trackball 0 –pct-syskeys 0 -p ‘%s’ 1000

首先 -v参数,指定了输出详情的等级,-throttle 300,指定了事件间隔时间300毫秒,
其次–pct-xx xx 参数
–pct-touch 30 指定了 事件总量的百分之30是touch事件 ,以及后面连串的 –pct-xx xx 参数 ,翻译过来就是,点击事件30%,滑动事件20%,导航 20% , 主导航15%, 切换activity事件 5% 其他事件5%,轨迹球事件0%,系统按键0%.
算一下。 30 + 20 + 20 + 15 + 5 + 5 + 0 +0 = 95
即指定的总事件占比95%,还剩5%事件就是随机分配给未指定的剩余事件。
最后 -p ‘%s’ 1000 ,-p参数是指定应用,那推测过去 ‘%s’就是占位变量,对应的就是提交给小米的应用包名。最后的1000就是说,总事件数1000

小米的压力测试大概是遵循这个事件比例去执行,至于到底执行了多少次,就不重要了,我们只需要照着这个命令,在自己的模拟器或者手机上多跑一跑这1000个随机事件,复现出FC/ANR等结果,通过日志就可以着手解决问题了。

文末,最后强调。因为Markdown的排版,文中我没能很好的区别出 一个”-“和两个 “–”,各位小伙伴执行命令的时候切记看清上文所说的参数区别

有机会,再来写日志分析部分吧。估计接下来的几个月,都无比忙碌。

你可能感兴趣的:(安卓开发,案例整理)