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

目录

前言:

1. 总体需求

2. 实现流程

3.准备工作

4.具体实现

4.1 用例执行

主流程脚本

4.2 服务器监控

监控脚本:

服务器监控脚本

4.3 生成 html 报告

html 样式表

发邮件脚本


前言:

基于JMeter和Shell的接口性能自动化是一种有效的方法,可以帮助测试团队提高测试效率和准确性。JMeter作为性能测试工具,可以模拟并发用户对接口进行请求,并收集关键的性能指标。Shell脚本可以用于自动化执行JMeter测试,并进行结果分析和报告生成。

1. 总体需求

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

2. 实现流程

自动化的场景模拟真实手工测试,操作步骤和手工测试一样。

3.准备工作

准备软件:

系统环境:CentOS release 6.7 (Final)
内核版本:Linux localhost 2.6.32-573.7.1.el6.x86_64
测试工具:apache-jmeter-2.13 Apache JMeter - Download Apache JMeter
运行 JDK 环境:Java Downloads | Oracle
python 环境:Python 2.6.6
服务器监控 nmon:nmon for Linux | Site / Download

4.具体实现

4.1 用例执行

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


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

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

主流程脚本
#/bin/bash

source /etc/profile
Jmeter_Home='/usr/local/apache-jmeter-2.13'
TestReport='/data/loadtest/report'
LogDIR='/data/loadtest/log'
Date=`date +"%F"`
cd /data/loadtest/
>summary.txt
#清理上次执行结果
run_test()
{
#获取测试用例
 for i in `find ./testcase/ -name *.jmx|awk -F '.' '{print $2}'`
  do 
  casename=`echo "$i"|awk -F '/' '{print $4}'`
  >log/${casename}.txt
  echo -n "$i ">>summary.txt
  #发起监控
  ./monitor.sh >/dev/null 2>&1 &
  #开始执行测试
  $Jmeter_Home/bin/jmeter -n -t /data/loadtest${i}.jmx >>log/${casename}.txt &
  sleep 310
  #如果执行310s还未结束,强制终止执行
  ps -ef | grep java |grep -v grep | awk '{print $2}' |xargs kill -9 
  sleep 3
  #提取结果
  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
  cat monitor.txt >>summary.txt
  echo '' >> summary.txt
  #获取关键日志
  ssh 10.1.30.54 'tail -n 300 /data/logs/fcuh-user/catalina.out'>${LogDIR}${i}.log
 done
}
run_test
sleep 3
#生成html报告
sh genHTML.sh
sleep 1
#发送邮件
python sendmail.py

4.2 服务器监控

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

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

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

监控脚本:
#!/bin/bash
#读取监控服务器列表
SERVERLIST=`cat serverlist`
DATE=`date +'%F'`
mkdir -p /data/loadtest/monitor/$DATE
TIME=`date +'%T'`
#发起监控
for i in $SERVERLIST
do 
  ssh $i 'nmon -f -t -s5 -c60 -F /data/test.nmon >/dev/null 2>&1 &'
done
#监控5分钟
sleep 303
>monitor.txt
#收集监控结果,保存到monitor.txt
for i in $SERVERLIST
do
 scp $i:/data/test.nmon /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon
 io=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "DISKBUSY,T" | awk -F ',' '{sum+=$3} END {printf("%.2f%",sum/NR)}'`
 cpu=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "CPU_ALL,T" | awk -F ',' '{sum+=$6} END {printf("%.2f%",100-sum/NR)}'`
 #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}'`
 echo -n "${cpu} ${io} ">>monitor.txt
done

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

[root@localhost loadtest]# cat summary.txt 
/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% 
/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% 
服务器监控脚本
#!/bin/bash

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

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

4.3 生成 html 报告

#!/bin/sh
>index.html
echo "<html><head><META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><title>用户端自动化性能测试报告</title>">>index.html
echo `cat style.css`>>index.html
(
cat <<EOF
<script language="JavaScript">
               function show_detail(detail){
                           if(detail.style.display=="none"){
                           detail.style.display="";
                           }
                           else{
                           detail.style.display="none";
                           }
                           }
                           </script>
EOF
)>>index.html
echo "</head><body><h1>用户端自动化性能测试报告</h1><hr size="1">">>index.html
sum=`cat summary.txt | wc -l`
sucess=`cat summary.txt|grep pass |grep -v grep|wc -l`
fail=`expr $sum - $sucess`
rate=`echo "$sucess $sum"|awk '{printf("%.2f%%",$1/$2*100)}'`
(
cat <<EOF
<table><tr><td>
<h2>结果汇总</h2>
<table width="60%" cellspacing="2" cellpadding="5" border="0" class="details" align="left">
<tr><th>总接口数</th><th>成功接口数</th><th>失败接口数</th><th>测试通过率</th></tr>
<tr align="center"><td>$sum</td><td>$sucess</td><td>$fail</td><td>$rate</td></tr>
</tr></table>
</td></tr>
EOF
)>>index.html
(
cat <<EOF
<tr><td>
<h2>概要结果</h2>
<table width="95%" cellspacing="2" cellpadding="5" border="0" class="details" align="left">
<tr valign="top">
<th>测试接口</th><th>每秒请求数(tps)</th><th>平均响应时间(ms)</th><th>总事务数</th><th>失败事务数</th><th>事务成功率</th><th>测试结果</th>
</tr>
<tr valign="top" class="">
EOF
)>>index.html
cat summary.txt |while read line
do 
  echo $line | awk '{if($7=="pass"){print "<tr><td>"$1"</td><td>"$2"</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td><td class=\"Pass\">"$7"</td></tr>"}else{print "<tr><td>"$1"</td><td>"$2"</td><td>"$3"</td><td>"$4"</td><td>"$5"</td><td>"$6"</td><td class=\"Failure\">"$7"</td></tr>"}}'>>index.html
done
echo "</tr></table></td></tr>">>index.html
echo "<table><tr><td><font color="red"><b>测试结果pass标准:tps>10000且事务成功率>90%</b></font><td></tr><tr><td><h2><a href=\"javascript:show_detail(detail)\">详细结果查看附件</a></h2></td></tr></table>">>index.html
#echo "<div class=\"page_details_expanded\" id=\"detail\" style=\"display:none;\" width=\"95%\">">>index.html
(
cat <<EOF
<table width="95%" cellspacing="2" cellpadding="5" border="0" class="details" align="left" id="detail" style="display:none">
<tr valign="top">
<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>
</tr>
<tr valign="top" class="">
EOF
)>>index.html
j=1
for i in `cat summary.txt`
do 
   if [ `expr $j % 17 ` != 0 ]; then 
      echo '<td align="left">'$i'</td>'>>index.html
   else
      echo '<td align="left">'$i'</td></tr>'>>index.html
   fi
   j=`expr $j + 1`
done
echo "</tr></table></td></tr></table></body></html>">>index.html
html 样式表
<style type="text/css">
body {
        font:normal 68% verdana,arial,helvetica;
        color:#000000;
     }
table tr td, table tr th {
         font-size: 78%;
     }
table.details tr th{
         color: #ffffff;
         font-weight: bold;
         text-align:center;
         background:#2674a6;
         white-space: nowrap;
     }
table.details tr td{
        background:#eeeee0;
        white-space: nowrap;
     }
h1 {
        margin: 0px 0px 5px; font: 265% verdana,arial,helvetica
   }
h2 {
        margin-top: 1em; margin-bottom: 0.5em; font: bold 185% verdana,arial,helvetica
   }
h3 {
        margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
   }
.Failure {
        font-weight:bold; color:red;
   }
.Pass {
        font-weight:bold; color:green;
   }
</style>

4.4 发送测试结果邮件

发邮件脚本
#!/usr/bin/env python
#coding: utf-8  
import string
import smtplib
import os
import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header

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

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

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

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

smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
#smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(msg['From'],msg['to'],msg.as_string())
smtp.quit()

测试结果截图:


这里还涉及到 ssh 免密码登录、jmeter 测试用例的编写,没有细说,其实百度一下就知道了

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/38188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一起学SF框架系列5.7-模块Beans-BeanDefinition使用

SF如何使用BeanDefinition达成其目标IoC&#xff0c;我们通过跟踪BeanDefinition使用来了解。 使用起点 跟踪SF初始化过程&#xff0c;第一个点在&#xff1a;DefaultListableBeanFactory.preInstantiateSingletons。如下图&#xff1a; RootBeanDefinition是运行时Spring B…

(16)燃油流量和液位传感器

文章目录 前言 16.1 燃油流量传感器 16.1.1 连接到自动驾驶仪 16.2 燃油液位传感器 16.2.1 PWM油位传感器 16.2.2 模拟油位传感器 前言 在 4.0 及以后的固件版本中&#xff0c;ArduPilot 提供了使用燃油流量和液位传感器的能力&#xff0c;此外还有电池监控器。支持脉冲输…

安装Ceph集群

安装Ceph集群 环境准备 CentOS 7.6 主机名IPRoleadmin192.168.182.128adminnode1192.168.182.129mon/mgr/osdnode2192.168.182.130osdnode3192.168.182.131osdclient192.168.182.132 所有节点修改主机名相互解析三台node节点添加大小5G以上硬盘关闭所有节点防火墙与SeLinux所…

jenkins 关闭关闭CSRF Protection(跨站请求伪造保护)

jenkins版本 我的jenkins版本是&#xff1a;2.332.4 背景 Jenkins版本自2.204.6以来的重大变更有&#xff1a;删除禁用 CSRF 保护的功能。 从较旧版本的 Jenkins 升级的实例将启用 CSRF 保护和设置默认的发行者&#xff0c;如果之前被禁用。 解决方法 老版本Jenkins的CSRF…

亚马逊云科技,迈向十年新进阶

编辑&#xff1a;阿冒 设计&#xff1a;沐由 自2013年进入国内至今&#xff0c;亚马逊云科技见证了中国数字经济开启量质齐升的十年。在这十年里&#xff0c;亚马逊云科技持续不断地帮助广大中国企业实现上云重塑和云上创新。 从一间公司的时间节点而言&#xff0c;无论是中文的…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

达梦sql执行计划、HINT、索引简单应用

目录 收集统计信息. 3 1. 通过DBMS_STATS包中的方法. 3 2、删除指定表的统计信息. 3 执行计划. 3 常用执行计划操作符. 4 统计指定sql执行号的所有操作符的执行时间. 5 HINT 5 并行操作&#xff1a;. 6 查询计划重用、结果集重用. 7 示例. 8 1、收集统计信息&#x…

上手vue2的学习笔记5之在vue2项目中调用elment-ui

前言 上手vue2的学习笔记4之搭建vue环境 参考链接&#xff1a;vue2.0项目引入element-ui 一、安装elment-ui 进入搭建的vue项目中 cd vue_bing_test 安装 element npm i element-ui二、引入elment-ui elment官方教程 将main.js改成如下内容&#xff1a; import Vue fro…

Proxy代理前后,Httpheader 的变化

Vite.config 配置Proxy服务器, 解决Rest API 访问SpringBoot接口时&#xff0c;跨域的Session一致性。 import { defineConfig, loadEnv } from viteexport default defineConfig({server: {proxy: {/rest: {target: loadEnv(, process.cwd()).VITE_API_URL,changeOrigin: tru…

argparse 模块参数

官方文档&#xff1a;https://docs.python.org/3.7/library/argparse.html 示例 def parse_config():parser argparse.ArgumentParser(descriptionarg parser) # 创建一个 ​​ArgumentParser​​ 对象(parser)parser.add_argument(--cfg_file, typestr, defaultNone, hel…

[相遇 Bug] - ImportError: numpy.core.multiarray failed to import

背景: 因为最近在看点云模型, 在自己的环境上部署该项目: https://github.com/open-mmlab/OpenPCDet/tree/master 执行命令: 这里执行github项目给的demo.py文件, 命令格式如下: python demo.py --cfg_file cfgs/kitti_models/pointpillar.yaml --ckpt xxx/pointpillar_772…

WPF Prims框架详解

文章目录 前言Prism基本使用Prism选择&#xff0c;DryIoc还是UnityPrism基本框架搭建Prism动态更新View和ViewModel对应关系参数动态更新函数动态绑定 prism新建项目模板region使用事例测试是否限制空间 消息订阅如何使用消息订阅使用建议 路由导航对话框/弹窗功能实现代码 前言…

Element分页组件自定义样式

样式效果 页面代码 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"page.page":page-sizes"[10, 20, 30, 40]":page-size"page.size"layout"total, sizes, prev, …

HTML <map> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

Spring Boot 中的 @Field 注解详解

Spring Boot 中的 Field 注解详解 引言 Spring Boot 是目前 Java 生态圈中最受欢迎的 Web 应用开发框架之一&#xff0c;它提供了很多优秀的功能和工具&#xff0c;可以帮助开发者快速构建高效、可靠的 Web 应用程序。其中一个重要的功能就是数据绑定和验证&#xff0c;Sprin…

(阿里云)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到阿里云物联网平台

1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内&#xff08;注意不要弄错方向&#xff09; 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接…

DP485替代MAX485 RS485/RS422 收发器芯片

DP485E 是一款 5V 供电、半双工、低功耗、低摆率&#xff0c;完全满足 TIA/EIA-485 标准要求的 RS-485收发器。DP485E 工作电压范围为 4.75~5.25V&#xff0c;具备失效安全&#xff08;fail-safe&#xff09;、过温保护、限流保护、过压保护&#xff0c;控制端口热插拔输入等功…

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学&#xff1a;飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

数据科学分析全流程步骤

知识图谱以结构化的“知识”来存储与表示海量数据&#xff0c;作为承载底层海量知识并支持上层智能应用的重要载体&#xff0c;它在智能时代中扮演了极其重要的角色。然而&#xff0c;由于知识图谱高度结构化的特点&#xff0c;我们常常需要构建结构化查询语句&#xff08;SPAR…
最新文章