一篇文章搞明白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、安卓、鸿蒙里面的一些主流机型

不知不觉码了这么多字,好久没写文章,希望这些信息能给小伙伴们带来帮助。

posted @ 2025-05-14 14:59  寻虫测试  阅读(50)  评论(0)    收藏  举报