记录一次Monkey测试全流程

1、检查设备连接

ZHR:~ zc$ adb devices
List of devices attached
JPF4C19123011893    device

2、查看测试的包名

ZHR:~ zc$ adb shell dumpsys window w | grep name=""mSurface=Surface(name=GestureNavBottom)/@0x286f499mSurface=Surface(name=GestureNavRight)/@0x286f451mSurface=Surface(name=GestureNavLeft)/@0x286f415mAnimationIsEntrance=true      mSurface=Surface(name=StatusBar)/@0x21ad1a7mSurface=Surface(name=com.czb.webczbdemo/com.czb.webczbdemo.activity.WebPageNavigationActivity)/@0x1b4f995mAnimationIsEntrance=true      mSurface=Surface(name=com.android.systemui.HwImageWallpaper)/@0x21db9e9

如果你知道你的包的大概的名字,比如说腾讯的包一般都有一个“tencent”

ZHR:md zc$ adb shell pm list package|grep czb
package:com.czb.chezhubang
package:com.czb.webczbdemo

获取测试包名:com.czb.webczbdemo

3、清空logcat日志

adb logcat -c

首先,我们monkey测试的时候主要有两个日志

Monkey命令输出的日志

其实就是记录了monkey在我们手机上的操作而已

Logcat

这个才是我们的重点,他记录了我们app的信息,我们去找异常或者报错的时候都是来这里找的,清空logcat只是为了方便我们download到本地小一些而已,也可以不清空。

logcat分区

Android日志系统提供了记录和查看系统调试信息的功能,日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来查看和使用。

开发者选项,有一个选项叫做“日志记录器缓冲区大小”,默认是256K,日志是循环写入环形缓冲区的,在通常情况下,写满时最旧的日志会被删除以给新输出的日志留内存空间。

Android log 输出量巨大,特别是通信系统的log,因此,Android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:
          
·Radio : 输出通信系统的log,如:WiFi,蓝牙,3/4/5G,GPS,NFC等

·System: 输出系统组件的log,权限比较高,如:调用相机,调用录制,调用麦克风等

·Events: 输出event模块的log,event翻译过来就是事件,如:通过手指点击屏幕的某一处地方,称为点击事件;通过按电源或者音量加减等

·Main:    所有java层的log,(不属于上面3层的log)

如果测试APP,需要输出Main,命令:adb logcat -b main,adb logcat 默认抓取Main

logcat日志级别

• Verbose:显示所有日志消息(默认值)。

• Debug:显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。

• Info:显示常规使用情况的预期日志消息,以及此列表中较低的消息级别。

• Warn:显示尚不是错误的潜在问题,以及此列表中较低的消息级别。

• Error:显示已经引发错误的问题,以及此列表中较低的消息级别。

• Assert:显示开发者预计绝不会发生的问题。

logcat常用命令

#打印默认日志数据
adb logcat
#需要打印日志详细时间的简单数据
adb logcat -v time
#需要打印级别为Error的信息
adb logcat *:E
#需要打印时间和级别是Error的信息
adb logcat -v time *:E

4、执行测试命令

adb shell monkey -p  com.czb.webczbdemo --throttle 100 --monitor-native-crashes -v -v -v  --pct-touch 30  --pct-rotation 5  --pct-rotation 5 --pct-motion 15  --pct-nav 0  --pct-majornav 15 --pct-appswitch 0 --pct-anyevent 0 --pct-trackball 0 --pct-syskeys 10 -s 100 1000 >/Users/zc/Desktop/md/monkey.txt

执行后终端会打印出一些信息,其实就是你的命令的参数,等monkey执行完成后,终端不再打印信息,返回控制权。

5、下载logcat日志

ZHR:~ zc$ adb logcat -v time >/Users/zc/Desktop/md/logcat.txt

注意:这个日志的输出的开始位置是从你上次清空后新生成的日志开始,直到你手动结束该命令为止,会实时的输出日志,所以要手动关闭:control+z(mac)

6、分析日志

monkey日志分析

先找到哪里有报错

我们主要分析的其实是monkey的日志

在日志中搜索关键字:

ANR

搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)

crash

搜索报告中的关键字“crash”,看有无崩溃的事件

exception

搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException

操作数据库异常:SQLException

输入输出异常:IOException

违法访问错误:IllegalAccessError

内存不足错误:OutOfMemoryError

堆栈溢出错误:StackOverflowError

GC

注:暂时还未遇到过,抄的很彻底
内存泄露问题搜索"GC"(需进一步分析)
发现内存泄露–内存报告分析(利用hprof参数的内存快照生成内存报告)

在发现内存泄露后,可以执行相同的monkey指令,只需多加一个参数–hprof

如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。(注: /data/misc ?需要root权限,可
以在手机上安装个RE查看或通过手机助手查看)

ps:文件转换:配置monkey测试时的sdk-tools下查看是否hprof-conv命令,在命令行输入hprof-conv -help得知文件转化用法,直接转化就行,由.hprof转化成.conv格式。
转化后的文件用eclipse的Memory Analyzer tool(MAT)查看(此插件可以下载),可以点击?Reports->Leak Suspects链接来生成报告。

monkey出现错误后,一般的分析步骤

1)先找到出现错误的位置

2)查看出现错误之前2个switch之间的activity

3)手动执行事件,复现问题

4)若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey

logcat日志分析

没试过,抄的很彻底

ANR in

当monkey测试出现异常终止,请打开logcat日志搜索关键字‘ANR in’,如果存在该关键字,说明app出现了ANR异常,我们需要把/data/anr目录下的trace.txt文件取下来

拉取traces文件

adb pull /data/anr/traces.txt /Users/zc/Desktop/md/traces.txt

取下来trace.txt文件后,将出现问题的进程号对应的日志发给软件工程师定位,如果在logcat日志里没有搜索到’anrin’关键字,就搜索’nullpointer’异常关键字的上下日志,发给开发定位

在logcat将出现anr问题的进程号复制,然后在trace.txt文件里按ctrl+F 查找,粘贴进程号,查找对应的问题

打开 traces.txt 后,发现时间和anr发生的时间不对应,是因为:两份日志是处于不同的模块,导致有时间上的差异,差异在几秒内;但是traces日志有一个特点,他只会保存最新的一份报错的日志,如果有多次报错,会被覆盖。

这里可以使用的“dropbox”,文件路径在 “/data/system/dropbox”,在此目录中,如果是“SYSTEM_BOOT”开头,为系统启动的日志,“data_app”开头的,为手动安装的第三方的日志,里面gz结尾的压缩包文件,内容已经有了anr或者crash的 logcat日志和 方法调用栈 日志。(注释:一个anr一个文件)

FATAL EXCEPTION:main

出现严重错误崩溃关键词

测试通过标准

一般 0 ANR 0 Crash是测试标准。

7、回归

回归其实就是将刚才的指令再执行一遍就行了,因为我们的指令里有-s,后面会讲到

8、回头来看monkey指令

类似的monkey指令其实网上有很多,我们只挑一些比较重要的指令和测试中需要注意的点

leaks

很多测试版本的app内置了一个检查内存泄漏的leaks功能,跑money的时候,记得让开发给关掉,否则会先进入leaks,不好出来

隐藏虚拟键及顶部状态栏,防止跑monkey的时候关闭wifi

ZHR:~ zc$ adb shell settings put global policy_control immersive.full=*

等你执行完了,发现,哇,我的顶部状态栏怎么没了,我是不是要重启是不是要恢复出厂设置,不用,执行下面的命令就可以了

ZHR:~ zc$ adb shell settings put global policy_control null

–throttle

有时候monkey的事件执行的很快,肉眼根本看不清点击事件,加上throttle参数就可以控制每个事件之间的间隔数,使执行动作慢下来,方便我们查看,单位:毫秒

–monitor-native-crashes

监视并报告Androids系统本地代码的崩溃事件

–ignore-timeouts(无响应ANR)

用于指定当应用程序发生ANR(ApplicationNo Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。

–ignore-security-exceptions(许可证书崩溃)

用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。

-p

后面跟着的就是我们的包名,第二步获取到的

-v -v -v

日志登记, -v -v -v 是最高的等级,打印的日志最多,-v是最少的

-s

Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。

–pct

绝对是monkey里的扛把子,几乎大部分的指令都在这里了
–pct-motion {+百分比}:1
翻译动作,动作事件泛指从某一位置接下(即down事件)后经过一系列伪随机事件后弹出(即up事件)

手势事件是指在屏幕某处的按下、随机移动、抬起的操作,即直线滑动操作。可通过–pct-motion参数来配置其事件百分比。

该事件是由一个ACTION_DOWN事件、一系列ACTION_MOVE事件和一个ACTION_UP事件组成的,在手机上看到的实际操作是一个没有拐弯的直线滑动操作。

–pct-pinchzoom {+百分比}:2
翻译二指缩放,智能机上的放大缩小手势操作事件

二指缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起的操作,即智能机上的放大缩小手势操作。可通过–pct-pinchzoom参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

该事件起始是一个ACTION_DOWN事件和一个ACTION_POINTER_DOWN事件,即模拟两个手指同时点下;中间是一系列的ACTION_MOVE事件,即两个手指同时在屏幕上直线滑动;结束是由一个ACTION_POINTER_UP事件和一个ACTION_UP事件组成的,即两个手指同时放开。

–pct-trackball {+百分比}: 3
翻译轨迹,轨迹事件包括一系列的随机移动,以及偶尔跟随在移动后面的点击事件

轨迹事件是由一个或多个随机的移动组成的,有时会伴随着点击。很早之前的Android手机带有轨迹球,这个事件就是模拟的轨迹球的操作。现在的手机几乎都没有轨迹球,但轨迹球事件中包含曲线滑动操作,如果被测程序需要曲线滑动时可以选用此参数。可通过–pct-trackball参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

该事件是由一系列的Trackball(ACTION_MOVE)事件组成的,观察手机上的操作,即为一系列的曲线滑动操作。

–pct-rotation {+百分比}:4
翻译屏幕旋转,横屏竖屏事件

屏幕旋转事件是一个隐藏事件,在Android官方文档中并没有记录这个事件。它其实是模拟的Android手机的横屏和竖屏切换。可通过–pct-rotation参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 该事件由一个rotation事件组成,其中degree表示的是旋转方向,顺时针旋转,0表示旋转90度的方向,1表示旋转180度的方向,2表示旋转270度的方向,3表示旋转360度的方向。在执行过程中,可以看到手机屏幕在横竖屏之间不断地切换。

–pct-nav {+百分比}:5
翻译基本导航,基本导航事件主要来自方向输入设备的上、下、左、右事件

基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少。可通过–pct-nav参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上、下、左、右四个方向按键。

–pct-majornav {+百分比}:6
翻译主要导航,主要导航事件通常指引发图形界面的一些动作,如键盘中间按键、返回按键、菜单按键等

主要导航事件是指点击“主要导航”按键的操作,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键。可通过–pct-majornav参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是中间键和菜单键

–pct-syskeys {+百分比}:7
翻译系统按键,系统按键事件通常指仅供系统使用的保留按键,如HOME键、BACK键、拨号键、挂断键、音量键等

系统按键事件是指点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过–pct-syskeys参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上面说到的几个系统按键。

–pct-appswitch {+百分比}:8
翻译应用启动,应用启动事件(activity launches)即打开应用,通过调用startActivity()方法最大限度地开启该package下的所有应用

启动Activity事件是指在手机上启动一个Activity的操作。在随机的时间间隔中,Monkey将执行一个startActivity()方法,作为最大限度上覆盖被测包中全部Activity的一种方法。可通过–pct-appswitch参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 该事件是由一个Switch操作组成的,从手机上看,上面的操作实际是打开了com.android.settings这个应用的一个com.android.settings.Settings的Activity界面。

–pct-flip {+百分比}:9
翻译翻转,键盘轻弹百分比,如点击输入框,键盘弹起,点击输入框以外区域,键盘收回

键盘事件主要是一些与键盘相关的操作。比如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等。可通过–pct-flip参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 如日志所示,这里主要是键盘的打开和关闭操作。

–pct-anyevent {+百分比}:10
翻译其他类型,其他类型事件指上文中未涉及的所有其他事件,如keypress、不常用的button等

其他类型事件包括了除前面提到的10种事件外其他所有的事件,如按键、其他不常用的设备上的按钮等。可通过–pct-anyevent参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是其他的一些系统按键,如字母按键、数字按键等。因为现在手机很少带字母按键或数字按键,所以这个事件一般使用得比较少。

记录一次Monkey测试全流程相关推荐

  1. MMSegmentation 训练测试全流程

    MMSegmentation 训练测试全流程 1.按照执行顺序的流程梳理 Level 0: 运行 Shell 命令: Level 1: 在 tools/train.py 内: Level 2: 转进到 ...

  2. 基于Jenkins的开发测试全流程持续集成实践

    今年上半年一直在公司实践CI,本文将上半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续下半年还会深入实践和引入Kuberne ...

  3. Web网页测试全流程解析论Web自动化测试

    1.功能测试 web网页测试中的功能测试,主要测试网页中的所有链接.数据库连接.用于在网页中提交或获取用户信息的表单.Cookie 测试等. (1)查看所有链接: ·测试从所有页面到被测特定域的传出链 ...

  4. (最全干货分享)渗透测试全流程归纳总结之二

    进来先点个赞,评个论,关个注呗- 获取更多学习资料.想加入社群.深入学习,请扫我的二维码或加Memory20000427. 2.OSINT 公开情报收集 2.1社工技巧 查看注册的网站:0xreg r ...

  5. 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践

    前言 近几年,互联网项目很多都有从单体服务转变成微服务化的趋势,尤其是一些架构复杂,业务比较广泛的项目,微服务化是大势所趋,可以解决独立构建.更新.运维等一系列问题,从而解放生产力,促进交付效率和质量 ...

  6. 渗透测试 ( 1 ) --- 相关术语、必备 工具、导航、全流程总结、入侵网站思路

    From:https://zhuanlan.zhihu.com/p/401413938 渗透测试实战教学:https://www.zhihu.com/column/c_1334810805263515 ...

  7. 项目全流程 (1/3)

    目录 前言 一.环境搭建-spring 1.1 IDEA环境搭建 1.1.1 创建项目配置 1.1.2 选择Springboot版本 1.1.3 项目设置 1.1.4 导入pom.xml文件 1.1. ...

  8. SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细)

    SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细) 0 DInSAR原理简介 1 数据采集和SARscape Preferences预设 1.1 SAR数据采集 1.2 ...

  9. unreal ue4 PixelStreaming 局域网及公有云部署全流程记录

    PixelStreaming 局域网及公有云部署全流程记录 发表于 2020-04-10 |  更新于: 2020-04-20 |  分类于 Unreal Engine |  717 写在前面 本篇是 ...

最新文章

  1. 以后看下try,catch在C#下面的成本
  2. java - 求最大公约数和最小公倍数
  3. python2.7安装scipy_在centOS上离安装Python2.7以及numpy,scipy,matplot,sklearn等
  4. 弱监督深度学习图像分割综述
  5. Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at
  6. 2021年10月Python小屋编程比赛获奖名单
  7. CocoaPods 基础知识--------安装 及 使用第三方库
  8. C++新手入门学习笔记(跟着敲)
  9. LINUX下载编译libpq(postgresql)
  10. 【Java毕设项目】二十项毕设项目(附源码课件)
  11. Android航海航线地图,航海王热血航线东南之海宝藏一览
  12. HCIPHCIE【2019-4月-更新增加新题】221 65道新题
  13. 鲜卑族的由来与现在的分布
  14. js数组操作(push,pop,shift,unshift,slice,splice,concat,sort)
  15. 计算机两种通信方式-----串行通信和并行通信
  16. linux组raid的工具,Linux下MegaRAID命令行使用工具
  17. 视频监控方面部分基础知识
  18. 《窃听风云》中手机在关机情况下被监听是真的吗?
  19. 著名超导论文被Nature撤稿
  20. 报错:Property or method “item“ is not defined on the instance but referenced during render.

热门文章

  1. windows命令合集
  2. 蓝桥杯官方板子问题(深夜学习——单片机)
  3. Java 设置 httponly cookie
  4. 能被2、3、4、5、6、7、8、9整除数的特征
  5. MPC5634的eTPU模块学习笔记(一)
  6. cstdio和stdio.h的区别
  7. ROS下UVC免驱高速摄像头图像读取以及利用image_transport进行图像传递
  8. CockroachDB中一个query是如何执行的?
  9. antd 中 Upload 上传图片宽高限制以及上传文件的格式限制
  10. android如何做夜间模式,Android实现日夜间模式的三种常用方法(一)