1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,母版标题样式,Android,压力测试,Monkey,准备,Monkey,测试环境,Monkey,基本参数及用法,Monkey,测试实例,结果分析,准备,Monkey,测试环境,1,)下载,SDKforWindows,下载地址:,Manager.exe,,如果域名转向设置正确,将看到管理器的更新列表,“,Status,(状态)”列下显示“,Installed”,的项表明数据已安装,显示“,Not Uninstalled”,的项表明数据没有安装。全部更新列表中的数据会因数据太大导致下载很长时间,本例只选择,Android SDK Pl
2、atform-tools,和,Android 4.1(API 16),两项数据,如图所示,安装完成后,,AVD,管理器窗口,单击“,New,(新建)”按钮,弹出创建,AVD,对话框,详细配置如图,,AVD,创建完成后,回到,AVD,管理器界面,选中刚刚创建好的,AVD,,单击,Start,启动,AVD,5,)在虚拟机中使用,MonkeyTest,1.,打开虚拟机,运行以上创建的,AVD,2.,开始运行,输入,cmd,3.,在命令行录入,adbshell,4.,接下来可以运行,MonkeyTest,的命令,如:,monkeypcom.android.contactsv1000,Monkey,使用
3、1.Monkey,测试简介,Monkey,是,Android,中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,(,如按键输入、触摸屏输入、手势输入等,),,实现对正在开发的应用程序进行压力测试。,Monkey,测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。,2.Monkey,特征,1,、测试的对象仅为应用程序包,有一定的局限性。,2,、,Monky,测试使用的事件流数据流是随机的,不能进行自定义。,3,、可对,MonkeyTest,的对象,事件数量,类型,频率等进行设置。,3.Monkey,基本用法,可以通过开发机器上的命令行或脚本来启动,Mon
4、key,。由于,Monkey,运行在模拟 器,/,设备环境中,所以必须用其环境中的,shell,来进行启动。可以通过在每条命令前加上,adb shell,来达到目的,也可以进入,Shell,后直接输入,Monkey,命令。基本语 法如下:,$adb shell,monkey,options,如果不指定,options,,,Monkey,将以无反馈模式启动,并把事件任意发送到安 装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送,500,个伪随机事件:,$adb shell,monkey,-p your.package.name-v 500,4.Monkey
5、参数,1),参数:,-p,参数,-p,用于约束限制,用此参数指定一个或多个包(,Package,,即,App,)。,指定包之后,,Monkey,将只允许系统启动指定的,APP,。如果不指定包,,Monkey,将允许系统启动设备中的所有,APP,。,*指定一个包:,adb shell monkey-p com.htc.Weather 100,说明:,com.htc.Weather,为包名,,100,是事件计数(即让,Monkey,程序模拟,100,次随机用户事件)。,*指定多个包:,adb shell monkey-p com.htc.Weather p com.htc.pdfreader -
6、p com.htc.photo.widgets 100,*,不指定包:,adb shell monkey 100,说明:,Monkey,随机启动,APP,并发送,100,个随机事件。,*要查看设备中所有的包,在,CMD,窗口中执行以下命令:,adb shell,#cd data/data,#ls,2),参数,:-v,用于指定反馈信息级别(信息级别就是日志的详细程度),总共分,3,个级别,分别对应的参数如下表所示:,日志级别,Level 0,示例,adb shell monkey-p com.htc.Weather v 100,说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息,日志级别
7、Level 1,示例,adb shell monkey-p com.htc.Weather v-v 100,说明 提供较为详细的日志,包括每个发送到,Activity,的事件信息,日志级别,Level 2,示例,adb shell monkey-p com.htc.Weather v-v v 100,说明 最详细的日志,包括了测试中选中,/,未选中的,Activity,信息,3),参数:,-s,用于指定伪随机数生成器的,seed,值,如果,seed,相同,则两次,Monkey,测试所产生的事件序列也相同的。,*示例:,Monkey,测试,1,:,adb shell monkey-p com.
8、htc.Weather s 10 100,Monkey,测试,2,:,adb shell monkey-p com.htc.Weather s 10 100,两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的,Seed,值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;,4),参数:,-throttle,用于指定用户操作(即事件)间的时延,单位是毫秒;,*示例:,adb shell monkey-p com.htc.Weather throttle
9、3000 100,5),参数:,-ignore-crashes,用于指定当应用程序崩溃时(,Force&Close,错误),,Monkey,是否停止运行。如果使用此参数,即使应用程序崩溃,,Monkey,依然会发送事件,直到事件计数完成。,*示例,1,:,adb shell monkey-p com.htc.Weather-ignore-crashes 1000,测试过程中即使,Weather,程序崩溃,,Monkey,依然会继续发送事件直到事件数目达到,1000,为止;,*示例,2,:,adb shell monkey-p com.htc.Weather 1000,测试过程中,如果,Weat
10、her,程序崩溃,,Monkey,将会停止运行。,5.,举例,1,、不忽略异常,adb shell monkey-p com.thunderst.radio-throttle 500-s 600-v-v-v 800000 C:long_radio_report.txt,指令的含义:测试的应用程序为,FM,,事件间的延时为,500,毫秒,种子,seed,的值为,600,,三个,v,表示输出的,MonkeyLog,的级别为最高,即输出最详尽的,Monkey Log,,测试的事件次数为,800000,次,,Log,保存在,C,盘的,long_radio_report.txt,里,2,、忽略异常,ad
11、b shell monkey-p com.thunderst.radio-throttle 500-s 600-ignore-crashes-ignore-timeouts-ignore-security-exceptions-ignore-native-crashes-monitor-native-crashes-v-v-v 800000 C:long_radio_report.txt,6.Monkey,测试的停止条件,(,1,)如果先顶了,Monkey,运行在一个或几个特定的包上,那么它会检测试图转到它包的操作,并对其进行阻止;,(,2,)如果应用程序崩溃或接收到任何失控异常,,Monke
12、y,将停止并报错;,(,3,)如果应用程序产生了应用程序不响应(,application not responding,)的错误,,Monkey,将会停止并报错。,Monkey,测试实例,(1),首先,先准备了一个测试用的应用程序(,apk,文件)。为了测试,这里选择了一个格瓦拉手机购票,App,进行测试。下载地址为:,sdk,对应,platform-tools,的目录下。例如,笔者的,sdk,路径为,D:androidandroid-sdk-windowsplatform-tools,(3),进行,apk,文件的安装(安装的前提是,已经启动并可以检测模拟器):有安装,91,助手或者豌豆的用户
13、可以直接双击,apk,文件进行安装;也可以使用,android,下的,adb,命令进行安装(如下图所示,,Success,表示安装成功)。,adb,命令下安装,apk,文件的命令为:,adb install,文件名,.apk,(4),安装好后,会在模拟器上看到应用程序的启动图标,(5),安装好,apk,文件后,需要知道应用程序主,Activity,(,第一个启动的,Activity,),所在的包名。这时,我们可以使用,adbshell,命令查找到程序主,Activity,所在的包名,如下图所示。(知道了,apk,的包名,我们也可以利用,adb,命令进行应用程序的卸载;卸载,apk,文件的命令为
14、adbuninstall,包名),(6),使用,moneky,命令进行自动化压力测试。命令为:,#monkey-p com.gewara-v 1000,(参数说明:,-p,后跟着软件所在包名,,-v,后跟测试的次数)。这里对该软件进行,1000,次的自动化测试,几分钟内即可以完成测试。如图所示,结果分析,1.,初步分析,Monkey,测试出现错误后,一般的差错步骤为以下几步:,1,、找到是,monkey,里面的哪个地方出错,2,、查看,Monkey,里面出错前的一些事件动作,并手动执行该动作,3,、若以上步骤还不能找出,可以使用之前执行的,monkey,命令再执行一遍,注意,seed,值要
15、一样,2.,一般结果分析,1,、,ANR,问题:在日志中搜索“,ANR”,2,、崩溃问题:在日志中搜索“,Exception”,3.,详细分析日志,1,)将执行,Monkey,生成的,log,,从手机中导出并打开查看该,log,;在,log,的最开始都会显示,Monkey,执行的,seed,值、执行次数和测试的包名。,2,)首先我们需要查看,Monkey,测试中是否出现了,ANR,或者异常,具体方法如上述。,3,)然后我们要分析,log,中的具体信息,方法如下:,查看,log,中第一个,Switch,,主要是查看,Monkey,执行的是那一个,Activity,,譬如下面的,log,中,执行的
16、是,com.tencent.smtt.SplashActivity,,在下一个,swtich,之间的,如果出现了崩溃或其他异常,可以在该,Activity,中查找问题的所在。,:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0 x10000000;component=com.tencent.smtt/.SplashActivity;end/Allowing start of Intent act=android.intent.actio
17、n.MAIN cat=android.intent.category.LAUNCHERcmp=com.tencent.smtt/.SplashActivity in package com.tencent.smtt,在下面的,log,中,,Sending Pointer ACTION_DOWN,和,Sending Pointer ACTION_UP,代表当前执行了一个单击的操作,Sleeping for 500 milliseconds,这句,log,是执行,Monkey,测试时,,throttle,设定的间隔时间,每出现一次,就代表一个事件。,SendKey(ACTION_DOWN)/KEY
18、CODE_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
19、milliseconds,:Sending Pointer ACTION_MOVE x=-2.0 y=3.0,:Sending Pointer ACTION_MOVE x=4.0 y=-3.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,谢谢观赏!,






