shell 管理 monkey 压力测试续——监控方案重构及 MCM 监控维护

本文介绍了如何重构监控方案并维护 Monkey 压力测试,包括按执行时间设定测试、case 形式维护Monkey语句、通用函数单独维护、限制组件界面测试的activity范围以及优化MCM监控方案,实现无需root权限的监控。
摘要由CSDN通过智能技术生成

目录

前言:

一、自提需求

1、按设定执行时间方式进行 monkey 测试

2、固定形式的 monkey 语句测试需按 case 形式维护

3、将通用函数单独文件维护,将 shell 脚本的函数部分和控制部分非开维护。

4、组件形式的 app 需要侧重组件的界面进行压力测试,需要将显示的 activity 圈定在一定范围内。

5、把 MCM 监控方案优化维护,维护一个不需要 root 权限的版本。

问题的解决

1、moneky 压力测试方案 V2.0

(1)全局变量及函数维护——function.sh

(2)monkey 执行维护 case——case.sh

(3)主控逻辑——自定义名称.sh

(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&
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值