Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2268509
  • 博文数量: 293
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2170
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-31 14:30
个人简介

自己慢慢积累。

文章分类

全部博文(293)

分类: 项目管理

2017-04-27 15:12:05


请查看原文:
BOCY的专栏: http://blog.csdn.net/prjay/article/details/50429083

基于jmeter和shell的接口性能自动化

1. 总体需求

由于性能中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用晚上时间快速重测性能接口可以解放人工测试的时间,让测试人员可以把精力集中在测试复杂接口,调优分析性能瓶颈上。

2. 实现流程

自动化的场景模拟真实手工测试,操作步骤和手工测试一样。开始读取接口测试用例执行用例,发起服务器监控收集执行结果和监控结果执行完所有用例?整理结果,发送邮件结束yesno

3.准备工作

准备软件:

  • 系统环境:CentOS release 6.7 (Final)
  • 内核版本:Linux localhost 2.6.32-573.7.1.el6.x86_64
  • 测试工具:apache-jmeter-2.13 
  • 运行JDK环境:
  • python环境:Python 2.6.6
  • 服务器监控nmon:

4.具体实现

4.1用例执行

Jmeter的执行支持命令行的方式执行,并且会有一个粗略报告,我们取这个报告里面的执行结果并保存下来 
Jmeter的执行结果:

点击(此处)折叠或打开

  1. [root@localhost bin]# ./jmeter -n -t singin.jmx
  2. Creating summariser <summary>
  3. Created the tree successfully using singin.jmx
  4. Starting the test @ Mon Dec 14 16:42:33 CST 2015 (1450082553651)
  5. Waiting for possible shutdown message on port 4445
  6. summary + 1 in 1s = 1.3/s Avg: 268 Min: 268 Max: 268 Err: 0 (0.00%) Active: 1 Started: 1 Finished: 0
  7. summary + 2 in 0s = 50.0/s Avg: 17 Min: 14 Max: 20 Err: 0 (0.00%) Active: 0 Started: 1 Finished: 1
  8. summary = 3 in 1s = 3.7/s Avg: 100 Min: 14 Max: 268 Err: 0 (0.00%)
  9. Tidying up ... @ Mon Dec 14 16:42:34 CST 2015 (1450082554551)
  10. ... end of run


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

由sumary统计行可以得到我们需要收集的测试结果:

测试结果项
总请求数 3
平均tps 3.7
平均响应时间 100ms
请求失败率 0.00%


主流程脚本

点击(此处)折叠或打开

  1. #/bin/bash

  2. source /etc/profile
  3. Jmeter_Home='/usr/local/apache-jmeter-2.13'
  4. TestReport='/data/loadtest/report'
  5. LogDIR='/data/loadtest/log'
  6. Date=`date +"%F"`
  7. cd /data/loadtest/
  8. >summary.txt
  9. #清理上次执行结果
  10. run_test()
  11. {
  12. #获取测试用例
  13.  for i in `find ./testcase/ -name *.jmx|awk -F '.' '{print $2}'`
  14.   do
  15.   casename=`echo "$i"|awk -F '/' '{print $4}'`
  16.   >log/${casename}.txt
  17.   echo -n "$i ">>summary.txt
  18.   #发起监控
  19.   ./monitor.sh >/dev/null 2>&1 &
  20.   #开始执行测试
  21.   $Jmeter_Home/bin/jmeter -n -t /data/loadtest${i}.jmx >>log/${casename}.txt &
  22.   sleep 310
  23.   #如果执行310s还未结束,强制终止执行
  24.   ps -ef | grep java |grep -v grep | awk '{print $2}' |xargs kill -9
  25.   sleep 3
  26.   #提取结果
  27.   grep 'summary =' log/${casename}.txt| tail -1 |awk -F '[\t / (]+' '{if($7>10000 && $17<10.00){printf("%s %d %d %d %.2f% pass ",$7,$10,$3,$16,100-$17)}else{printf("%s %d %d %d %.2f%% fail ",$7,$10,$3,$16,100-$17)}}'>>summary.txt
  28.   cat monitor.txt >>summary.txt
  29.   echo '' >> summary.txt
  30.   #获取关键日志
  31.   ssh 10.1.30.54 'tail -n 300 /data/logs/fcuh-user/catalina.out'>${LogDIR}${i}.log
  32.  done
  33. }
  34. run_test
  35. sleep 3
  36. #生成html报告
  37. sh genHTML.sh
  38. sleep 1
  39. #发送邮件
  40. python sendmail.py


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

4.2服务器监控

服务器资源收集方面,选用的是nmon监控工具,因为它可以后台收集结果保存到文件。由于每个用例测试5分钟,所以只需要监控300秒,每5s监控一次,对应命令:

点击(此处)折叠或打开

  1. nmon -f -t -s5 -c60 -F /data/test.nmon


		
  • 1
  • 1

测试用例跑完再读取这个结果文件,获取有用的信息 
当前只统计了磁盘io和cpu的占用率信息,原始文件保存在本地目录,如果需要,可以手动查看到。 
监控脚本:

点击(此处)折叠或打开

  1. #!/bin/bash
  2. #读取监控服务器列表
  3. SERVERLIST=`cat serverlist`
  4. DATE=`date +'%F'`
  5. mkdir -p /data/loadtest/monitor/$DATE
  6. TIME=`date +'%T'`
  7. #发起监控
  8. for i in $SERVERLIST
  9. do
  10.   ssh $i 'nmon -f -t -s5 -c60 -F /data/test.nmon >/dev/null 2>&1 &'
  11. done
  12. #监控5分钟
  13. sleep 303
  14. >monitor.txt
  15. #收集监控结果,保存到monitor.txt
  16. for i in $SERVERLIST
  17. do
  18.  scp $i:/data/test.nmon /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon
  19.  io=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "DISKBUSY,T" | awk -F ',' '{sum+=$3} END {printf("%.2f%",sum/NR)}'`
  20.  cpu=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "CPU_ALL,T" | awk -F ',' '{sum+=$6} END {printf("%.2f%",100-sum/NR)}'`
  21.  #net=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "NET,T"|awk -F ',' '{sum_r+=$4}{sum_w+=$6} END {print sum_r/NR,sum_w/NR}'`
  22.  echo -n "${cpu} ${io} ">>monitor.txt
  23. done


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

将用例执行结果和监控结果都汇总到summary.txt里 
生成的格式如下,方便后面生成html格式的报告

点击(此处)折叠或打开

  1. [root@localhost loadtest]# cat summary.txt
  2. /testcase/user/获取用户自己的信息 10748.6 8 3225296 0 100.00% pass 32.87% 5.34% 81.59% 2.12% 0.15% 1.78% 12.13% 32.83% 17.18% 6.14%
  3. /testcase/user/未读消息数 11487.4 7 3446960 0 100.00% pass 32.33% 12.57% 69.02% 1.86% 0.18% 1.74% 13.55% 35.85% 18.56% 7.65%


		
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

服务器监控脚本

点击(此处)折叠或打开

  1. #!/bin/bash

  2. SERVERLIST=`cat serverlist`
  3. DATE=`date +'%F'`
  4. mkdir -p /data/loadtest/monitor/$DATE
  5. TIME=`date +'%T'`
  6. for i in $SERVERLIST
  7. do
  8.   ssh $i 'nmon -f -t -s5 -c60 -F /data/test.nmon >/dev/null 2>&1 &'
  9. done

  10. sleep 303
  11. >monitor.txt
  12. for i in $SERVERLIST
  13. do
  14.  scp $i:/data/test.nmon /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon
  15.  io=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "DISKBUSY,T" | awk -F ',' '{sum+=$3} END {printf("%.2f%",sum/NR)}'`
  16.  cpu=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "CPU_ALL,T" | awk -F ',' '{sum+=$6} END {printf("%.2f%",100-sum/NR)}'`
  17.  echo -n "${cpu} ${io} ">>monitor.txt
  18. done


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

4.3生成html报告


点击(此处)折叠或打开

  1. #!/bin/sh
  2. >index.html
  3. echo "Content-Type\" content=\"text/html; charset=utf-8\"/>用户端自动化性能测试报告">>index.html
  4. echo `cat style.css`>>index.html
  5. (
  6. cat <<EOF
  7. <script language="JavaScript">
  8.                function show_detail(detail){
  9.                            if(detail.style.display=="none"){
  10.                            detail.style.display="";
  11.                            }
  12.                            else{
  13.                            detail.style.display="none";
  14.                            }
  15.                            }
  16.                            </script>
  17. EOF
  18. )>>index.html
  19. echo "

    用户端自动化性能测试报告


    ">"
    >>index.html
  20. sum=`cat summary.txt | wc -l`
  21. sucess=`cat summary.txt|grep pass |grep -v grep|wc -l`
  22. fail=`expr $sum - $sucess`
  23. rate=`echo "$sucess $sum"|awk '{printf("%.2f%%",$1/$2*100)}'`
  24. (
  25. cat <<EOF
  26. <table><tr><td>
  27. <h2>结果汇总</h2>
  28. <table width="60%" cellspacing="2" cellpadding="5" border="0" class="details" align="left">
  29. <tr><th>总接口数</th><th>成功接口数</th><th>失败接口数</th><th>测试通过率</th></tr>
  30. <tr align="center"><td>$sum</td><td>$sucess</td><td>$fail</td><td>$rate</td></tr>
  31. </tr></table>
  32. </td></tr>
  33. EOF
  34. )>>index.html
  35. (
  36. cat <<EOF
  37. <tr><td>
  38. <h2>概要结果</h2>
  39. <table width="95%" cellspacing="2" cellpadding="5" border="0" class="details" align="left">
  40. <tr valign="top">
  41. <th>测试接口</th><th>每秒请求数(tps)</th><th>平均响应时间(ms)</th><th>总事务数</th><th>失败事务数</th><th>事务成功率</th><th>测试结果</th>
  42. </tr>
  43. <tr valign="top" class="">
  44. EOF
  45. )>>index.html
  46. cat summary.txt |while read line
  47. do
  48.   echo $line | awk '{if($7=="pass"){print ""$1""$2""$3""$4""$5""$6""$7""}else{print ""$1""$2""$3""$4""$5""$6""$7""}}'>>index.html
  49. done
  50. echo "">>index.html
  51. echo "
    ">测试结果pass标准:tps>10000且事务成功率>90%

    javascript:show_detail(detail)\">详细结果查看附件

    "
    >>index.html
  52. #echo "
    page_details_expanded\" id=\"detail\" style=\"display:none;\" width=\"95%\">">>index.html
  53. (
  54. cat <<EOF
  55. <table width="95%" cellspacing="2" cellpadding="5" border="0" class="details" align="left" id="detail" style="display:none">
  56. <tr valign="top">
  57. <th>测试接口</th><th>每秒请求数tps</th><th>平均响应时间(ms)</th><th>总事务数</th><th>失败事务数</th><th>成功率</th><th>测试结果</th><th>nginx服务器cpu</th><th>nginx服务器io</th><th>web服务器cpu</th><th>web服务器io</th><th>service服务器cpu</th><th>service服务器io</th><th>主数据库服务器cpu</th><th>主数据库服务器io</th><th>从数据库服务器cpu</th><th>从数据库服务器io</th>
  58. </tr>
  59. <tr valign="top" class="">
  60. EOF
  61. )>>index.html
  62. j=1
  63. for i in `cat summary.txt`
  64. do
  65.    if [ `expr $j % 17 ` != 0 ]; then
  66.       echo ''$i''>>index.html
  67.    else
  68.       echo ''$i''>>index.html
  69.    fi
  70.    j=`expr $j + 1`
  71. done
  72. echo " ">>index.html


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

html样式表(CSS)

点击(此处)折叠或打开

  1. <style type="text/css">
  2. body {
  3.         font:normal 68% verdana,arial,helvetica;
  4.         color:#000000;
  5.      }
  6. table tr td, table tr th {
  7.          font-size: 78%;
  8.      }
  9. table.details tr th{
  10.          color: #ffffff;
  11.          font-weight: bold;
  12.          text-align:center;
  13.          background:#2674a6;
  14.          white-space: nowrap;
  15.      }
  16. table.details tr td{
  17.         background:#eeeee0;
  18.         white-space: nowrap;
  19.      }
  20. h1 {
  21.         margin: 0px 0px 5px; font: 265% verdana,arial,helvetica
  22.    }
  23. h2 {
  24.         margin-top: 1em; margin-bottom: 0.5em; font: bold 185% verdana,arial,helvetica
  25.    }
  26. h3 {
  27.         margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
  28.    }
  29. .Failure {
  30.         font-weight:bold; color:red;
  31.    }
  32. .Pass {
  33.         font-weight:bold; color:green;
  34.    }
  35. </style>


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

4.4发送测试结果邮件

发邮件脚本

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. #coding: utf-8
  3. import string
  4. import smtplib
  5. import os
  6. import datetime
  7. from email.mime.multipart import MIMEMultipart
  8. from email.mime.text import MIMEText
  9. from email.mime.base import MIMEBase
  10. from email.header import Header

  11. today = datetime.date.today()
  12. sender = 'xx@xx.com'
  13. receiverlist = ["a@a.com","b@b.com","c@c.com"]
  14. subject = '%s %s' % ('用户端自动化性能测试报告',today)
  15. smtpserver = 'smtp.exmail.qq.com'
  16. username = 'xx@xx.com'
  17. password = 'xxx'
  18. f = open('index.html',"r")
  19. content = f.read()

  20. #msg = MIMEText(content,'html','utf-8')
  21. msg = MIMEMultipart()
  22. msg.attach(MIMEText(content,'html','utf-8'))

  23. msg['From'] = 'xx@xx.com'
  24. msg['to'] = ','.join(receiverlist)
  25. msg['Subject'] = subject

  26. att=MIMEText(open('index.html','rb').read(),'base64','gb2312')
  27. att["Conten-Type"]='application/octet-stream'
  28. att["Content-Disposition"]='attachment;filename="Load test result.html"'
  29. msg.attach(att)

  30. smtp = smtplib.SMTP()
  31. smtp.connect(smtpserver)
  32. smtp.ehlo()
  33. smtp.starttls()
  34. smtp.ehlo()
  35. #smtp.set_debuglevel(1)
  36. smtp.login(username, password)
  37. smtp.sendmail(msg['From'],msg['to'],msg.as_string())
  38. smtp.quit()


		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

测试结果截图: 
结果邮件

阅读(1459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~