一、介绍
monkey是Android中的一个命令行工具,运行在模拟器里或实际设备中。通过向系统发送伪随机的用户事件,例如:按键输入、触摸屏输入、手势输入等,实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法,就是利用工具模拟人的触屏和输入等操作,在短时间内对手机APP疯狂的进行大量的疯狂的乱点,乱按,乱输入的操作,疯狂地去“折腾”这个APP。
二、测试流程详解
通过名为 monkey 的Shell脚本去启动Monkey.jar程序,在指定的APP上模拟用户点击,滑动,输入等操作以极快的速度来对设备程序进行压力测试,检测程序是否会发生异常,然后通过日志进行排错。
基本语法如下:
#monkey的基本语法如下:这是对整台机器的测试;
adb shell monkey [options]#针对某个应用的monkey测试, 对淘宝点击500次
adb shell monkey -p com.taobao.taobao 500
常用命令:
adb devices # 查看链接的设备adb shell monkey -p pkgname 对指定包名进行测试
adb shell monkey --throttle milliseconds 指定事件之间的时间间隔,单位是毫秒
adb shell monkey -s seed 伪随机数生成器的seed值,如果用相同的seed值再次运行monkey,将生成相同的事件序列
adb shell monkey -v [-v -v ] 指定日志级别
adb shell monkey --pct-touch 指定触摸事件的百分比
adb shell monkey --pct-motion 指定动作事件的百分比
adb shell monkey --pct-trackball 指定轨迹球事件百分比
adb shell monkey --pct-nav 指定基本导航事件百分比
adb shell monkey --pct-majornav 设定主要导航事件百分比,兼容中间键,返回键,菜单键
adb shell monkey --pct-syskeys 设定系统事件百分比,比如HOME、BACK,拨号及音量调节等。
adb shell monkey --pct-appswitch 设定启动不同应用程序的事件百分比
adb shell monkey --pct-anyevent 设定不常用事件百分比
adb shell monkey --ignore-crashes 忽略奔溃和异常事件
adb shell monkey --ignore-timeouts 忽略超市事件
adb shell monkey --pkg-blacklist-file 设置不需要进行测试的黑名单应用
adb shell monkey --pkg-whitelist-file 设置需要测试的白名单应用;对白名单的应用都进行测试;adb shell logcat>e:\\log.txt 抓取日志
三、结果分析
Monkey测试中主要的异常和错误:
1、Crash:表示被测试应用异常停止或退出。
2、ANR:application no response ;表示在5秒内没有响应输入的事件(例如:按键按下、屏幕触摸等)
3、Error或Exception:表示应用程序在系统运行过程中遇到了未知错误或异常。
4、aborted:表示应用程序没有正常启动或无法正常启动,monkey测试被迫中止。
monkey测试建议:
1、 尽量关闭所有网络开关(WiFi及数据连接),以及莫名消耗流量,除非测试过程必须要求互联网。
2、开启安全设置下的未知来源。
3、手机连接电源充电,模拟器不在此讨论范围。
4、测试前运行一边手机上方带有的首次提示的说明,如输入法,文件窗口,apk提示语等。
5、monkey只是测试过程的辅助手段,不必过分依赖。应该将精力放在更需要人为参与的设计高效用例、设计有效用户场景、性能测试、接口测试、自动化测试等重要工作上。
一般的分析步骤:
1、先找到出现错误的位置
2、查看出现错误之前2个switch之间的activity
3、手动执行事件,复现问题
4、若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey
logcat日志级别
Verbose:显示所有日志消息(默认值)。
Debug:显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。
Info:显示常规使用情况的预期日志消息,以及此列表中较低的消息级别。
Warn:显示尚不是错误的潜在问题,以及此列表中较低的消息级别。
Error:显示已经引发错误的问题,以及此列表中较低的消息级别。
Assert:显示开发者预计绝不会发生的问题。
logcat命令语法:adb logcat [option] [filterspecs]
#打印默认日志数据
adb logcat
#需要打印日志详细时间的简单数据
adb logcat -v time
#需要打印级别为Error的信息
adb logcat *:E
#需要打印时间和级别是Error的信息
adb logcat -v time *:E
四、代码示例
import oscontent=os.system('adb shell monkey -p com.taobao.taobao --throttle 10 -s 12345 200').read()if 'CRASH' in content or 'crashed' in content:print('应用程序运行奔溃!')
elif 'ANR' in content or 'NOT RESPONDING' in content:print('应用程序运行时卡壳!')
elif 'Execption' in content or 'exception' in content or 'error' in content:print('程序运行出错!')
elif 'aborted' in content:print('应用程序未正常运行!')
else:print('正常运行!')