事情的起因是一个不怎么维护的APP从小米市场下架了,原因是APP存在几个崩溃问题,对方把测试结果报告、录屏信息发了过来。我们看了一下,发现是一个很老的版本,至于为什么没有把新版更新上去就不得而知了…公司管理上比较混乱,职责划分也不清,哎…
按照录屏上的操作去最新版上实验了一把,发现没有这些问题。为了安全起见,决定还是也用 monkey 跑一把,然后发现这东西真是个宝藏,做 APP 测试的同学一定要用起来呀。
环境安装与配置就不讲了,一搜就有,我用的是Android Studio 4.1。
Monkey简介
Monkey 是 SDK 中附带的一个工具,是一款自动化测试工具,该工具主要用于进行压力测试,一般安装在 C:\Users\Yourname\AppData\Local\Android\sdk\platform-tools。Monkey需要通过adb (Android Debug Bridge) 来运行,Monkey 测试所有的事件都是随机产生的,通过向系统发送伪随机的用户事件流,来对设备上的程序进行测试,检测程序的稳定性。虽然输入的事件是随机产生的,但是可以指定输入事件类型(触摸事件、滑动事件、轨迹球事件、导航事件、主要导航事件、系统按键事件、activity之间的切换、任意事件)的百分比,让其控制在我们需要的范围内,后面会讲到如何设置比例。
ADB的全称为 AndroidDebug Bridge,就是起到调试桥的作用,ADB 是Android SDK 里的一个工具,用这个工具可以直接操作管理android模拟器或者真实的android设备。
测试原理
adb shell monkey的运行机制:实际上是执行手机中/system/bin/monkey这个脚本。Monkey注入系统事件是通过 framework 层的 hidenApi (如:activemanager,inputmanager,windowmanager) 获取系统服务。Monkey事件根据类型比例生成事件队列,循环查找事件。
触摸事件(inputmanager):包括屏幕以及物理键的触摸,滑动,点击事件 Activity事件(activemanager):是指我们调用Android系统组件的事件 Window事件(windowmanager):是指操作Window的事件,例如转屏
命令
monkey命令分为4大类:
- 常用选项:-v
- 事件选项:触屏、滑动等事件
- 约束选项:-p
- 调试选项:忽略崩溃、忽略超时等
常用命令
-
查看当前连接设备 adb devices
-
查看包名list adb shell pm list packages
-
执行测试 adb shell monkey –p yourPackage -s 80 –-throttle 100 –-pct-touch 30 –-pct- motion 20 --pct-nav 10 --pct-majornav 10 --pct-syskeys 5 --pct-appswitch 10 –v –v -v 1000 >c:\result.txt
详解 -p:指定测试的包,如不指定,则对系统中所有package有效。一个-p 对应一个有效package, 如:-p com.xxx -p com.yyy。 -s 80:seed值,指定产生随机事件种子值为80,相同的种子值产生相同的事件序列 –-throttle 100:指定两次操作间的间隔时间100ms,如不指定系统会在上一个事件结束后立马发下一个指令。 –pct-touch 30:指定触摸事件的百分比为30%,事件有如下这些:
- –pct-touch: 触摸事件百分比
- –pct-motion :滑动事件百分比
- –pct-pinchzoom:绽放事件百分比
- –pct-trackball :轨迹球事件百分比
- –pct-nav :导航事件 up/down/left/right,指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少
- –pct-majornav :主要导航事件,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键
- –pct-syskeys :系统按键事件,点击系统保留使用的按键——Home键、返回键、音量调节键等
- –pct-appswitch :activity之间的切换,Activity启动事件百分比,最大限度上覆盖被测包中全部Activity的一种方法
- –pct-flip:键盘翻转事件百分比
- –pct-rotation:模拟 Android 手机的横屏、竖屏切换(屏幕旋转事件是一个隐藏事件,在Android官方文档中并没有记录这个事件)
- –pct-anyevent :(任意事件)
所有事件的百分比加起来不能超过100。 -v -v -v 1000:日志级别为2,产生1000个事件。
命令 | 说明 |
---|
-v | 日志级别 0,缺省值,仅提供启动提示、测试完成和最终结果等少量信息 | -v -v | 日志级别1,提供较为详细的日志,包括每个发送到Activity的事件信息 | -v -v -v | 日志级别2,最详细的日志,包括了测试中选中/未选中的Activity信息 |
>c:\result.txt:保存测试过程中的日志(以便结果分析)
option | description |
---|
–dbg-no-events | 初始化启动的activity,但是不产生任何事件 | –hprof | 在事件序列发送前后会立即生成分析报告 —— 一般建议指定该项 | –ignore-crashes | 忽略崩溃 | –ignore-timeouts | 忽略超时 | -ignore-security-exceptions | 忽略安全异常 | –kill-process-after-error | 发生错误后直接杀掉进程 | –monitor-native-crashes | 跟踪本地方法的崩溃问题 | –wait-dbg | 连接上调试器后才执行 monkey 测试 |
测试结果分析
通过日志来分析测试结果。
日志开头 显示本次测试seed值,执行次数,测试包: 日志结尾
结尾会打印出当前执行事件的次数和所花费的时间;Monkey finished代表执行完成。 日志分析 通过搜索关键字进行日志分析(否则查得眼疼):
-
ANR:Application Not Response,程序无响应 -
error -
GC:内存泄露 -
crash:程序崩溃 ![在这里插入图片描述](https://img-blog.csdnimg.cn/64a55972909548a8b4549466853e7f6d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oeS5oeS55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16 -
exception:异常
详细分析 查找 log 中的 switch(或sending或sleeping,sleeping每出现一次,就代表一个事件),主要查看 Monkey 执行的是哪个Activity,两个 swtich 之间如果出现了崩溃或其他异常,可以在该 Activity 中查找问题的所在。
重现问题 出现问题后一般的查错步骤如下:
- 通过查找日志中的关键字找到是哪个地方出错
- 查出出错前后进行的动作,然后手动执行这些操作
- 如果通过1、2步不能找出,则在将Monkdy命令执行一遍,注意 seed 值保持一致。另外可以肉眼观看屏幕上的操作或录屏下来。
一般 无 ANR 且 无 CRASH是测试标准。
|