使用 Monkey 进行压力测试
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法
adb shell monkey -p < packagename > -v 500 表示向 指定的应用程序发送 500 个伪随机事件。 adb shell monkey –p com.htc.Weather –v 20000
常见命令组合
1.monkey -p com.package -v 500 :简单的输出测试的信息; 2.monkey -p com.package -v -v -v 500 :以深度为三级输出测试信息; 3.monkey -p com.package --port 端口号 -v :为测试分配一个专用的端口号,不过这个命令只能输出跳转的信息及有错误时输出信息; 4.monkey -p com.package -s 数字 -v 500 :为随机数的事件序列定一个值,若出现问题下次可以重复同样的系列进行排错; 5.monkey -p com.package -v --throttle 3000 500 : 为每一次执行一次有效的事件后休眠3000毫秒;
Monkey参考命令
adb shell monkey -p com.tencent.XXX(替换包名) --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000>d:monkeyScreenLog.log
Monkey参数的约束限制规范:
1.一个 -p 选项只能用于一个包,指定多个包,需要使用多个 -p 选项; 2.-s <seed> 伪随机数生成器的seed值,如果用相同的seed值再次运行monkey,它将生成相同的事件序列,对9个事件分配相同的百分比; Monkey测试1:adb shell monkey -p com.htc.Weather –s 10 100 Monkey测试2:adb shell monkey -p com.htc.Weather –s 10 100 两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列 操作,即一个序列)是一样的。 操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的; 3.-c 用此参数指定一个或多个类别,同样,需要指定多个类别就需要多个-c参数; 常见的类别有 Intent.category.LAUNCHER Intent.category.MONKEY 4.-v 用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示: 日志级别 Level0 示例 adb shellmonkey -p com.htc.Weather –v 100 说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息 日志级别 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信息 4.--hprof 指定了该参数,Monkey会在发送事件序列的前、后,生成性能分析报告。通常会在data/misc目录下生成一个5MB左右大小的文件 5.--ignore-crashes 通常情况下,monkey会在测试应用程序崩溃或者发生异常后停止运行,若指定了该参数,则monkey将会在产生异常后,继续向系统发送事件,直到指定事件全部运行完毕。 6.--ignore-timeouts 通常情况下,当应用程序发生任何超时错误(application not responding)时,monkey将停止运行。 若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定事件全部运行完毕 7.--ignore-security-exceptions 通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。 若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。 eg:adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-security-exceptions 100 8.--throttle 设定两个事件之间一个固定延迟,可以减缓monkey的执行速度。如果不指定,monkey将不会被延迟,事件将尽可能快地生成和发送消息。单位:毫秒
Monkey测试参数建议
间隔时间:500毫秒; 种子数:随机; 遇到错误:不停止; 执行时长:每机型不小于12小时或点击次数:100万次; 机型覆盖建议:覆盖高中低端机型 不同芯片平台(高通、海思、MTK等) 不同分辨率(480*800以上主流分辨率) 不同安卓版本(安卓4.0以上主流安卓版本);
Monkey工具十一个事件
//Monkey工具随机事件类型(seed值) [--pct-touch PERCENT] -0.触摸事件(down-up事件); [--pct-motion PERCENT] -1.动作事件(down-up事件和伪随机事件组成); [--pct-trackball PERCENT] -2.轨迹事件(随机移动、有时伴随点击); [--pct-nav PERCENT] -3.基本导航事件(导航事件来自方向输入设备的up、down、left、right组成); [--pct-majornav PERCENT] -4.主要导航事件(引发图形界面动作,如回退、菜单按键); [--pct-syskeys PERCENT] -5.系统按键事件(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键); [--pct-appswitch PERCENT] -6.调整启动Acticity百分比(在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法,从一个Activity跳转到另一个Activity); [--pct-flip PERCENT] -7.调整键盘翻转事件的百分比 [--pct-anyevent PERCENT] -8.其它类型事件(它包罗了所有其它类型的事件,如:按键、不常用的设备按钮等)
--pct-touch
(空格后加数字)设定触屏事件生成的百分比。触屏事件是一个有手指按下,抬起事件的手势。
eg: adb shell monkey --throttle 3000 --pct-touch 50 -p com.tencent.news 1000
向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定触屏的事件占比为50%。
--pct-motion
设定滑动事件生成的百分比。滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手指的手势。
eg: adb shell monkey --throttle 3000 --pct-motion 50 -p com.tencent.news 1000
向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定滑动的事件占比为50%。
--pct-trackball
设定轨迹球事件生成的百分比。轨迹球事件是包含一系列随机移动和单击事件的事件
eg:adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news 100
向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定轨迹球的事件占比为50%。
--pct-nav
设定基本导航事件生成的百分比。基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件。
eg:adb shell monkey --throttle 3000 --pct-nav 40 -p com.tencent.news 100
向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定基本导航事件的占比为40%。
--pct-majornav
设定主要导航事件生成的百分比。主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等、
eg: adb shell monkey --throttle 3000 --pct-majornav 40 -p com.tencent.news 100
向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定主要导航事件的占比为40%。
--pct-pinchzoom
--pct-rotation
屏幕旋转事件:--pct-rotation <percent>,指定屏幕旋转事件百分比。我们可以模拟手机的横竖屏切换,degree指的是旋转方向,顺时针旋转,0表示旋转90°,1表示旋转180°,2表示旋转270°,3表示旋转360°。例如adb shell monkey -p com.dsl.newwiki -v --pct-rotation 50 100
--pct-syskeys
--pct-appswitch
--pct-flip
--pct-anyevent
其他类型事件:--pct-anyevent <percent>,指定其他类型事件百分比。其他类型事件指的是除了上述事件之外的其他事件,比如其它不常用的设备按钮等。
一般情况下,我们不用修改上述事件的百分比。如果APP操作触摸事件和滑动事件比较频繁,我们可以提高这两种事件的百分比,但是总量加起来不能大于100。例如adb shell monkey -p com.dsl.newwiki -v --pct-touch 40 --pct-motion 40 100
调试:--dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不 会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运 行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
--kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系 统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之 后,简单地保持在最后的状态。
--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error, 系统将停止运行。
--wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。
测试可以发现的问题
Android平台应用程序可能产生以下四种Crash:
App层(JAVA应用程序):
1、Force Close Crash :强制关闭,强制退出 2、ANR Crash :程序无响应 3、Native层(本地框架):Tombstone Crash(Native Crash) :闪退问题 4、Kernel层(LINUX内核空间):Kernel Panic:内核崩溃
Monkey的日志分析
1、按关键字进行搜索,ANR、Exception、Crash、Error。 2、找到有问题的地方,查看上下文信息。 3、注意第一个switch上下文信息。 4、查看monkey里面出错前的一些事件动作,可以手动执行该动作。 5、进行问题复现,可以使用之前执行的monkey命令在执行一遍,注意seed值要一样。
【测试结果分析】
(1)、ANR问题(程序无响应):在日志中搜索“ANR"(application no response) (2)、闪退问题:在日志中搜索"crash" (3)、异常:搜索"exception" (4)、强制退出:搜索"force closed"
Crash专项
1、安装可以引起Crash的App 2、执行压力命令 3、析取Crash的Exception信息 案例: 执行压力测试,并且生成monkey_test.log日志文件。 #adb shell monkey -p cn.besttest.crashtest -v 100 >E:monkeymonkey_test.log #查看E盘文件夹下已经生成了monkey_test.log。
ANR专项
步骤同上 1、安装可以引起ANR的App 2、执行压力命令 3、析取ANR的Exception信息 4、查看monkey的log 5、/data/anr/traces.txt 6、查看logcat日志 ANR
Monkey日志定位问题
1 .典型Monkey测试日志文件输出,如下:
//主要Log文件说明
anr目录:从手机/data/anr导出的日志,保存发生anr crash 时的相关信息; dontpanic目录:从手机/data/dontpanic/导出的日志,保存发生Kernel Panic时的相关信息; Tombstone目录:从手机/data/tombstones/导出的日志,保存发生Tombstone Crash时的错误信息; dropbox目录:从手机/data/tombstones/导出的日志,经过dropbox服务截取的部分tombstones错误信息; BugReportLog.log:通过adb shell bugreport命令提取的系统各种信息; MonkeyScreenLog.Log:保存Monkey测试过程、应用层错误信息,发生Native Crash时,在此文件也会有记录;
2 .通过日志定位问题步骤
(1) 在MonkeyScreen.Log日志文件搜索关键词"Fatal"、"Crash"、"ANR"定位到发生Crash的详细堆栈信息,或分析发生Crash前后的日志事件;
(2)检查dropbox目录下是否有相关crash日志信息,主要关注是否有以下4类crash错误信息:data_app_wtf,data_app_anr,data_app_crash,system_server_watchdog,如图:
(3) 检查tombstone目录是否有生成日志,有的话说明发生过native crash,如图:
(4)通过anr目录中的日志文件或BugReport.log日志文件,进一步分析问题原因;
(5)通过上述日志信息,结合代码分析或通过搜索引擎寻找对应问题的可能错误,定位解决问题。
如有ANR
还需要将 data/anr
下的trace
文件pull
出来辅助分析ANR
原因。
导出ANR
文件的命令如下:
adb pull data/anr .
停止monkey测试的方法
1.查看monkey进程,然后kill掉
查看手机monkey
进程的命令adb shell ps |findstr monkey
, 通过稍等进程 id( adb shell kill -9 18333(monkey进程ID)
),实现停止monkey
测试,适用于debug版本。
C:UsersAdministrator>adb shell ps |findstr monkey shell 18333 273 1627720 34672 binder_thr 759b3b8884 S com.android.commands.monkey C:UsersAdministrator>adb shell kill -9 18333
2.重启手机
此种方案简单暴力,原理也是杀掉monkey 进程,适用于user版本