移动端测试

学习目标

  • 熟练掌握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

执行:taskkill -f -pid XXX

四、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. 异常信息

暂无案例