记录一次Monkey测试全流程
记录一次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测试全流程相关推荐
- MMSegmentation 训练测试全流程
MMSegmentation 训练测试全流程 1.按照执行顺序的流程梳理 Level 0: 运行 Shell 命令: Level 1: 在 tools/train.py 内: Level 2: 转进到 ...
- 基于Jenkins的开发测试全流程持续集成实践
今年上半年一直在公司实践CI,本文将上半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续下半年还会深入实践和引入Kuberne ...
- Web网页测试全流程解析论Web自动化测试
1.功能测试 web网页测试中的功能测试,主要测试网页中的所有链接.数据库连接.用于在网页中提交或获取用户信息的表单.Cookie 测试等. (1)查看所有链接: ·测试从所有页面到被测特定域的传出链 ...
- (最全干货分享)渗透测试全流程归纳总结之二
进来先点个赞,评个论,关个注呗- 获取更多学习资料.想加入社群.深入学习,请扫我的二维码或加Memory20000427. 2.OSINT 公开情报收集 2.1社工技巧 查看注册的网站:0xreg r ...
- 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践
前言 近几年,互联网项目很多都有从单体服务转变成微服务化的趋势,尤其是一些架构复杂,业务比较广泛的项目,微服务化是大势所趋,可以解决独立构建.更新.运维等一系列问题,从而解放生产力,促进交付效率和质量 ...
- 渗透测试 ( 1 ) --- 相关术语、必备 工具、导航、全流程总结、入侵网站思路
From:https://zhuanlan.zhihu.com/p/401413938 渗透测试实战教学:https://www.zhihu.com/column/c_1334810805263515 ...
- 项目全流程 (1/3)
目录 前言 一.环境搭建-spring 1.1 IDEA环境搭建 1.1.1 创建项目配置 1.1.2 选择Springboot版本 1.1.3 项目设置 1.1.4 导入pom.xml文件 1.1. ...
- SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细)
SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细) 0 DInSAR原理简介 1 数据采集和SARscape Preferences预设 1.1 SAR数据采集 1.2 ...
- unreal ue4 PixelStreaming 局域网及公有云部署全流程记录
PixelStreaming 局域网及公有云部署全流程记录 发表于 2020-04-10 | 更新于: 2020-04-20 | 分类于 Unreal Engine | 717 写在前面 本篇是 ...
最新文章
- 以后看下try,catch在C#下面的成本
- java - 求最大公约数和最小公倍数
- python2.7安装scipy_在centOS上离安装Python2.7以及numpy,scipy,matplot,sklearn等
- 弱监督深度学习图像分割综述
- Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at
- 2021年10月Python小屋编程比赛获奖名单
- CocoaPods 基础知识--------安装 及 使用第三方库
- C++新手入门学习笔记(跟着敲)
- LINUX下载编译libpq(postgresql)
- 【Java毕设项目】二十项毕设项目(附源码课件)
- Android航海航线地图,航海王热血航线东南之海宝藏一览
- HCIPHCIE【2019-4月-更新增加新题】221 65道新题
- 鲜卑族的由来与现在的分布
- js数组操作(push,pop,shift,unshift,slice,splice,concat,sort)
- 计算机两种通信方式-----串行通信和并行通信
- linux组raid的工具,Linux下MegaRAID命令行使用工具
- 视频监控方面部分基础知识
- 《窃听风云》中手机在关机情况下被监听是真的吗?
- 著名超导论文被Nature撤稿
- 报错:Property or method “item“ is not defined on the instance but referenced during render.