什么是monkey?
monkey是Google提供的一个用于稳定性与压力测试的命令行工具
想要测试app的稳定性,monkey是一个不错的选择
准备:搭建monkey环境
1.安装jdk,并将环境配到环境变量中,在cmd下输入Java和javac能显示如下界面。
2.下载安装和配置adb,参考http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html
配置完成后在cmd输入adb,展示如下界面
3.在cmd输入adb shell monkey -help能展示出如下图
monkey测试的意义:参考百度
monkey基本语法:adb shell monkey -p your.pakege.name -v 500
在这里可能会不知道apk包名,那么请看下面例子:
adb安装app:adb install -r apk
其中参数-r为覆盖安装
查看包名(两种方式)
1.知道自己的测试包地址:aapt dump badging youapp.apk如下图所示(前提是你得把aapt.exe添加到环境变量中,否则就要在该命令前应该加上aapt.exe的所在地址)
2.不知测试包,
2.1查看手机上所有的包名:adb shell pm list packages如下图:
然后找到你准备测的包名
2.1.获得了root权限的手机,第二种查看方式:adb shell-->su-->cd data/data-->ls如图:
这里adb shell进去后,发现是$符号,说明没有root,输入su进入root下,然后符号是#代表已经root后才能cd data/data
然后找到包名
包名找到了,下一步:最简单的monkey命令如图:
如果还在shell里面,直接输入monkey -p your.package.name -v 100
如果已经退出了 shell,那么输入 adb shell monkey -p your.package.name -v 100
monkey参数常用介绍:
上面说过,monkey基本语法为adb shell monkey[option]
首先,这个option如果不指定,那么monkey将以无反馈模式启动,并且把该事件发送到安装在目标环境上的任意包中,而adb shell monkey -p your.package.name -v 500 > E:\monkey_logs\20170831.txt是一个更为典型的命令行示例,它将会启动指定程序,并向其发送500个伪随机事件,并且会依次把事件写入到指定路径下
那么这个option通常又分为4大类:常用选项,事件选项,约束选项,调试选项
1.常用选项的参数通常有:
-v 用于反馈信息级别(一个-v表示一个层级,两个-v表示两个层级,通常最多三个-v)
示例Level0:
adb shell monkey -p com.swartz.cicada –v 100
说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息 相应源代码如图所示了,这十分有利于调试了
示例Level1:
adb shell monkey -p com.swartz.cicada -v-v 100
说明
提供较为详细的日志,包括每个发送到Activity的事件信息
示例Level2:
adb shell monkey -p com.swartz.cicada -v-v-v 100
说明
最详细的日志,包括了测试中选中/未选中的Activity信息
2.时间选项的参数通常有:
-s 表示伪随机数生成的seed值,如果seed值相同,则两次monkey所产生的事件序列也是一样的
示例:
Monkey测试1:adb shell monkey -p com.swartz.cicada –s 10 100
Monkey 测试2:adb shell monkey -p com.swartz.cicada –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
--throttle:每个事件结束后的间隔时间
3.约束选项的参数通常有:
-p 指定文件名
count 指定要发送的事件数
-c 用此参数指定一个或几个类别,activity必须指定一个category,才能被启动,否则将会启动不了
4.调试选项的参数通常有:
1. 初步分析方法:
Monkey: seed=20 count=100 --随机种子和运行次数
:AllowPackage: com.swartz.cicada --指定的测试包
:IncludeCategory: android.intent.category.LAUNCHER --Category包含LAUNCHER
:IncludeCategory: android.intent.category.MONKEY --Category包含MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// + Using main activity com.swartz.cicada.LauncherActivity (from package com.swartz.cicada)
// Selecting main activities from category android.intent.category.MONKEY --查询结果列表
// Seeded: 20 --随机种子
// Event percentages:
// 0: 15.0% --事件0 为touch事件,就是相当于按下之后弹起来的一个动作
// 1: 10.0% --事件1 为motion,相当于说从起始点到终点有移动了多少步,就是步骤数量
// 2: 2.0% --事件2 为pinchzoom,为两个手指有同时按下去后,都向中间移动后up起来,相当于一个缩放的动作。
// 3: 15.0% --事件3 为trackball,为轨迹球事件
// 4: -0.0% --事件4 为rotation 为屏幕旋转百分比隐藏事件
// 5: 25.0% --事件5 为nav导航事件,就是上下左右
// 6: 15.0% --事件6 为majornav主导航事件,会产生一些窗口的事件
// 7: 2.0% --事件7 为系统按键
// 8: 2.0% --事件8,app应用的打开就是用的这个事件
// 9: 1.0% --事件9,键盘的开,关
// 10: 13.0% --事件10,按键按下在弹起等动作
Monkey测试出现错误后,一般的差错步骤为以下几步:
·找到是monkey里面的哪个地方出错
·查看monkey里面出错前的一些事件动作,并手动执行该动作
·若以上步骤还不能找出,可以使用之前执行的monkey命令在执行一遍,注意seed的值要一样
一般的测试结果分析:
·ANR问题:在日志中搜索“ANR”
(什么是ANR:Application Not Responding,即应用无响应,具体有关ANR的知识详见:)
http://www.tuicool.com/articles/IfQvY3
·崩溃问题:在日志中搜索“Exception”或是crash
2.详细分析monkey日志:
将执行monkey生成的log,从手机中导出并打开查看该log;在log的最开始都会显示monkey执行的seed值,执行次数和测试的包名。
首先我们需要查看Monkey测试中是否出现了ANR或者异常,具体方法如上述。
然后我们要分析log中的具体信息,方法如下:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表当前执行了一个单击的操作;
Sleeping for 0 milliseconds这句log是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。
SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表当前执行了一个点击下导航键的操作;
Sending Pointer ACTION_MOVE 代表当前执行了一个滑动界面的操作。
:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_UP x=47.0 y=438.0
Sleeping for 500 milliseconds
:SendKey (ACTION_DOWN): 20 //KEYCODE_DPAD_DOWN
:SendKey (ACTION_UP): 20 //KEYCODE_DPAD_DOWN
Sleeping for 500 milliseconds
:Sending Pointer ACTION_MOVE x=-2.0 y=3.0
:Sending Pointer ACTION_MOVE x=4.0 y=-3.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-3.0
:Sending Pointer ACTION_MOVE x=3.0 y=4.0
:Sending Pointer ACTION_MOVE x=-4.0 y=1.0
:Sending Pointer ACTION_MOVE x=-1.0 y=-1.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;// Monkey finished代表执行完成。Monkey执行中断,在log的最后也能查看到当前已执行的次数。Monkey执行完成的log具体如下:
Events injected: 6000
:Dropped: keys=0 pointers=9 trackballs=0 flips=0
## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)
// Monkey finished