APP压力稳定性测试之Monkey入门

1.什么是monkey?

Monkey是一个命令行工具,使用安卓调试桥(adb)来运行它,模拟用户触摸屏幕、滑动Trackball、按键等随机事件流来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,可以根据获取的log信息进行修复。
2.Monkey 查看包名:
https://blog.csdn.net/weixin_39870031/article/details/82840466

3.Monkey的常见命令

-help 查看monkey用法

命令格式:adb shell monkey [限制命令 参数值][事件名 百分比] 事件次数

-p <允许的包名列表>:用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果不指定包, monkey将允许系统启动设备中的所有app。

指定一个包:adb shell monkey -p com.shjt.map 100

指定多个包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100

-v:用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:

Level 0 : adb shell monkey -p com.shjt.map -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息

Level 1 : adb shell monkey -p com.shjt.map -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息

Level 2 : adb shell monkey -p com.shjt.map -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息

-s(随机数种子) :用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。示例:

monkey测试1:adb shell monkey -p com.shjt.map –s 10 100

monkey测试2:adb shell monkey -p com.shjt.map –s 10 100

–throttle <毫秒> 用于指定用户操作(即事件)间的时延,单位是毫秒;在事件之间插入固定的时间(毫秒)延迟,你可以使用这个设置来减缓Monkey的运行速度,如果你不指定这个参数,则事件之间将没有延迟,事件将以最快的速度生成。注:常用参数,一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒。 示例:

adb shell monkey -p com.shjt.map --throttle 300 -v 10

–randomize-throttle 用这个参数必须与–throttle 绑定使用。用于在事件之间插入随机延迟,随机延迟范围为0到throttle设置的时间,单位为毫秒;

例:adb shell monkey -p com.tencent.edu --throttle 500 --randomize-throttle 100

–pkg-whitelist-file 白名单,后面接txt文件,指定白名单参数后只测试白名单的应用程序

–pkg-blacklist-file 黑名单,后面接txt文件,指定黑名单参数后,避开黑名单的应用程序

例:adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 100
注:黑白名单命令不能同时使用

Monkey百分比事件

0:点击事件百分比,即参数–pct-touch
1:滑动事件百分比,即参数–pct-motion
2:缩放事件百分比,即参数–pct-pinchzoom
3:轨迹球事件百分比,即参数–pct-trackball
4:屏幕旋转事件百分比,即参数–pct-rotation
5:基本导航事件百分比,即参数–pct-nav
6:主要导航事件百分比,即参数–pct-majornav
7:系统按键事件百分比,即参数–pct-syskeys
8:Activity启动事件百分比,即参数–pct-appswitch
9:键盘唤出隐藏事件百分比,即参数–pct-flip
10:其他事件百分比,即参数–pct-anyevent

–pct-touch 作用:调整触摸事件的百分比。(触摸事件是指在屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作)注:常用参数,此参数设置要适应当前被测应用程序的操作,比如一个应用80%的操作都是触摸,那就可以将此参数的百分比设置成相应较高的百分比。

例:adb shell monkey --pct-touch 100 -v 10

–pct-motion 作用:调整motion事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成)注:常用参数,需注意的是移动事件是直线滑动,下面的trackball移动包含曲线移动。

例:adb shell monkey --pct-motion 100 -v 10

–ignore-crashes作用:通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
Monkey 实例:用monkey 命令 对上海公交 app进行 性能测试

adb shell monkey –p com.shjt.map –-throttle 100 –-pct-touch 50 –-pct-motion 50 –v –v 1000 >c:\monkey.txt

4.MonkeyScript

MonkeyScript是monkey的脚本语言,是一组可以被Monkey识别的命令集合,可以帮我们完成一系列的被固定的重复性操作。

脚本优势:简单、快捷、不需要借助任何工具,只是运行一个脚本文件

脚本缺点:只能简单实现坐标、按键等基本操作(根据像素点来进行操作)

<脚本格式>
#头文件、控制monkey发送消息的参数
type=raw events
count=10
speed=1.0
#以下为monkey命令
start data >>
LaunchActivity(pkg_name,activity)
DispatchPress(KEYCODE_ENTER)
DispatchPress(KEYCODE_HOME)
---->前三行是脚本头。count为脚本中包含的指令数目。speed为执行速度。
---->start data >>后面是执行的命令。

<常见API>
LaunchActivity(pkg_name, cl_name): 启动应用的Activity。参数:包名和启动的Activity。
Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
DispatchPress(keyName): 按键。注:keyName值可以百度android keycode列表获取
RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。
DispatchFlip(true/false): 打开或者关闭软键盘。
LongPress(): 长按2秒。
PressAndHold(x, y, pressDuration): 模拟长按事件。
DispatchString(input): 输入字符串。
Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。
UserWait(sleepTime): 休眠一段时间
DeviceWakeUp(): 唤醒屏幕。
ProfileWait: 等待5秒。

---->在android sdk路径-tools下,使用sdk中的工具hierarchyviewer.bat或者uiautomatorviewer.bat,获取API方法中控件位置(X,Y轴的坐标)。
APP压力稳定性测试之Monkey入门_第1张图片
APP压力稳定性测试之Monkey入门_第2张图片
<脚本举例>
要求:打开浏览器,输入www.***.com, 退出浏览器。这个步骤进行重复压力测试。

---->脚本文件browser.txt编写内容如下:
#头文件、控制monkey发送消息的参数
type=raw events
count=10
speed=1.0
#以下为脚本正文
start data >>
#1.打开浏览器
LaunchActivity(com.android.browser,com.android.browser.BrowserActivity)
ProfileWait()
#2.清空网址
Tap(223,146)
ProfileWait()
DispatchPress(112)
ProfileWait()
#3.输入网址
DispatchString(www.***.com)
ProfileWait()
#4.确认,载入网址
DispatchPress(KEYCODE_ENTER)
ProfileWait()
#5.完成退出浏览器
DispatchPress(KEYCODE_HOME)
ProfileWait()

---->将browser.txt文件push到手机中
adb push D:\browser.txt data/local/tmp
D:\browser.txt 为本地脚本文件路径及名称,data/local/tmp为手机路径

---->运行脚本
adb shell monkey -f data/local/tmp/browser.txt -v -v 200

5、补充小知识:

1>如何安装apk?
adb install xxx.apk -----为了获取apk的安装包所在地址,可以直接把apk拖到cmd的窗口获取,返回success就说明安装成功了!

2>如何将本地文件上传到手机端?
adb push <本机路径> <手机路径>
例,将本地的白名单上传到手机端,adb push F:\whitelist.txt data/local/tmp

3>如何将日志保存到PC端?
adb shell monkey -v -v -v 1000 > 本机地址
例:adb shell monkey -v -v -v 1000 > d:\monkey.txt

4>日志查看补充

正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成
异常情况,Monkey 测试出现错误后,一般的分析步骤,看Monkey的日志 (注意第一个swith以及异常信息等)
---->先把日志输出到本地
---->注意观察switch后面的内容,一般错误都会显示在这个后面
---->程序无响应问题:日志中搜索ANR关键字
---->奔溃问题:在日志中搜索Exception问题 (如果出现空指针, NullPointerException) 肯定是有bug,Monkey 执行中断, 在log最后也能看到当前执行次数

必须重视Crash

虽然Monkey测试有部分缺陷,我们无法准确地得知重现步骤, Monkey测试所出现的NullPointException, 都是可以在用户使用时出现的, 何时出现只是时间问题

理论上来说, Monkey所有的Crash 都需要在发布前修复掉

你可能感兴趣的:(app自动化)