monkey测试小结

什么是monkey?

monkey是Google提供的一个用于稳定性与压力测试的命令行工具

想要测试app的稳定性,monkey是一个不错的选择

准备:搭建monkey环境

1.安装jdk,并将环境配到环境变量中,在cmd下输入Java和javac能显示如下界面。

monkey测试小结_第1张图片

monkey测试小结_第2张图片

2.下载安装和配置adb,参考http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html

配置完成后在cmd输入adb,展示如下界面

monkey测试小结_第3张图片

3.在cmd输入adb shell monkey -help能展示出如下图

monkey测试小结_第4张图片

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的所在地址)

 monkey测试小结_第5张图片


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测试小结_第6张图片

然后找到包名

monkey测试小结_第7张图片

包名找到了,下一步:最简单的monkey命令如图:

如果还在shell里面,直接输入monkey -p your.package.name -v 100

monkey测试小结_第8张图片

如果已经退出了 shell,那么输入 adb shell monkey -p your.package.name -v 100

monkey测试小结_第9张图片

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.调试选项的参数通常有:

--dbg-no-events:初始化启动的activity,但是不产生任何事件。
--hprof:指定该项后在事件序列发送前后会立即生成分析报告
--ignore-crashes:忽略崩溃
--ignore-timeouts:忽略超时
--ignore-security-exceptions:忽略安全异常
--kill-process-after-error:发生错误后直接杀掉进程
--monitor-native-crashes:跟踪本地方法的崩溃问题
工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。monkey 测试命令如下:
adb shell monkey -p com.swartz.cicada -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\monkey_log\20170831.txt
上面这段命令的解释为:
monkey作用的包:com.swartz.cicada
产生时间序列的种子值:500
忽略程序崩溃 、 忽略超时 、 监视本地程序崩溃 、 详细信息级别为2 , 产生 10000个事件
分析monkey报告

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


笔记大概就整理了这么多,有错误之处望评论指出






你可能感兴趣的:(Monkey)