用户在使用App时,在某些特殊场景会导致应用崩溃,影响用户体验。受用户行为、使用环境、人力成本等多种因素的影响,此类崩溃在测试过程中较难发现。需要通过自动、随机、海量的事件来模拟用户操作,测试软件的边界情况,以提前发现问题,降低版本发布后的崩溃发生。
ADB的全称为Android Debug Bridge,它是Android sdk里的一个工具,用于PC端与Android设备进行交互,adb 的运行原理是PC端的adb server与手机端的守护进程adbd建立连接,然后PC端的adb client通过adb server转发命令,adbd接收命令后解析运行。Monkey 是由Android系统自带的程序,可以向系统发送伪随机的用户事件流(如按键输入、触摸屏输 入、手势输入等),用于操作模拟器或Android真机以模拟用户操作行为。其是Android系统下的一个Monkey.jar,可通过 ”adb shell monkey“ 命令使用。工作原理见下图:
Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序不断输入伪随机的事件流来测试应用的稳定性,检测应用程序的边界。
优点
缺点
Monkey的特点决定如果单纯使用Monkey命令,可覆盖的测试页面及场景不可控,需要在此基础上做进一步的优化。
Monkey支持11种随机事件类型,根据常用操作确认选择模拟7种事件:
事件类型 | 命令 |
---|---|
触摸事件 | --pct-touch |
手势事件 | --pct-motion |
屏幕旋转事件 | --pct-rotation |
主要导航事件 | --pct-majornav |
系统导航事件 | --pct-syskeys |
启动Activiy事件 | --pct-appswitch |
键盘事件 | --pct-flip |
从以上调试参数中选择--ignore-crashes、--ignore-timeouts、--ignore-security-exceptions、--ignore-native-crashes 、--monitor-native-crashes 。
综合上述,使用如下monkey命令进行测试:adb -s 6EB0217427000897 shell monkey -p com.ppdai.loan -s 712 --ignore-timeouts --monitor-native-crashes --ignore-crashes --ignore-security-exceptions --ignore-native-crashes --pct-touch 40 --pct-motion 30 --pct-rotation 5 --pct-majornav 5 --pct-syskeys 2 --pct-appswitch 15 --pct-flip 3 --throttle 500 -v -v -v 500 >D:\test_report\monkeytest.log
根据当前生产环境用户使用的TOP机型及当前测试机,Android手机选择华为Nova7、华为P30、Oppo R15、Vivo X21A、小米MIX2,用于Monkey测试。
问题:
解决方案:
由于Monkey的操作随机,如果只在一级页面做点击、滑动等操作,进入业务流程页面的概率不可控,很难发现问题,故先进入访问量大的页面,再进行Monkey随机操作,增加发现问题的概率。经过对比,最终选择App内部路由跳转方式访问指定页面:
访问Activity方式 | 访问路由方式 |
---|---|
需要开发配合修改配置 | 不需要开发修改配置 |
部分页面Activity重复 | 较少页面路由重复 |
H5页面无法通过Activity方式 | H5页面可通过路由方式访问 |
在Monkey测试中,我们需要对日志文件中的异常进行分析,Monkey测试中主要有三类异常需要关注,分别是Crash、ANR和Exception报错:
日志信息主要包含以下四部分:
为了后续方便排查问题,开启的是最详细的日志记录,在长时间的运行后,产生的日志文件量多,若通过手动查询,耗费时间,通过Python处理文件,程序自动根据日志文件,搜索Crash、ANR、Exception关键词,自动统计异常信息,生成Excel报告。
为了更好的控制Monkey,通过Python封装Monkey命令,设置定时执行,每次开始Monkey测试前,将应用及Monkey进程全部杀掉,以确保测试中不受上一次操作的影响;再通过访问路由进行自动登录,登录完成后通过adb命令进入访问量大的页面(目前已实现指定进入18个常用页面),再发送Monkey指令进行测试,测试完成后自动分析日志,生成报告,流程见下图:
以下是Monkey测试部分流程展示:
Monkey测试是一种为了测试软件稳定性、健壮性的快速有效解决方案,Monkey 测试的所有事件都是随机产生,随机性强且不带人的主观性,经过大量自动化、随机、海量的测试,在一定程度上可以提前发现一些问题。
本文主要介绍了Monkey实践过程中的一些总结和解决问题的思路,希望能给大家一些启发。
hm,信也科技移动团队,如有问题随时沟通!