移动端测试
学习目标
- 熟练掌握app测试点
- 熟练掌握小程序测试点
- 了解小程序和app测试的不同点
- 掌握ADB命令
- 掌握monkey测试
一、app测试点
除了常规的黑盒测试方法,针对手机设备、app安装包的特性,app有额外的测试点需要校验。
1. 安全测试
- 扣费风险:包括发送短信、拨打电话、消耗流量等
- 隐私泄露风险:包括访问手机信息、访问联系人信息等
- 对App的输入有效性校验、认证、授权、敏感数据存储、数据加密等方面进行检测
- 限制/允许使用手机功能接入互联网(即:是否允许网络授权)
- 限制/允许使用手机发送接受信息功能(即:是否允许通讯授权)
- 限制/允许应用程序来注册自动启动应用程序(即:是否允许自动启动服务)
- 限制/允许使用手机拍照或录音
- 限制/允许使用手机读取用户数据
- 限制/允许使用手机写人用户数据(即:是否允许通讯录授权)
- 检测App的用户授权级别、数据泄漏、非法授权访问等
- 修改的配置信息是否复原
- 当将密码或其他的敏感数据输入到应用程序时, 其不会被储存在设备中, 同时密码也不会被解码
- 输入的密码将不以明文形式进行显示
- 密码、信用卡明细、或其他的敏感数据,将不被储存在它们预输入的位置上
- 不同的应用程序的个人身份证、密码长度是否满足安全字数
- 当应用程序处理信用卡明细、或其他的敏感数据时,不以明文形式将数据写到其它单独的文件或者临时文件中。 防止应用程序异常终止而又没有侧除它的临时文件,文件可能遭受人侵者的袭击,然后读取这些数据信息
- 备份应该加密,恢复数据应考虑恢复过程的异常。如:通讯中断等。数据恢复后再使用前应该经过校验
- 在进行安全提示前,不得利用文案误导欺骗用户授权
- 在没有用户明确许可的前提下,不损坏删除个人信息管理应用程序中的任何内容
- 应用程序应当有异常保护
- 在运行其软件过程中,如有其它高优先级的程序被触发(如:来电),优先处理高优先级程序,并在处理完毕后能正常恢复软件,继续其原来的功能
- 应能处理网络延时或中断
- HTTP、HTTPS覆盖测试
- App和后台服务一般都是通过HTTP来交互的,验证HTTP环境下是否正常
- 公共免费网络环境中(如:麦当劳、星巴克等)都要输入用户名和密码,通过SSL认证来访问网络,需要对使用HTTP Client的library异常作捕获处理
- 应用程序必需能够处理不可预知的用户操作,例如错误的操作和同时按下多个键
2. 安装测试
- 软件在不同操作系统下(安卓、IOS、鸿蒙)安装是否正常
- 软件安装后的是否能够正常运行,安装后的文件夹及文件是否写到了指定的目录里
- 软件安装各个选项的组合是否符合需求设计
- 软件安装向导的UI测试
- 软件安装过程是否可以取消,点击取消后,写入的文件是否按照需求设计进行处理
- 软件安装过程中意外情况的处理是否符合需求(如死机,重启,断电)
- 安装空间不足时是否有相应提示
- 安装后没有生成多余的目录结构和文件
- 对于需要通过网络验证之类的安装或升级,在中途断网情况下安装数据能否复原
- 安装手册进行测试,依照安装手册是否能顺利安装
- 安装的流程、耗时
3. 卸载测试
- 直接删除安装文件夹来进行卸载时,是否有提示信息
- 系统直接卸载程序是否有提示信息
- 卸载后文件是否全部删除所有的安装文件夹
- 卸载过程中出现的意外情况的测试(如死机、断电、重启)
- 卸载是否支持取消功能,单击取消后软件卸载的情况
- 卸载时,是否有特殊的卸载状态进度条提示
- 卸载用户使用过程中产生的文件是否有提示
- 卸载是否影响其他软件的功能
- 卸载的流程、耗时
4. 功能内容测试
- 使用的第三方插件是否风格统一
- 第三方插件是否能正常使用
- 第三方链接是否能正常跳转,是否需要额外授权
- 从第三方功能回到app时,功能是否能继续使用
- 从第三方功能回到app时,数据是否能够回传同步
- app内嵌套H5页面时,数据交互是否正常
- 自适应分辨率,内容根据手机屏幕大小自适应
- 横屏、竖屏内容能正常显示、功能正常使用
- 大图压缩的清晰度
- App打开速度测试,速度是否可观
- App页面间的切换是否流畅,逻辑是否正确
- 不同app之间切换,页面是否能正常恢复、功能是否能持续执行
- 将app切换到后台后再恢复,页面是否能正常恢复、功能是否能持续执行
- 手机锁屏后再开屏,页面是否能正常恢复、功能是否能持续执行
- 当杀掉app进程后,再开启app,app能否正常启动
- 哪些地方需要提供手动刷新,哪些地方需要自动刷新,哪些地方需要手动+自动刷新
- 哪些页面再次被恢复时,需要自动更新数据
- 哪些内容需要实时更新,哪些需要定时更新
- 哪些内容需要实时读取服务器,哪些需要读取本机缓存
- 离线无网络时,哪些功能允许使用,哪些功能不可使用
- 从无网络恢复到正常网络后,数据、界面、功能是否能恢复使用
5. APP升级
- 当客户端有新版本时,有更新提示
- 当版本为非强制升级版时,用户可以取消更新,老版本能正常使用
- 当用户取消升级后,下次唤醒app,是否需要再次提示升级
- 当版本为强制升级版时,用户没有做更新时,需要强行退出app
- 当客户端有新版本时,在本地不删除客户端的情况下,直接更新检查是否能正常更新
- 当客户端有新版本时,在本地不删除客户端的情况下,检查更新后的客户端功能是否是新版本
- 当客户端有新版本时,在本地不删除客户端的情况下,检查资源同名文件如图片是否能正常更新成最新版本
- 当用户跨越了多个版本未更新,在什么时期强制用户更新
- 测试升级后的功能是否与需求说明一样
- 升级安装意外情况的测试(如死机、断电、重启)
6. App授权
- 不同意定位授权,功能是否有备选可以方案,下次再一次触发该功能时,是否能再一次唤醒授权
- 不同意相机授权,功能是否有备选可以方案,下次再一次触发该功能时,是否能再一次唤醒授权
- 不同意相册授权,功能是否有备选可以方案,下次再一次触发该功能时,是否能再一次唤醒授权
- 不同意通讯录授权,功能是否有备选可以方案,下次再一次触发该功能时,是否能再一次唤醒授权
- 不同意短信读取授权,功能是否有备选可以方案,下次再一次触发该功能时,是否能再一次唤醒授权
- 授权后,又被关闭授权,下次再一次触发该功能时,是否能再一次唤醒授权
- 授权成功后,下次再一次触发该功能时,是否不会再一次唤醒授权
- 授权成功后,下次再一次触发类似功能时,是否不会再一次唤醒授权
- 用户选择仅本次的授权后,下次再一次触发该功能时,是否能再一次唤醒授权
- 复杂的授权流程,是否有对应教学或操作提示
7. 时间时区
- 用户所在的时区与服务器时区不一致,app内的时间相关的功能是否有应对方案
- 用户更改手机时间,app内的时间相关的功能是否有应对方案
8. 消息推送
- 检查推送消息是否按照指定的业务规则发送
- 检查不接受推送消息时,检查用户不会再接收到推送
- 如果用户设置了免打扰的时间段,检查在免打扰时间段内,用户接收不到推送
- 消息推送的对象(单一用户、群体用户)是否各自能收到消息
- 不同系统(安卓、IOS、鸿蒙)的用户是否能收到推送
- 推送的消息长度不可过长,且易读、易懂
- 消息内容(文字、图片、表情包、换行、空格、特殊字符等)是否正常显示
- 消息中包含的链接,是否能正常跳转
- 唤醒推送的消息,是否需要唤醒app,并进入指定界面
- 是否按照预定的时间进行消息推送
- 消息推送时,用户手机状态异常(关机、未唤醒app、飞行模式、停机等)
- 推送消息时,用户手机处于异常状态,当手机状态恢复正常后,消息是否需要补发
- 多消息同时推送,是否产生消息冲突
- 短时间内频繁推送,是否会被屏蔽
- 推送的短信消息,是否会被判定为垃圾广告进行隔离
9. 手机极限情况
- 手机物理内存被占满时,能否使用app
- 手机运行内存接近极限时,能否使用app
- 手机省电模式下,是否对app强耗电功能有影响
- 手机处于低电量模式下,是否对app强耗电功能有影响
- 手机处于弱网状态下,是否对app功能有影响
- 手机配置过低,能否正常使用app
10. 交叉事件测试
- 多个App同时运行是否影响正常功能
- App运行时前/后台切换是否影响正常功能
- App运行时拨打/接听电话
- App运行时发送/接收信息
- App运行时切换网络
- App运行时使用蓝牙传送/接收数据
- App运行时使用相机、计算器等手机自带设备
- App运行时收到其他应用的消息推送
11. 兼容测试
- 不同机型(iPhone11、iPhoneSE等)
- 不同分辨率
- 不同配置
- 不同品牌(小米、华为、oppo等)
- 不同系统(IOS、安卓、鸿蒙)
- 不同屏幕设计(全面屏、折叠屏、刘海屏等)
- 不同网络下(2G、3G、4G、5G、wifi)即弱网测试
- 物理按键、手势动作兼容
二、小程序测试点
1. 微信小程序的定义
依附于微信而无需再次下载安装的移动端应用程序
2. 小程序的特点
- 无需下载,即用即走
- 功能丰富,清爽体验
- 流量大、易裂变
3. 小程序的局限性
- 页面层级:每个应用最大支持页面层级为10层
- 用户本地缓存:不能超过10MB
- 大小:小程序支持不超过8M的源码文件(分包加载,单个分包不超过2M)
- 逻辑:过于复杂逻辑存在不可控的异常问题
4. 小程序的版本类型
- 开发版:用于小程序开发人员编写调试代码
- 体验版:用户开发人员、测试人员进行体验和测试
- 正式版:微信用户正式使用的版本,不支持调试模式

5. 小程序的测试要点
- 功能测试:按功能模块测试(根据设计好的各个大类功能模块划分,然后再逐一细化,覆盖到每个功能)、按业务流程测试(把各模块串联起来形成完整的业务流程、同一业务使用每个路径检查)、数据流向、同一功能不同入口有效性检查测试、交互性检查。
- 权限测试:未授权时登入小程序、已授权时登入小程序、同一个账号在不同手机端登入小程序。
- UI测试:页面元素展示、页面交互。
- 易用性测试:导航、功能入口、上下层级进入&返回、字体图片动态交互效果、操作是否过于繁琐。
- 网络测试:网络切换测试、验证各种网络下是否正常
- 性能测试:页面白屏时间、首屏时间、资源占用、页面渲染时间
- 接口测试:小程序调用的是后台的接口,所以这里的接口测试和平时的接口测试是一样的,使用Charles或fiddler抓包
- 兼容性测试:操作系统兼容性(Android版/iOS版)、屏幕兼容性测试、微信版本兼容性、二维码兼容性
- 安全测试:防范隐私泄露、密码加密及传输安全、权限的合理开放、数据库安全、通信安全等。
- 缓存测试:用户本地缓存(小程序文件、授权数据、登录数据等)不能超过10MB,缓存的作用是提高程序的流畅性、减少网络请求、节省服务器资源,其缓存测试点:清除缓存时是否强制退出、后台清理以及关机等情况,每次提交或退出时,是否清除了本次表单的缓存。

6. 小程序测试和APP测试的异同点
- 开发方面:小程序开发周期一般在两周左右,需要在公众平台上进行审核,审核周期一般较短;APP的开发周期在一个月左右,APP需要应用商店进行审核,审核周期较长。
- 权限:微信小程序需要验证是否有微信授权,未授权/授权登录程序,同一微信号不同手机登录查看数据显示情况;APP测试则需要考虑是否可以访问手机通讯录、相册、相机等权限。
- 性能方面:小程序页面可能只会关注响应时间,而APP则还需要关心流量、电量、CPU、GPU、Memory等。
- 兼容方面:小程序是基于浏览器的,所以更倾向于浏览器和电脑硬件,而浏览器的兼容则是一般是选择不同的浏览器内核进行测试(IE、chrome、Firefox)。APP的测试则必须依赖客户端,不仅要看分辨率,屏幕尺寸,还要看设备系统
- 测试场景:APP是客户端的,则必须测试安装、更新、卸载。除了常规的安装、更新、卸载还要考虑到异常场景。包括安装时的中断、弱网、安装后删除安装文件,小程序是基于浏览器的,所以不必考虑这些。
- 系统架构:小程序测试只要更新了服务器端,客户端就会同步会更新。但是APP端是不能够保证完全一致的,除非用户更新客户端。如果是APP下修改了服务端,意味着客户端用户所使用的核心版本都需要进行回归测试一遍。
- 缓存方面:缓存的作用是提高程序的流畅度、减少网络请求,节省服务器资源,有时候用户会进行清理缓存的情况。APP和小程序都会存在缓存,但小程序最大只有10M的本地缓存,测试时需要考虑清除缓存时强制退出、后台清理、关机等情况。
- 运行流畅度:原生App运行在操作系统中,所有的原生组件可以直接调用GPU进行渲染;小程序运行在微信的进程中,只能通过WebView进行渲染。用HTML+CSS+JS开发,配合微信的解析器最张渲染出来的原生组件的效果,比H5体验上更好。
- 占用空间:App 会一直存在手机中占用空间,太多的 App 可能会导致内存不足;小程序因为不需要安装,占用内存空间忽略不计
- 下载和安装:小程序不需要进行下载,清除时直接删除程序就行了;APP需要下载和安装,且卸载的时候需要清除数据
三、ADB命令
1. 什么是adb命令
adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用
2. 安卓环境搭建
① 安装JDK
傻瓜式安装,无需教程
I.直接运行exe文件,只需要更改两个地址,第一个地址是jdk路径、第二个地址是jre路径
II.配置java环境变量
· 单击"计算机-属性-高级系统设置",单击"环境变量"· 新建->变量名"JAVA_HOME",变量值为"安装jdk时第一次修改的路径"
· 编辑->变量名"Path",点击"新建",然后输入"%JAVA_HOME%\bin"、"%JAVA_HOME%\jre\bin"
· 新建->变量名"CLASSPATH", 变量值".;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar"
III.检查java环境变量是否配置成功:
cmd打开dos命令窗口,执行:java -version 查看java版本
② 安装Android
- 下载Android的sdk包
- 解压Android的sdk包,要求路径中不能包含中文
- 配置安卓环境变量:
新建系统变量:ANDROID_HOME=D:\android-sdk
Path变量里增加:
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\build-tools\25.0.0
③ Android插件更新
- 打开SDK Manager.exe下载前三个插件
④ 启动cmd 输入‘adb’即可查看是否配置成功。
⑤ 自行安装雷电模拟器。
3. 常用的ADB命令
① 常用命令
| 命令 | 描述 |
|---|---|
| adb version | 查看adb版本 |
| adb connect emulator-5554 | 连接emulator-5554设备 |
| adb devices | 查看设备 |
| adb shell | 进入底层linux交互模式 |
| adb -s emulator-5554 shell | 进入指定设备的linux底层 |
| exit | 退出linux交互模式 |
② 在安装设备安装apk
| 命令 | 描述 |
|---|---|
| adb install apk所在路径 | 安装apk 例如:adb install "E:\APP教学\apk\bainianaolaitemai_115.apk" |
| adb install -r apk所在路径 | 覆盖安装apk 例如:adb install -r "E:\APP教学\apk\bainianaolaitemai_115.apk" |
| adb -s 设备号 install apk所在路径 | 指定设备,安装apk 例如:adb install -s emulator-5554 "E:\APP教学\apk\bainianaolaitemai_115.apk" |
若遇到报错:Failure [INSTALL_FAILED_INVALID_URI],依次执行如下命令:
- adb remount
- adb shell
- cd /data
- chmod 777 local
- 再安装apk即可
③ 卸载apk
需先进入设备/data/app目录找到app的包名:
- adb shell
- cd /data/app/
- ls
- 找到包名
| 命令 | 描述 |
|---|---|
| adb uninstall 包名 | 卸载apk 例如:adb uninstall com.yunmall.lc 注意:安装后的包名系统会在末尾加上-1之类的数字,要去掉才可以成功卸载。 软件名称为包名,不要包含.apk |
| adb uninstall -k 包名 | 卸载apk,但是保留配置和缓存文件 例如:adb uninstall -k com.yunmall.lc |
④ 查看包名
| 命令 | 描述 |
|---|---|
| adb shell pm list package | 查看所有已安装的包名 |
| adb shell pm list package -3 | 查看用户安装的第三方应用包名 |
| pm list package |grep "wandou" | 先执行adb shell,进入到shell后,再执行该命令,根据安装包名字查询 |
⑤ 文件读取写入
| 命令 | 描述 |
|---|---|
| adb push 本机文件路径 手机文件路径 | 将文件从PC写入到安卓设备 例如:adb push E:\APP教学\apk\abc.jpg /sdcard/Download/ |
| adb pull 手机文件路径 本机文件路径 | 将文件从安卓设备读取到PC 例如:adb pull /sdcard/Download/server.log E:\APP教学\apk 注意:由于权限问题,不能直接pull到电脑磁盘根目录,否则会报错 |
⑥ 屏幕截图
| 命令 | 描述 |
|---|---|
| adb shell screencap 截图存放路径 | 安卓屏幕截图 例如:adb shell screencap /sdcard/Download/screen.png |
⑦ adb服务启动和关闭
| 命令 | 描述 |
|---|---|
| adb kill-server | 关闭adb服务 |
| adb start-server | 开启adb服务 |
如果5037端口被占用可以使用如下命令释放端口
C:\Users\Shuqing> netstat -ano | findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 11072
TCP 127.0.0.1:5037 127.0.0.1:59519 TIME_WAIT 0
四、Monkey 测试
1. 什么是 Monkey 测试
Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样,不知道程序的任何用户交互方面的知识,就对界面进行无目的、乱点乱按的操作;Monkey 测试是一种为了测试软件的稳定性、健壮性的快速有效的方法;Monkey 程序是 Android 系统自带的,由 Java 语言写成,在 Android 文件系统中的存放路径是: /system/framework/monkey.jar;Monkey 程序需要通过 adb 来运行。
2. 操作步骤
- 安装并配置好 adb 环境
- 连接上安卓设备
- 获取被测的app包名
- 执行Monkey 命令进行测试
3. Monkey 命令说明
adb shell monkey 行为参数 > 日志保存路径
网易新闻monkey案例:
adb shell monkey -p com.netease.newsreader.activity -s 1662160204010 --throttle 100
--pct-touch 30 --ignore-crashes --ignore-timeouts --ignore-security-exceptions
--ignore-native-crashes --monitor-native-crashes -v -v -v 1000 > d:\mylog.log
4. 参数说明
① 常规类命令
| 格式 | 示例 | 说明 |
|---|---|---|
| 数字 | 1000000 | Monkey 测试事件次数 |
| -v | -v -v -v | 每个 -v 都将增加反馈信息的级别。 共3个级别,因此 -v -v -v 可以提供最详细的设置信息。 -v:0级,除启动提示、测试完成和最终结果外提供较少信息 -v -v:1级,提供较详细测试信息,如逐个发送到 Activity 的事件 -v -v -v:2级,提供更详细安装信息,如测试中被选中或未被选中的 Activity |
| > 日志路径 | >d:\mylog.log | Monkey 测试日志记录文件 |
② 约束类命令
| 格式 | 示例 | 说明 |
|---|---|---|
| -p 被测应用包名 | -p com.netease.newsreader.activity | 只针对指定包名进行测试 |
| >-c 一个或多个类别名 | >-c Intent.CATEGORY_LAUNCHER | Monkey 将只允许系统启动这些类别中某个类别列出的 Activity, 如果不指定任何类别,Monkey 将选择 Intent.CATEGORY_LAUNCHER 和 Intent.CATEGORY_monkey 里的 Activity (每个 -c 对应一个类别,指定多个类别时每个类别名前面都需要加上 -c) |
③ 调试类命令
| 格式 | 说明 |
|---|---|
| --ignore-timeouts | Monkey 测试时忽略应用程序发生的超时错误,若发生超时,将继续发送事件给系统,直到事件计数完成(若不设置此项,在遇到超时时,Monkey 将停止运行) |
| --ignore-security-exception | Monkey 测试时忽略程序发生的异常错误,若发生异常,将继续发送事件给系统,直到事件计数完成(若不设置此项,在遇到异常时,Monkey 将停止运行) |
| --ignore-crashes | Monkey 测试时忽略应用程序崩溃(Force&Close错误),若发生奔溃,将继续发送事件给系统,直到事件计数完成(若不设置此项,在遇到奔溃时,Monkey 将停止运行) |
| --ignore-native-crashes | Monkey 测试时忽略本地代码导致的崩溃,若发生崩溃,将继续发送事件给系统,直到事件计数完成(若不设置此项,在遇到本地代码导致的奔溃时,Monkey 将停止运行) |
| --monitor-native-crashes | 监视崩溃时的本地代码 |
| --dbg-no-events | 设置此项后,monkey将进行初始启动,进入到某个测试Activity中不会进一步生成事件,可以监视应用程序所调用的包之间的转换,为了更好的跟踪,一般该项会与-v(日志)、-p(包约束) 和 --throttle (延迟)等联合使用 |
| --hprof | 设置此项后,将在monkey事件序列前后立即生成profilfing report,将在data/misc中生成5MB左右大小的文件 |
| --kill-process-after-error | 设置此项后,当monkey因为应用程序发生错误而停止时,将会通知系统停止发生错误的进程。如果不设置此项,monkey停止时发生错误的应用程度将继续处于运行状态。 |
| --wait-dbg | 在设置此项后,将暂停执行中的monkey,直到有调试器与它连接。 |
④ 事件类命令
| 格式 | 说明 |
|---|---|
| -s 100 | 随机数生成器的 seed 值,如果使用相同的 seed 值再次运行 Monkey,将生成相同的事件序列(也就是说,重复执行刚才的随机操作) |
| --throttle 100 | 事件之间插入的固定延迟,单位毫秒。通过这个选项可以减缓Monkey的执行速度。如果不指定,Monkey将尽可能快的产生并执行事件 |
| --pct-touch 30 | 触摸事件占比,即整个测试过程中,触摸事件占 30%(指在某一位置的一个 down-up 事件,如:点击) |
| --pct-montion 30 | 动作事件占比,即整个测试过程中,动作事件占 30%(指从某一位置接下(即down事件)后经过一系列伪随机事件后弹出(即up事件)) |
| --pct-trackball 30 | 轨迹事件占比(指随机移动事件,以及偶尔跟随在移动事件后面的点击事件) |
| --pct-nav 30 | 基本导航事件占比(指来自方向输入设备的上、下、左、右事件) |
| --pct-majornav 30 | 主要导航事件占比(指引发图形界面的一些动作,如键盘中间按键、返回按键、菜单按键等) |
| --pct-syskeys 30 | 系统按键事件占比(指仅供系统使用的保留按键,如HOME键、BACK键、拨号键、挂断键、音量键等) |
| --pct-appswtich 30 | 应用启动事件占比(指打开应用,通过调用 startActivity() 方法最大限度地开启该 package下的所有应用) |
| --pct-anyevent 30 | 其他事件占比(指上文中未涉及的所有其他事件,如 keypress、不常用的 button 等) |
5. monkey日志分析
① Monkey测试出现错误后,一般的查错步骤分为以下几步:
- 找到monkey日志里面的出错信息
- 程序无响应,ANR问题:在日志中搜索“ANR”
- 崩溃问题:在日志中搜索“CRASH”
- 其他问题:在日志中搜索”Exception”
- 查看Monkey里面出错前的一些事件动作,并手动执行该动作
- 若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样
② 常见异常:
- 算术异常类:ArithmeticExecption
- 空指针异常类:NullPointerException
- 类型强制转换异常:ClassCastException
- 数组负下标异常:NegativeArrayException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 违背安全原则异常:SecturityException
- 文件已结束异常:EOFException
- 文件未找到异常:FileNotFoundException
- 字符串转换为数字异常:NumberFormatException
- 操作数据库异常:SQLException
- 输入输出异常:IOException
- 违法访问错误:IllegalAccessError
- 内存不足错误:OutOfMemoryError
- 堆栈溢出错误:StackOverflowError其他
③ 日志内容解析
Monkey 在运行输出的信息包含一般四类,分别是测试命令信息,事件流信息,异常信息,执行结果信息:
基本信息:
:Monkey: seed=1617866276701 count=100000 // 随机种子值,执行事件数量
:AllowPackage: com.car300.activity // 可运行的应用列表
android.intent.category.LAUNCHER //Category 包含LAUNCHER 和MONKEY:IncludeCategory:
:IncludeCategory: android.intent.category.MONKEY
Event percentages: // 各事件的百分比
// 触摸类事件占15%
0: 15.0% 事件0 :--pct-touch
// 手势类事件占10%
1: 10.0% 事件1 :--pct-motion
// 二指缩放类事件占2%
2: 2.0% 事件2 :--pct-pinchzoom
// 轨迹类事件占15%
3: 15.0% 事件3 :--pct-trackball
// 旋转类事件占0%
4: -0.0% 事件4 :--pct-rotation
// 基本导航类事件占25%
5: 25.0% 事件5 :--pct-nav
//主要导航栏类事件占15%
6: 15.0% 事件6 :--pct-majornav
//系统按键类事件占2%
7: 2.0% 事件7 :--pct-syskeys
//启动activity类事件占2%
8: 2.0% 事件8 :--pct-appswitch
//键盘类事件占1%
9: 1.0% 事件9 :--pct-flip
//其他事件类占13%
10: 13.0% 事件10 :--pct-anyevent
I. 测试命令信息
当命令开始执行测试后,会依次输出相应执行的事件流信息,主要包括前面提到的事件。这部分日志信息解析主要如下所示:
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.car300.activity/com.che300.toc.module.splash.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.car300.activity/com.che300.toc.module.splash.SplashActivity mCallingUid=2000 } in package com.car300.activitySleeping for 300 milliseconds // 每个步骤间隔时长 毫秒
// 轨迹球事件(后面括号里面是表示点击的位置坐标)
:Sending Trackball (ACTION_MOVE) 0:(907.6482,501.939)
// 点击事件(后面括号里面是表示点击的位置坐标)
:Sending Touch (ACTION_DOWN): 0:(338.0,676.0)
:Sending Touch (ACTION_UP): 0:(325.4063,658.7628)
// 延时300ms(每一个事件之间的间隔时间)
Sleeping for 300 milliseconds
//其他事件......
II. 事件流信息
在执行过程中遇到错误或者异常时,会输出相应的信息。这部分日志信息解析主要如下所示:
// 发送Crash 的应用包名和pid
CRASH: com.car300.activity (pid 912)
//Crash 的简要信息(提示文件未找到)
Short Msg: java.lang.ClassNotFoundException
//Crash 的详细信息
Long Msg: java.lang.ClassNotFoundException: Didn't find class
"com.qq.AppService.AstApp" on path DexPathList[[zip file"/data/app/monkey.apk"],nativeLibraryDirectories[/data/app-lib/com.car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
// 机型和系统信息
Build Label: Xiaomi/pisces/pisces:4.4.4/KTU84P/5.12.24:user/release-keys
Build Changelist: 5.12.24
Build Time: 1450958964000
//Crash 的详细日志java.lang.RuntimeException: Unable to instantiate application
com.qq.AppService.AstApp: java.lan.ClassNotFoundException: Didn't find class
"com.qq.AppService.AstApp" on path: DexPathList[[zip fil"/data/app/monkey.apk"],nativeLibraryDirectories=[/data/app-lib/com.car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
at android.app.ActivityThread.access$1500(ActivityThread.java:138)
at dalvik.system.NativeStart.main(Native Method)... 11 more
III. 执行结果信息
1. 当命令执行完所有事件后,会输出相应执行结果信息,其中包括执行的事件数量、旋转的角度、丢失等事件数量、网络状态以及 最终的执行结果。这部分日志信息解析主要如下所示:
// 执行的事件数量
Events injected: 100000
// 旋转的角度为0:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms ,Wi-Fi 0ms ,无网 144ms
2. 如果执行过程中出现了异常导致执行失败,会输出对应的执行失败的原因,比如第几个事件执行失败以及所使用的随机种子数。这部分日志信息解析主要如下所示:
// 显示Monkey 执行失败
** Monkey aborted due to error.
// 执行的事件数量
Events injected: 8
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms,Wi-Fi 0ms,无网 405ms
IV. 异常信息
暂无案例