目录
设计调整方案的持续过程中,根据测试最终目的和提高执行及结果分析效率的需求,不断给自己提出目标需求,不断改进如下:
2、monkey 的 log 除记录操作同时记录监控到的 ANR 和 crash
注:其中包名,事件比例,事件数需定制调整;正常 monkey 的 log 为 1 输出流,异常的为 2,追加写在同一个文件内。
注:当前项目未有此需求,每次测试手工初始化,暗码开启离线 log 等。所以一直未设计这部分,实现逻辑上是可行的。
前言:
在开发应用程序时,我们需要对其进行各种测试,以确保其稳定性和可靠性。其中,monkey 测试是一种常用的压力测试方法,它可以模拟用户的使用行为,测试应用程序在高负载下的表现。本文将介绍如何使用 shell 脚本来进行 monkey 测试,并简单提到如何监控测试过程。
方案流程:设计 monkey 语句-->套用脚本方案执行-->收集结果脚本统计分析-->分析监控数据-->提交 bug。
- 修改 moneky.sh(主控脚本)中的 monkey 语句后批处理一键执行。
- 方案不仅包含了执行,还包括了 ANR/Force Closed/tombstone 的归类筛查,快速去重。
- 执行方式易于交付给懂 monkey 语法可设计 monkey 语句压测逻辑的执行人员,或固定脚本执行。
一、monkey 压力测试执行需求设计
设计调整方案的持续过程中,根据测试最终目的和提高执行及结果分析效率的需求,不断给自己提出目标需求,不断改进如下:
1、多条 monkey 语句依次执行
逻辑:执行 monkey 语句-->判定 monkey 进程产生-->等待 monkey 进程结束-->循环。
控制脚本:shell 脚本控制流程逻辑,设备端后台运行(&符后台执行)
优势:
- 组合不同 monkey 脚本进行整体测试;
- 设备端独立完成;
- 可连接线充避免手机电量不足;
- 可以对手机状态和 app 状态进行控制;
- 可同步进行 log 分析处理;
- 等多进程操作。
2、monkey 的 log 除记录操作同时记录监控到的 ANR 和 crash
方法:
monkey -p 包名 --throttle 500 --ignore-crashes --monitor-native-crashes --ignore-timeouts --ignore-native-crashes 事件比例 -v -v -v 事件数 1>>monkey.log 2>&1 &
注:其中包名,事件比例,事件数需定制调整;正常 monkey 的 log 为 1 输出流,异常的为 2,追加写在同一个文件内。
筛查:monkey.log 查找 anr 及 crash 了解异常前的 monkey 操作及异常 log。
3、轮询筛查 logcat 减少长时间抓取的 log 量
方式:控制间隔轮询筛查 logcat 有 ANR/FC/Tombstone 则保留,否则删除。
添加位置:“等待 moneky 进程结束” 阶段
统计字段:ANR——"ANR in";Force Closed——"FATAL EXCEPTION";tombstone——"Build fingerprint";
额外获取:bugreport;判定时刻截图
4、当前状态检查处理异常情况
按需设计:锁屏则自动解锁;存储空间不够则删除下载目录的文件;等。
5、初始化及控制执行页面
按需设计:执行前初始化 app 状态,存档;已运行状态执行/未运行状态执行 monkey;显示的 Activity 非目标页面,操作页面返回;等。
注:当前项目未有此需求,每次测试手工初始化,暗码开启离线 log 等。所以一直未设计这部分,实现逻辑上是可行的。
逻辑:shell 脚本写具体功能的 case 函数在 monkey 语句前执行;通过 SurfaceFlinger,window 等服务获取状态判定处理;通过 case 语句涵盖所有场景的处理方式,依据判定信息进行选择处理;放在等待 monkey 进程结束的判定循环内。
6、配合监控脚本抓取数据
方式:监控进程和 monkey 脚本进程以多进程形式运行;依次运行后台脚本即可
同步:监控进程触发条件停止,触发条件为指定文件名存在,moneky 脚本结束前创建此文件通知监控停止。
监控内容:CPU/内存——mcm 方案 ;电量监控——获取对应信息格式化为 CSV 输出走势图,判定关机/死机/重启是否是充电异常导致电量不足;等
7、对收集到的 log 文件进行脚本分析格式化归类
方式:由于 ANR/Force Close/Tombstone 是固定格式打印 log;根据格式输出的形式简单的归类统计。
**shell 逻辑:使用 grep+sed+awk,组织逻辑完成了格式化归类为 CSV。
二、monkey 压力测试执行代码设计
1、monkey 执行控制脚本
#!/system/bin/sh
#添加备注到comments.csv
comment(){
if [ ! -f $testresult/comments.csv ];then
echo "Date,Error Type,Log Name" >$testresult/comments.csv
fi
echo "`date +%m-%d" "%H":"%M":"%S`,$1,$2" >>$testresult/comments.csv
}
#锁屏函数$1:0--lock;1--unlock;按显示内容判定处理,显示壁纸并且无其他activity则滑屏;黑屏则电源键唤醒加滑屏。
lock(){
local tmp=`wm size|busybox awk '{print $NF}'`
local x=`echo $tmp|busybox awk -F "x" '{print $1}'`
local y=`echo $tmp|busybox awk -F "x" '{print $2}'`
while true;do
case `dumpsys SurfaceFlinger|grep "|....|"|busybox awk 'BEGIN{r="o"}{if($NF=="com.android.systemui.ImageWallpaper"||$NF=="com.android.systemui.keyguard.leui.KeyguardImageWallpaper")r="l"