JDK + SDK
1【概述】
什么是Monkey?
顾名思义,Monkey就是猴子, Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲
Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上。 Monkey会发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等,实现对正在开发的应用程序进行压力测试, 主要目的就是为了测试app 是否会Crash。
支持android真机测试(如下)、android模拟器测试。
**Monkey测试出crash的bug等级永远为1,版本发布前,Monkey跑出的结果中crash要为0。
业内标准:最终发布版本前,Monkey跑完的总次数不少于25W次,其结果里不允许有nullPointException出现。**
Monkey在哪里?
每台android手机里都有Monkey工具,但是我们是看不到的,因为,Monkey不是一个可视化的工具,例如手机里的微信,这是一个可视化的,能打开,有图形化界面,但是Monkey没有。
手机里如何与Monkey进行通讯?
借助ADB才能与Monkey进行通讯。
什么是ADB?
Android Debug Bridge,安卓调试桥
【环境搭建】jdk+sdk
1、jdk 1.8 ---https://blog.csdn.net/u014166319/article/details/71791287
JAVA_HOME = D:\ProgramFiles\Java\jdk1.8.0_141
Path = ;%JAVA_HOME%\bin
CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
验证:java -version
2、sdk ---http://pan.baidu.com/s/1nt8BcBB
ANDROID_SDK_HOME = D:\ProgramFiles\android-sdk-windows
Path = ;%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools
验证:adb version
2【执行压力测试】:adb shell mokey -p num --x-x
准备工作:
准备:打开开发者选项, 启用USB调试;
检测:查看下电脑能否连接上手机 :adb shell 或adb devices ,然后exit退出
安装:adb install D:\apk\lingdaotong.apk
查包名:先启动,然后adb shell dumpsys window w |findstr \/ |findstr name= (查看所有包名:adb shell pm list packages)
卸载:adb uninstall com.topevery.ldt
重启手机:adb reboot
当有一个模拟器和一个真实的手机连接的时候(如果连接多个设备或多个虚拟机,则可通过 “-s + 编号” 识别)
//进入模拟器 C:\Users\Administrator>adb -e shell,如 adb -e shell monkey -p com.topevery.ldt 1000 --ignore-crashes --ignore-timeouts (模拟器容易crash)
//进入手机 C:\Users\Administrator>adb -d shell,如 adb -d shell monkey -p com.topevery.ldt 1000 --ignore-crashes --ignore-timeouts
不指定包:adb shell monkey 1000 (执行结束 --> ## Network stats: elapsed time=11834ms (0ms mobile, 0ms wifi, 11834ms not connected))--注意随机用户操作事件数1000都会放在最后(所有选项的最后)
指定包:adb shell monkey -p com.topevery.ldt 1000 (正常情况是不出现error,如 Monkey aborted due to error.)
黑白名单(不能同时设置黑名单和白名单)
设置黑名单(不测试的应用):--pkg-blacklist-file PACKAGE_BLACKLIST_FILE
设置白名单(只测试这部分应用):--pkg-whitelist-file PACKAGE_WHITELIST_FILE
设置指令之间的时间间隔:adb shell monkey -p com.topevery.ldt --throttle 1000 1000 ( “--throttle 1000 ” 每个指令之间时间间隔为1000毫秒,即1秒)。---如在事件无法第一时间得到响应时采取等待。
(bug复现方法)重复上次随机操作参数 seed参数:adb shell monkey -p com.topevery.ldt -s xxxx --throttle 1000 1000 (“-s xxxxx ” seed参数为xxxx)
//Monkey最大的特点就是伪随机。之所以加个“伪”字,是因为该随机事件可进行复现。 我们每次执行一组随机事件,系统都会给一个随机的ID,称之为seed。
如:** System appears to have crashed at event 45 of 1000 using seed 1533900947952 ,若想复现该错误,将该组随机事件再次执行一遍,则使用-s+seed+count即可。
即:adb shell monkey -p com.topevery.ldt -s 1533900947952 45--throttle 1000 1000 ( "-s 1533900947952 45" 上次的执行日志:Monkey: seed=1533833917909 count=45)
触摸事件参数百分比设定:adb shell monkey -p com.topevery.ldt --pct-touch 50 1000 (“--pct-touch 50 ” 百分之五十的事件为触摸事件. 动作事件是--pct-motion,共12类,各类随机事件的比例可自定义)。事件指令详见https://blog.csdn.net/daihuimaozideren/article/details/77529345
Monkey所执行的随机事件流中包含11大事件,
(0):触摸事件百分比,即参数--pct-touch ---> 即在某一位置的Down-Up(手指的放下和抬起)。
(1):手势事件百分比,即参数--pct-motion ---> 以Down开始,Up结尾的move动作事件。
(2):缩放事件百分比,即参数--pct-pinchzoom --->
(3):轨迹球事件百分比,即参数--pct-trackball ---> 即单纯的Move。
(4):屏幕旋转事件百分比,即参数--pct-rotation --->
(5):基本导航事件百分比,即参数--pct-nav ---> 即来自于方向输入设备的上下左右操作。
(6):主要导航事件百分比,即参数--pct-majornav ---> 即Navigation Bar的确认,菜单,返回键等。
(7):系统事件百分比,即参数--pct-syskeys ---> 即系统保留按键,如HOME键,BACK键,拨号键,挂断键,音量键等。
(8):activity启动事件百分比,即参数--pct-appswitch ---> 应用activity启动事件。
(9):键盘翻转事件百分比,即参数--pct-flip --->
(10):其他事件百分比,即参数--pct-anyevent ---> 其他未提及事件,可能包含上述其他时间。
忽略崩溃 忽略ANR(Application Not Responding) 即使出现了也会继续跑 (这个一般都会加上的):adb shell monkey -p com.topevery.ldt --ignore-crashes --ignore-timeouts 1000
kill 正在执行的monkey进程:重新打开一个cmd >adb shell
c5pltechn:/ $ ps|grep monkey
shell 5768 17494 1519840 55640 binder_thr a9bbf70c S com.android.commands.monkey
c5pltechn:/ $ kill 5768
3【大而全】
: adb shell monkey -p com.xxx --throttle 1000 --pct-touch 25 --pct-motion 20 --pct-pinchzoom 5 --pct-trackball 5 --pct-rotation 5 --pct-nav 10 --pct-majornav 10 --pct-syskeys 10 --pct-appswitch 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --monitor-native-crashes -v -v -v 10000 >D:\apk\monkeyLog.txt
(>D:\apk\monkeyLog.txt terminal显示的执行结果存放在该文件中)
--ignore-crashes 忽略程序崩溃。设置此选项后,Monkey会执行完所有的事件,不会因crash而停止。
--ignore-timeouts 忽略程序无响应。设置此选项后,Monkey会执行完所有的事件,不会因ANR而停止。
--ignore-security-exceptions 忽略证书或认证异常。设置此选项后,Monkey会执行完所有的事件,不会因认证或证书异常而停止。
--ignore-native-crashes 监视系统中本地代码发生的崩溃
--monitor-native-crashes 忽略本地代码导致的崩溃。设置忽略后,Monkey将执行完所有的事件,不会因此停止。
-v -v –v 提供最详细的设置信息,用于指定反馈信息级别,总共分为level 0、level 1、level 2三个级别,级别越高,输出的日志越详细。其他选项可以百度。
>表示文件覆盖打印;>>表示文件尾部打印
5【结果分析】
测试结果有两个我们需要重点关注解决的, crash 崩溃、 ANR( Application Not Response 响应超时)。
1)ANR(Application Not Response):程序无响应,一般主线程超过5秒没处理就会出现ANR错误。通过搜索ANR关键词来定位关键的事件信息。adb shell 进入手机-->cd /data/anr/ ---->ls ---->more traces.txt 就可以查看了,里面记录了所有应用的anr信息
一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。
2)ForceClosed或其他异常退出信息:通过搜索Fatal关键词来定位。内存泄露问题搜索"GC"(需进一步分析)
3)崩溃问题:通过搜索Exception关键词来定位。(如果出现空指针, NullPointerException,需格外重视)
4)发生异常后,通过搜索Crash关键词来定位到详细的堆栈信息。
5) 其他异常
A、Restart System异常(系统重新启动),即log信息的最后几行会看到Restart System的打印信息,说明手机被自动的重启或断掉,有几个方面的原因
//运行过程中,存在异常手机被自动重启
//手机在运行过程中,进入设置中的恢复出厂设置,导致手机重启
B、RuntimeException等异常,同样的会在plog.log中可以看到相应的打印信息, java.lang.RuntimeException该问题多出现在操作无响应之后,或者是某应用的服务无法启动或连接时,需要具体问题具体的分析
C、StaleDataException、readException等异常, 在plog.log中可以看到相应的打印信息,也会有相应的信息: android.database.StaleDataException,该信息说明android的数据库操作出现异常, 需要具体问题具体的分析
D、IllegalArgumentException等异常,多少情况下为说明向函数传递了一个不正确或不合法的参数需要具体问题具体的分析