目录
健壮性测试用于测试系统在出现故障时,是否能够自动恢复或者忽视故障继续运行。
monkey是Android SDK自带的一个命令行工具,可以运行在模拟器或真机中,它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),monkey是一种测试软件的稳定性、健壮性的快速有效的方法。
monkey一般在功能测试通过、产品稳定以后进行,测试应用是否会出现闪退、崩溃等。
由于monkey是Android SDK自带的,所以它只支持在android系统下运行。
Android SDK需要java环境,所以需要先安装java。
在命令行界面输入java -version,出现如下界面,说明安装成功
这里通过安装 Android Studio,来安装Android SDK。
安装后,启动 Android Studio,下载 SDK(需要一定的时间)。
SDK下载完成后,在环境变量Path中添加adb命令路径。C:\Users\***\AppData\Local\Android\Sdk\platform-tools
在命令行界面输入adb version出现如下界面,说明adb配置成功
除了android自带的模拟器,还可以选择第三方模拟器,如mumu模拟器、夜神模拟器,这里以mumu模拟器为例。
安装完成后,在命令行界面输入adb connect 127.0.0.1:7555、adb devices,出现如下界面,说明模拟器连接成功
连接设备的时候,可以选择android自带模拟器、mumu模拟器、真机。
这里以真机为例:
- 用USB数据线连接真机与电脑
- 打开真机的开发者选项(版本号连续点击7或5次开启)
- 打开USB调试开关
- 打开命令行界面,输入adb devices,出现真机设备编号,表示设备连接成功
adb shell monkey -help
启动手机里面所有的 App ,随机操作 1000 次,1000表示事件数
adb shell monkey 1000
使用-p参数,后面接包名
adb shell monkey -p com.tencent.mm 20
可以指定多个包名,在后面加上多个-p即可
monkey日志有三种级别,v的个数越多日志级别越高,日志内容越详细:
- -v:0级 除启动提示、测试完成和最终结果之外,提供较少信息。
- -v -v :1级 提供较为详细的测试信息,如逐个发送到Activity的事件。
- -v -v -v :2级 提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。
adb shell monkey -p com.tencent.mm 20 -v -v -v
将日志信息输出到文件中:
adb shell monkey -p com.tencent.mm 20 -v -v -v>d:\monkey.log
使用-s参数,用于指定伪随机生成器的seed值,如果用相同的seed值再次运行monkey,将生成相同的事件序列,用于问题复现
adb shell monkey -p com.tencent.mm -s 666 20
使用--throttle参数,后面接时间,单位为ms,表示事件之间的固定延迟(即执行每一个指令间隔的时间),如果不接该项,monkey将不会延迟
adb shell monkey -p com.tencent.mm --throttle 500 20
通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--ignore-crashes 忽略应用崩溃
--ignore-timeouts 忽略ANR 也就是应用未响应
--ignore-security-exceptions 忽略安全权限异常
--ignore-native-crashes 忽略系统崩溃
adb shell monkey -p com.tencent.mm --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes 20
使用--pct-**参数,后面接百分比,如让触摸事件占比40%
adb shell monkey -p com.tencent.mm --pct-touch 40 20
注意:各类事件类型的百分比总数不能超过100%
事件类型包括:
--pct-touch 触摸事件(屏幕按下、弹起的操作)
--pct-motion 手势事件(直线滑动操作)
--pct-trackball 轨迹球事件
--pct-syskeys 系统导航事件,硬件设备的Home键,返回键和拨号键和音量键
--pct-nav 基本导航事件,设备的上下左右四个方向的导航
--pct-majornav 主要导航事件,app的中间键,返回键,菜单按键
--pct-appswitch 切换Activity事件,app里有多个Activity,切换到不同Activity
--pct-flip 键盘轻弹,点击文本框,键盘弹起
--pct-anyevent 其他事件
--pct-pinchzoom 二指缩放事件
--pct-permission 获取危险权限事件
常规monkey测试执行的是随机的事件流,如果想让monkey测试某个特定场景就需要用到自定义脚本,monkey支持执行用户自定义脚本的测试,用户只需要按照monkey脚本的规范编写好脚本,存放到手机上,启动monkey通过-f 参数调用脚本即可。
monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息。
这里也体现了monkey的缺点,只能通过坐标来定位元素,意味着更换设备后,坐标可能会失效。
LaunchActivity(pkg_name, cl_name):启动应用的Activity。参数:包名和启动的Activity
Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
UserWait(sleepTime): 休眠一段时间
DispatchPress(keyName): 按键。注:keyName值可以百度android keycode列表获取
DispatchString(input): 输入字符串
DispatchFlip(true/false): 打开或者关闭软键盘
PressAndHold(x, y, pressDuration): 模拟长按事件
RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度,例如: 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变
以微信app为例,前面是头文件信息,start data >>开始是具体的monkey命令
#类型
type = raw events
#执行次数
count = 1
#执行速率
speed = 1.0
#启动测试
start data >>
#启动app 参数为包名和要启动的activity
LaunchActivity(com.tencent.mm,com.tencent.mm.ui.LauncherUI)
#等待时间
UserWait(10000)
#点击
Tap(358,739,1000) #点击我知道了
UserWait(5000)
Tap(360,1231,1000) #点击工作台
UserWait(5000)
Tap(100,576,1000) #点击驾驶任务
将脚本上传到设备
adb push d:\monkey.txt sdcard/monkey.txt
执行1次脚本
adb shell monkey -f sdcard/monkey.txt -v -v 1
执行结果
monkey在执行完预设的事件次数后会自动停止,如果在没有执行完预设的事件次数,又想要停止monkey,就要采用手动杀掉进程的方法
查看进程号
adb shell ps|findstr monkey
杀掉进程
adb shell kill 进程号
查看monkey日志的时候,重点就是搜索一下有没有问题:crash(崩溃)、exception、error、failed、timedWaiting(ANR application not responded 应用无响应)、at(通常是在异常后面会出现at,来说明报错代码的位置)
第一部分:包含 seed值、执行次数、包名
第二部分:被测设备上的所有应用包名,本次测试使用到哪些包,未使用哪些包
第三部分:各个事件所占百分比
0:触摸事件百分比,即参数–pct-touch
1:滑动事件百分比,即参数–pct-motion
2:缩放事件百分比,即参数–pct-pinchzoom
3:轨迹球事件百分比,即参数–pct-trackball
4:屏幕旋转事件百分比,即参数–pct-rotation
5:获取危险权限事件百分比,即参数–pct-permission//低版本没有
6:基本导航事件百分比,即参数–pct-nav
7:主要导航事件百分比,即参数–pct-majornav
8:系统事件百分比,即参数–pct-syskeys
9:Activity启动事件百分比,即参数–pct-appswitch
10:键盘翻转事件百分比,即参数–pct-flip
11:其他事件百分比,即参数–pct-anyevent
第四部分:具体事件
Sleeping for 400 milliseconds这句log是执行monkey时,--throttle设定的间隔时间,每出现一次,就代表一个事件
第五部分:log 完成
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间
// Monkey finished代表执行完成
如果Monkey执行中断,在log的最后也能查看到当前已执行的次数
Monkey执行完成的log具体如下:
- 搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)
- 搜索报告中的关键字“crash”,看有无崩溃的事件
- 搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)
下面的属于monkey自己的问题,不用管。
出现ANR(application no response),一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应
将ANR日志下载到本地
adb pull /data/anr/traces.txt
将bugreport下载到本地
adb bugreport>d:\bugreport.log
使用命令
adb logcat -v time>d:\logcat.log
使用前最好清除之前的日志信息,再触发事件,然后查看最近的日志信息
adb logcat -c
先启动app,然后输入adb命令:
adb shell dumpsys window|findstr mCurrentFocus