51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3042|回复: 8
打印 上一主题 下一主题

shell 管理 monkey 压力测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-2-28 13:26:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方案流程:设计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方案(https://testerhome.com/topics/2976) ;电量监控——获取
对应信息格式化为CSV输出走势图,判定关机/死机/重启是否是充电异常导致电量不足;等

7、对收集到的log文件进行脚本分析格式化归类

方式:由于ANR/Force Close/Tombstone是固定格式打印log;根据格式输出的形式简单的归类统计。
**shell逻辑:使用grep+sed+awk,组织逻辑完成了格式化归类为CSV。

二、monkey压力测试执行代码设计

1、monkey执行控制脚本
  1. comment(){
  2. if [ ! -f $testresult/comments.csv ];then
  3.     echo "Date,Error Type,Log Name" >$testresult/comments.csv
  4. fi
  5. echo "`date +%m-%d" "%H":"%M":"%S`,$1,$2" >>$testresult/comments.csv
  6. }

  7. #锁屏函数$1:0--lock;1--unlock;按显示内容判定处理,显示壁纸并且无其他activity则滑屏;黑屏则电源键唤醒加滑屏。
  8. lock(){
  9. local tmp=`wm size|busybox awk '{print $NF}'`
  10. local x=`echo $tmp|busybox awk -F "x" '{print $1}'`
  11. local y=`echo $tmp|busybox awk -F "x" '{print $2}'`
  12. while true;do
  13.     case `dumpsys SurfaceFlinger|grep "|....|"|busybox awk 'BEGIN{r="o"}{if($NF=="com.android.systemui.ImageWallpaper"||$NF=="com.android.systemui.keyguard.leui.KeyguardImageWallpaper")r="l"}END{print NR-1 r}'` in
  14.         "1o")
  15.             local state=0
  16.         ;;
  17.         "3l")
  18.             local state=1
  19.         ;;
  20.         *)
  21.             local state=2
  22.         ;;
  23.     esac
  24.     case $1 in
  25.         0)
  26.             if [ $state -ne 0 ];then
  27.                 input keyevent 26
  28.             else
  29.                 break
  30.             fi
  31.             sleep 1
  32.         ;;
  33.         1)
  34.             if [ $state -eq 0 ];then
  35.                 input keyevent 26&&sleep 1&&input swipe $((x/2)) $((4*y/5)) $((x/2)) $((y/5))
  36.             elif [ $state -eq 1 ];then
  37.                 input swipe $((x/2)) $((4*y/5)) $((x/2)) $((y/5))
  38.             else
  39.                 break
  40.             fi
  41.             sleep 1
  42.         ;;
  43.     esac
  44. done
  45. }

  46. #筛查指定log文件的函数
  47. output_error(){
  48. if [ -f $1 ];then
  49.     local times1=`grep -c "ANR in" $1`
  50.     anr=$((anr+times1))
  51.     local times2=`grep -c "FATAL EXCEPTION" $1`
  52.     fatal=$((fatal+times2))
  53.     local times3=`grep -c "Build fingerprint" $1`
  54.     fingerprint=$((fingerprint+times3))
  55.     if [ $times1 -ne 0 -o $times2 -ne 0 -o $times3 -ne 0 ];then
  56.         if [ ! -d $testresult/log ];then
  57.             mkdir $testresult/log
  58.         fi
  59.         time_name="`date +%Y%m%d%H%M%S`"
  60.         busybox mv $1 $testresult/log/$time_name.log
  61.         bugreport >$testresult/log/$time_name.bugreport
  62.         screencap $testresult/log/$time_name.png
  63.         local result="Error:"
  64.         if [ $times1 -ne 0 -a ! -z "`ls /data/anr 2>/dev/null`" ];then
  65.             mkdir $testresult/log/$time_name
  66.             busybox mv /data/anr/* $testresult/log/$time_name/
  67.             local result=$result"ANR;"
  68.         fi
  69.         if [ $times2 -ne 0 ];then
  70.             local result=$result"FATAL;"
  71.         fi
  72.         if [ $times3 -ne 0 -a ! -z "`ls /data/tombstones 2>/dev/null`" ];then
  73.             if [ ! -d $testresult/log/$time_name ];then
  74.                 mkdir $testresult/log/$time_name
  75.             fi
  76.             busybox mv /data/tombstones/* $testresult/log/$time_name
  77.             local result=$result"tombstones;"
  78.         fi
  79.         comment "$result" "$time_name.log"
  80.     else
  81.         rm $1
  82.     fi
  83. fi
  84. }

  85. #创建$log_f函数,
  86. c_log(){
  87. if [ -f $log_f ];then
  88.     while true;do
  89.         if [ -f $testresult/check_error.log ];then
  90.             sleep 1
  91.         else
  92.             break
  93.         fi
  94.     done
  95.     local p=`busybox ps`
  96.     kill -9 `echo "$p"|grep "logcat -f $log_f -b all -v time"|busybox awk '{print $1}'`
  97.     busybox mv $log_f $testresult/check_error.log
  98. fi
  99. if [ $1 -eq 0 ];then
  100.     logcat -c
  101.     logcat -f $log_f -b all -v time &
  102. fi
  103. if [ -f $testresult/check_error.log ];then
  104.     output_error $testresult/check_error.log
  105.     echo -e "local mac=$mac
  106. build id=$build
  107. ANR=$anr
  108. Fatal=$fatal
  109. tombstone=$fingerprint" >$testresult/statistics.txt
  110. fi
  111. }

  112. #可用空间少于80%,删除ledown下载的视频文件
  113. clear_files(){
  114. if [ `busybox df /sdcard|busybox awk '{r=substr($(NF-1),1,length($(NF-1))-1)}END{print r+0}'` -ge 80 ];then
  115.     rm /sdcard/ledown/*
  116. fi
  117. }


  118. #Global variables
  119. anr=0
  120. fatal=0
  121. fingerprint=0
  122. log_f="/data/check_error.log"
  123. if [ -f $log_f ];then
  124.     rm $log_f
  125. fi
  126. testresult="/data/monkey"
  127. if [ -d $testresult ];then
  128.     rm -r $testresult
  129. fi
  130. mkdir $testresult
  131. mac=`cat /sys/class/net/*/address|busybox sed -n '1p'|busybox tr -d ':'`
  132. build=`getprop ro.build.fingerprint`
  133. if [ -z $build ];then
  134.     build=`getprop ro.build.description`
  135. fi

  136. #等待monkey进程执行完毕函数,如果锁屏则自动解锁
  137. waitmonkey(){
  138. local a=0
  139. while [ $a != 1 ];do
  140.     local a=`/system/bin/ps |grep -c "com.android.commands.monkey"`
  141. done
  142. while [ $a != 0 ];do
  143.     c_log 0
  144.     lock 1
  145.     clear_files
  146.     sleep 10
  147.     local a=`/system/bin/ps |grep -c "com.android.commands.monkey"`
  148. done
  149. c_log 1
  150. }

  151. #等待指定时间,间隔10S筛查log
  152. wait_time(){
  153. local chek_begin=`busybox awk -F. 'NR==1{print $1}' /proc/uptime`
  154. local check=$chek_begin
  155. c_log 0
  156. while true;do
  157.     local chek_end=`busybox awk -F. 'NR==1{print $1}' /proc/uptime`
  158.     if [ $((chek_end-chek_begin)) -ge $1 ];then
  159.         clear_files
  160.         c_log 1
  161.         break
  162.     elif [ $((chek_end-check)) -gt 10 ];then
  163.         local check=$chek_end
  164.         clear_files
  165.         c_log 0
  166.     else
  167.         sleep 1
  168.     fi
  169. done
  170. }

  171. busybox pkill monkey
  172. #以下为monkey脚本逻辑

  173. #如锁屏先解锁
  174. lock 1
  175. #记录开始时间
  176. comment "package" "start test"
  177. #-p package限定执行范围自行调整;事件间隔一般手机500ms,TV遥控器操作频率不高500到1500ms之间按需设定;事件比例按测试目的配置;事件数按时常预估情况设定,此情况25000在1小时左右;
  178. monkey -p package --throttle 500 --ignore-crashes --monitor-native-crashes --ignore-timeouts --ignore-native-crashes --pct-touch 10 --pct-trackball 20 --pct-motion 15 --pct-flip 20 --pct-appswitch 30 --pct-anyevent 5 -v -v -v 25000 1>>$testresult/monkey.log 2>&1 &
  179. #等待结束
  180. waitmonkey
  181. #记录结束时间
  182. comment "com.letv.app.appstore"
  183. #锁屏静置十分钟,自己设定的,下一条前让手机休息下,并且可通过cpu内存监控关注停止monkey后内存是否持续上涨。
  184. lock 0
  185. comment "lock" "lock screen"
  186. wait_time 600
  187. comment "wait_time" "finish wait 600"

  188. #下一条monkey语句

  189. #记录测试结束
  190. comment "finish" "END"
  191. #通知停止监控
  192. echo "`date +%m-%d" "%H":"%M":"%S` stop MCM" > /data/local/tmp/stop
复制代码
2、电量监控——btm


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2018-2-28 13:28:03 | 只看该作者
  1. echo "loop,uptime,battery_capacity,cpu_temperature,battery_voltage,battery_status,battery_health,cpufreq,Date_Time" >/data/btm.csv
  2. loop=0
  3. #判定高通和MTK兼容获取电池温度不同
  4. if [ -f /sys/class/power_supply/battery/temp ];then
  5.     temp="/sys/class/power_supply/battery/temp"
  6. elif [ -f /sys/class/power_supply/battery/batt_temp ];then
  7.     temp="/sys/class/power_supply/battery/batt_temp"
  8. fi
  9. while true;do
  10.     tmp=`cat /proc/uptime /sys/class/power_supply/battery/capacity $temp`
  11.     #判定高通和MTK兼容获取电池温度不同
  12.     if [ -f /sys/class/power_supply/battery/voltage_now ];then
  13.         voltage=$((`cat /sys/class/power_supply/battery/voltage_now`/1000))
  14.     elif [ -f /sys/class/power_supply/battery/batt_vol ];then
  15.         voltage=`cat /sys/class/power_supply/battery/batt_vol`
  16.     fi
  17.     tmp2=`cat /sys/class/power_supply/battery/status /sys/class/power_supply/battery/health`
  18.     part1=`echo $tmp $voltage $tmp2|busybox awk '{a=sprintf("%.0f",$1);b=$3;c=$4/10;d=sprintf("%.3f",$5/1000);e=$6;f=$7}END{printf a","b","c","d","e","f}'`
  19.     part2=`cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq|busybox awk '{if(NR>1)printf "|";printf $1/1000}'`
  20.     data_t=`date +%Y/%m/%d" "%H:%M:%S`
  21.     echo $loop","$part1","$part2","$data_t>>/data/btm.csv
  22.     if [ -f /data/local/tmp/stop ];then
  23.         break
  24.     elif [ `busybox df /data|busybox awk '{r=substr($(NF-1),1,length($(NF-1))-1)}END{print r+0}'` -ge 90 ];then
  25.         echo "The free space of data less 10%,stop" >/data/local/tmp/stop
  26.         break
  27.     fi
  28.     sleep $1
  29.     loop=$((loop+1))
  30. done
复制代码
电量监控图
[color=rgb(0, 105, 214) !important]


[color=rgb(0, 105, 214) !important]



[color=rgb(0, 105, 214) !important]



3、log筛查归类为CSV
  1. fatal(){
  2. echo check_Fatal: $1
  3. grep -E "AndroidRuntime|Force finishing activity|crashApplication" $1|awk -F ":" -v file="$1" -v csv="$2/FATAL_EXCEPTION.csv" -v t1="\"" 'BEGIN{p=0}{if(p==1||p==2){if($4!=" Process"){p=3;c=substr($4,2,length($4)-1)","t1 substr($5,2,length($5)-1) t1}};if($4==" Process"){p=2;b=substr($5,2,length($5)-6)};if($4==" FATAL EXCEPTION"||$4==" *** FATAL EXCEPTION IN SYSTEM PROCESS"){p=1;if(a!="")print file","b","a","c","t1 d t1","t1 r t1 >>csv;a=substr($5,2,length($5)-1);b="SYSTEM PROCESS";r=$0;d=""};if(substr($4,4,15)=="Force finishing")b=substr($4,29,length($4)-28);if($4==" Caused by"){if(d!="")d=d"\n"substr($5,2,length($5)-1);else d=substr($5,2,length($5)-1)};if(p>1){r=r"\n"$0}}END{if(a!="")print file","b","a","c","t1 d t1","t1 r t1 >>csv}'
  4. }

  5. anr(){
  6. echo check_ANR: $1
  7. grep -A 9 "ANR in" $1|awk -F ":" -v file="$1" -v csv="$2/ANR.csv" -v t1="\"" 'BEGIN{p=0}{if(substr($4,2,3)=="ANR"){p=1;if(a!="")print file","a","b","t1 c t1 >>csv;a=t1 substr($4,9,length($4)-8) t1;c=$0};if($4==" PID")p=2;if($4==" Reason")b=t1 $5 t1;if(p>1)c=c"\n"$0}END{if(a!="")print file","a","b","t1 c t1 >>csv}'
  8. }

  9. tombstone(){
  10. echo check_tombstone: $1
  11. grep "DEBUG" $1|awk -F ":" -v file="$1" -v csv="$2/tombstone.csv" -v t1="\"" 'BEGIN{p=0}{if($4==" Build fingerprint"){p=1;if(a!="")print file","a","t1 c t1 >>csv;c=$0};if($4==" Revision")p=2;if($4==" pid")a=substr($NF,1,length($NF)-2);if(p>1)c=c"\n"$0}END{if(a!="")print file","a","t1 c t1 >>csv}'
  12. sed -i 's/log,.*>>> /log,/g;s/ <<*,/,/g' $2/tombstone.csv
  13. }


  14. echo File,Process,Thread,Exception,Exception info,Caused by,Log >$1/FATAL_EXCEPTION.csv
  15. echo File,ANR in,Reason,Log >$1/ANR.csv
  16. echo File,tombstone,Log >$1/tombstone.csv
  17. find $1 -name *.log|xargs grep -l -E ": ANR in|Build fingerprint|FATAL EXCEPTION"|while read log ;do
  18. if [ `grep -c "FATAL EXCEPTION" $log` -ne 0 ];then
  19. fatal $log $1
  20. fi
  21. if [ `grep -c ": ANR in" $log` -ne 0 ];then
  22. anr $log $1
  23. fi
  24. if [ `grep -c "Build fingerprint" $log` -ne 0 ];then
  25. tombstone $log $1
  26. fi
  27. done
  28. if [ `awk 'END{print NR}' $1/FATAL_EXCEPTION.csv` -eq 1 ];then
  29.     rm $1/FATAL_EXCEPTION.csv
  30. fi
  31. if [ `awk 'END{print NR}' $1/ANR.csv` -eq 1 ];then
  32.     rm $1/ANR.csv
  33. fi
  34. if [ `awk 'END{print NR}' $1/tombstone.csv` -eq 1 ];then
  35.     rm $1/tombstone.csv
  36. fi
复制代码



回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2022-5-8 19:23
  • 签到天数: 137 天

    连续签到: 1 天

    [LV.7]测试师长

    5#
    发表于 2018-4-5 21:50:01 | 只看该作者
    试试,能直接用么
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-12-6 11:08
  • 签到天数: 929 天

    连续签到: 1 天

    [LV.10]测试总司令

    6#
    发表于 2018-12-14 13:27:12 | 只看该作者
    可以像楼主好好学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-12-6 11:08
  • 签到天数: 929 天

    连续签到: 1 天

    [LV.10]测试总司令

    7#
    发表于 2018-12-17 10:05:29 | 只看该作者
    这个好,可以学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-12-6 11:08
  • 签到天数: 929 天

    连续签到: 1 天

    [LV.10]测试总司令

    8#
    发表于 2019-2-11 19:20:14 | 只看该作者

    楼主,你贴的这脚本可以直接使用吗?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-27 11:38 , Processed in 0.072216 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表