一篇文章搞明白app崩溃的模拟测试
简述
平时较少接触app类的专项测试,近期工作上遇到有app频繁出现崩溃的问题,虽然后续改进后出现崩溃的概率有所下降,但是还是偶发会出现崩溃的现象,比较让人难受,故对此开展专项测试。
app崩溃的原因
常见影响 APP 稳定性的原因有以下几种:
●碎片化
由于手机型号多种,分辨率、软硬件信息各不同,所以不同的手机兼容上可能会出现不匹配导致崩溃。
● 内存问题
app 所需内存超过设备限制(如可用内存过低时),导致 app 崩溃闪退
app 内存泄漏,耗尽设备全部内存导致整个系统崩溃
app 内存越界,使用了非授权的内存位置导致 app 崩溃
● 程序逻辑错误
数组越界,如负数索引、超过数组长度的索引
堆栈溢出,如堆栈区缓冲区被填满,堆栈空时取数据等
并发操作,如并发时调用了一个已释放的指针
逻辑错误,如 0 除作为除数问题
● 交互逻辑
app 界面交换操作滑动导致 app 崩溃
● 未处理等中断及异常
app 在使用过程中面临很多中断、如切后台、接听电话、切换网络、断网以及用户的一些非预期操作
● 网络因素
比如网络不佳、弱网环境,无法达到 app 所需的快速响应时间,导致 app 崩溃
不同网络的切换
对症下药
app页面交互的模拟(monkey)
monkey工具顾名思义,意思为像一只好奇的猴子一样随机敲击app的界面,你无法预知它下一步会如何操作,随机胡乱点击页面,用于测试app的稳定性。
monkey的下载与配置
第一步:进入链接https://www.androiddevtools.cn/#,下载下图中的包
下载下来后解压出来,把文件夹的地址配置到环境变量path中
第二步:进入cmd,输入adb,敲击回车,输入 adb monkey 敲击回车,若都有信息,证明已经安装成功
monkey与被测机器的连接
一、monkey通过USB连接到真机上
第一步:手机打开开发者模式,在USB调试中勾选打开
第二步:手机通过数据线连接上计算机,在cmd 上输入adb devices,若显示设备信息,则连接成功
二、monkey通过局域网连接到真机
第一步:手机wifi连接确保和计算机在同一个局域网
第二步,通过本地路由或者其他wifi工具找到手机的ip地址,cmd上输入 adb connect 192.168.x.xxx,若连接上了会提示连上了这个ip的5555端口,当然,和上面一样,手机前提是要开启开发者模式,把允许USB调试打开。
三、monkey连接模拟器
本地上装上夜神或者其他的安卓模拟器,然后步骤同一,adb devices即可
monkey测试指令
-p
eg:adb shell monkey -p package.name -v times
-p表示对象包
–v 表示日志级别
package.name 表示apk的包名
times 表示运行次数
如何获取被测app包名 指令:adb shell
logcat|grep START
然后启动你的app就可以在最后一行看到你app的包名,一般是com.xxxx.xxxx
monkey指定事件测试
触摸事件 --pct-touch
动作事件 --pct-motion
轨迹球事件 --pct-trackball
基本导航事件 --pct-nav
主要导航事件 --pct-majornav
系统导航事件 --pct-syskeys
应用启动事件 --pct-appswitch
其它类型事件 --pct-anyevent
指令:adb shell monkey -p package.name -v --pct-touch 100 (代表进行100次触屏事件)
monkey时间延迟
--throttle<毫秒>
指令:adb shell monkey -p package.name -v --pct-touch 100 --throttle 1000 (代表进行100次触屏事件每次操作间隔1秒)
忽略异常
--ignore-crashes忽略Crash参数
--ignore-timeouts忽略ANR参数
输出指定位置日志
adb shell monkey -p com.xxx.xxxx -v -v -v --pct-touch 100 --ignore-crashes --ignore-timeouts --throttle 1000 100 >>F:\log.txt
通过日志排查app崩溃原因
java.lang.NullPointerException空指针异常
java.lang.ArrayIndexOutofBoundsException数组溢出
java.lang.ClassNotFoundException类不存在
java.lang.ArithmeticException数学运算异常
java.lang.IllegalArgumentException方法参数异常
java.io.FileNotFoundException文件未找到
java.lang.NumberFormatException数值转化异常
java.lang.StackOverflowError堆栈异常错误
java.lang.OutOfMemoryError内存溢出错误
网络原因的崩溃场景模拟
因为网络异常导致设备响应不过的问题导致app崩溃卡死等现象,这块的模拟倒是简单很多,通过我们很多的弱网测试工具可以模拟,比如模拟我们2G-4G的网络信号
信号值参考:
弱网测试工具
弱网测试工具有很多,常用的有fiddler、Qnet、甚至自己电脑上的路由器和wifi管理软件都可以做到,像下面那样:
多款真机模拟
最开头所述,真机千千万万,直接找到这么多不同的真机是不可能的,但所幸目前一些大的平台上都有提供真机模拟服务,若不需要过于耗费精力搜集真机,直接购买平台服务也是个不错的选择。
其他兼容策略
若不想购买这些服务的话,建议就是拿目前比较流行的几款设备和系统来应用即可,无非就是IOS、安卓、鸿蒙里面的一些主流机型
不知不觉码了这么多字,好久没写文章,希望这些信息能给小伙伴们带来帮助。