目录
2、固定形式的 monkey 语句测试需按 case 形式维护
3、将通用函数单独文件维护,将 shell 脚本的函数部分和控制部分非开维护。
4、组件形式的 app 需要侧重组件的界面进行压力测试,需要将显示的 activity 圈定在一定范围内。
5、把 MCM 监控方案优化维护,维护一个不需要 root 权限的版本。
(4)MCM 监控方案脚本优化维护,统一为无 root,控制负载取消并发子进程方式,用类型控制是否获取 heap
前言:
本文将对监控方案进行重构,并介绍如何使用 MCM(Monkey Census and Monitoring)来进行监控和维护。
一、自提需求
1、按设定执行时间方式进行 monkey 测试
目的:避免无法按事件数预知准确时间,设定 monkey 压力测试 1 小时就是执行 1 小时测试。
方式:按 10000 事件数执行 monkey 测试,到设定时长则 kill monkey 进程,未达到则重复执行。
2、固定形式的 monkey 语句测试需按 case 形式维护
目的:由于交付的执行人员不一定懂 monkey,固定的执行写成 case 便于执行人员调用,同时也是简化主控制逻辑的维护方式。
方式:维护 case.sh 作为 moneky 执行方式的维护脚本
沿用:这里我沿用了之前想到要看下 mongkey 测试结束后等待一会(如 10 分钟),看下内存是否会继续上涨,就在设计时加入了测试结束后等待 10 分钟再停止应用;停止应用是为了避免之前测试后的状态影响下一个包的测试,就释放掉了进程。
3、将通用函数单独文件维护,将 shell 脚本的函数部分和控制部分非开维护。
目的:为了方便通用函数的复用,同时也是为了建立自己的一种写脚本模式。
方式:function.sh 维护全局变量和自定义函数,source 命令加载
4、组件形式的 app 需要侧重组件的界面进行压力测试,需要将显示的 activity 圈定在一定范围内。
目的:对于无法单包执行的组件 app,通过和依赖包一起测试完成压力测试需求。
方式:两个包进行测试,其中一个是调用组件的 app,另一个是独立的组件 app;monekey 执行后,使用一个子进程轮询判定 SurfaceFlinger 是否包含组件包名,如果不包含则使用长按键事件或 am start 组件 activity 的形式使组件画面显示;monekey 事件类型则只配操作不配置 appswitch。
5、把 MCM 监控方案优化维护,维护一个不需要 root 权限的版本。
目的:想增加自己设计的 MCM 监控方案的适用性
方式:使用 push busybox 到/data/local/tmp,调用此 busybox 命令进行脚本监控。
问题的解决
1、moneky 压力测试方案 V2.0
(1)全局变量及函数维护——function.sh
#!/system/bin/sh
########## Global Variable ##########
if [ -f /data/local/tmp/busybox ];then
export bb="/data/local/tmp/busybox"
else
echo "No /data/local/tmp/busybox"
exit
fi
if [ -f /data/local/tmp/stop ];then
$bb rm /data/local/tmp/stop
fi
#Test Result Folder
export testresult="/data/local/tmp/monkey"
if [ -d $testresult ];then
$bb rm -r $testresult
fi
mkdir -p $testresult/log
#android version
export android=`getprop ro.build.version.release|$bb awk -F. '{print $1}'`
#root
export root=`id|$bb grep -c root`
########## Function ##########
#Add comments to comments.csv
comment(){
if [ ! -f $testresult/comments.csv ];then
echo "Date,Tag,Comments,Info" >$testresult/comments.csv
fi
echo "`date +%m-%d" "%H":"%M":"%S`,$1,$2,$3" >>$testresult/comments.csv
}
#Create Log
c_log(){
if [ -f $testresult/error.pid ];then
local E_pid=`$bb awk 'NR==1{print $NF}' $testresult/error.pid`
if [ -d /proc/$E_pid ];then
if [ $1 -eq 0 ];then
comment "c_log" "error.pid is running, exit." "$E_pid"
exit
elif [ $1 -eq 1 ];then
comment "c_log" "error.pid is running, kill." "$E_pid"
kill -9 $E_pid 2>/dev/null
fi
else
comment "c_log" "exist error.pid, not running" "$E_pid"
fi
$bb rm $testresult/error.pid
fi
if [ $1 -eq 0 ];then
logcat -c
if [ `cat /sys/devices/virtual/thermal/thermal_zone*/type|grep -c mtk` -eq 0 ];then
logcat -v time -s AndroidRuntime:E ActivityManager:E DEBUG:F >$testresult/error.log &
else
logcat -v time -s AndroidRuntime:E ANRManager:E AEE/DEBUG:F >$testresult/error.log &
fi
local tmp=`$bb ps`
echo "$tmp"|$bb grep "logcat -v time -s"|$bb awk 'NR==1{print $1}' >$testresult/error.pid
comment "c_log" "Start error.pid." "`$bb awk 'NR==1{print $NF}' $testresult/error.pid`"
fi
}
#wait time between monkey test case
wait_time(){
local chek_begin=`$bb awk -F. 'NR==1{print $1}' /proc/uptime`
while true;do
if [ $((`$bb awk -F. 'NR==1{print $1}' /proc/uptime`-chek_begin)) -ge $1 ];then
break
elif [ -f $testresult/monkey_error.txt ];then
break
else
$bb sleep 5
fi
done
}
########## monkey function ##########
#longpress to resume app.
#$1-keycode; $2-package name; $3-running time
longpress(){
local chek_begin=`$bb awk -F. 'NR==1{print $1}' /proc/uptime`
while true;do
if [ $android -eq 6 ];then
local tmp=`dumpsys SurfaceFlinger|$bb grep "|......|"`
else
local tmp=`dumpsys SurfaceFlinger|$bb grep "|....|"`
fi
if [ `echo "$tmp"|$bb grep -c "$2"` -eq 0 ];then
input keyevent --longpress $1
fi
if [ $((`$bb awk -F. 'NR==1{print $1}' /proc/uptime`-chek_begin)) -ge $3 ];then
break
else
$bb sleep 1
fi
done
}
#longpress keycode 3 and 4 one by one: $1-package of keycode 3; $2-package of keycode 4; $3-sleep time; $4-running time
longkey(){
local l_key=3
local chek_begin=`$bb awk -F. 'NR==1{print $1}' /proc/uptime`
local package=$1
while true;do
if [ $android -eq 6 ];then
local tmp=`dumpsys SurfaceFlinger|$bb grep "|......|"`
else
local tmp=`dumpsys SurfaceFlinger|$bb grep "|....|"`
fi
if [ `echo "$tmp"|$bb grep -c "$package"` -eq 0 ];then
input keyevent --longpress $l_key
fi
if [ $((`$bb awk -F. 'NR==1{print $1}' /proc/uptime`-chek_begin)) -ge $4 ];then
break
else
$bb sleep $3
fi
case $l_key in
3)
local l_key=4
local package=$2
;;
4)
local l_key=3
local package=$1
;;
esac
done
}
#longam to resume app.
#2 args: $1-package name; $2-running time;
#3 args: $1-package name; $2-running time; $3-activity(more than 1 activity: spilt by | . run them one by one);
longam(){
case $# in
2)
local activity=`dumpsys activity $1|$bb grep ACTIVITY|$bb awk 'NR==1{print $2}'`
local a_loops=1
;;
3)
local activity="$3"
local a_loops=`echo "$3"|$bb awk -F"|" '{print NF}'`
;;
esac
if [ ! -z "$activity" ];then
local chek_begin=`$bb awk -F. 'NR==1{print $1}' /proc/uptime`
local i=1
while true;do
if [ $android -eq 6 ];then
local tmp=`dumpsys SurfaceFlinger|$bb grep "|......|"`
else
local tmp=`dumpsys SurfaceFlinger|$bb grep "|....|"`
fi
if [ `echo "$tmp"|$bb grep -c "$1"` -eq 0 ];then
if [ $a_loops -gt 1 ];then
local activity="`echo "$3"|$bb awk -F"|" -v P=$i '{print $P}'`"
if [ $i -lt $a_loops ];then
local i=$((i+1))
else
local i=1
fi
fi
local am_start=`am start $activity 2>&1`
if [ `echo "$am_start"|$bb grep -c "Error"` -ne 0 ];then
comment "longam" "am_error" "$am_start"
fi
fi
if [ $((`$bb awk -F. 'NR==1{print $1}' /proc/uptime`-chek_begin)) -ge $2 ];then
break
else
$bb sleep 1
fi
done
else
comment "longam" "No activity" "$1"
wait_time $2
fi
}
monkey_test(){
if [ -f $testresult/monkey_error.txt ];then
$bb rm $testresult/monkey_error.txt
fi
case $# in
3)
sh /data/local/tmp/case.sh $1 $2 "$3" &
;;
4)
sh /data/local/tmp/case.sh $1 "$2" "$3" "$4" &
;;
*)
echo "Args are wrong!!!"
exit
;;
esac
}
#if timeout, kill case.sh: $1-wait time
monkey_timeout(){
wait_time $(($1+600))
local chek_begin=`$bb awk -F. 'NR==1{print $1}' /proc/uptime&