Jmeter接口自动化
背景:
为保障服务可持续稳定运行,由于代码变更或环境以及配置等问题导致业务失败,可以及时发现问题,因此采用接口自动化定时执行,也可以在必要时手动触发执行。
项目背景,参照 单体药店线上灰度重要模块接口梳理
一、服务安装
分别安装JDK、Jenkins、Ant、Git、Jmeter
2、Jenkins安装参考:https://www.cnblogs.com/xiaoxitest/p/11947309.html
5、Jmeter安装参考:https://www.cnblogs.com/xiaoxitest/p/6208940.html
二、Ant配置
1、将jmeter的extras目录下ant-jmeter-1.1.1.jar文件拷贝到ant的lib目录下
2、创建存放测试报告目录:/opt/apache-jmeter-5.1.1/report/html 和 /opt/apache-jmeter-5.1.1/report/jtl
3、由于默认的报告内容不够丰富,下载style文件:jmeter.results.shanhe.me.xsl,把下载的文件放到jmeter的extras目录下
4、修改jmeter.properties文件如下部分,这样执行完脚本后就会保存这些结果到.jtl文件里面:
jmeter.save.saveservice.data_type=truejmeter.save.saveservice.label=truejmeter.save.saveservice.response_code=true# response_data is not currently supported for CSV outputjmeter.save.saveservice.response_data=true# Save ResponseData for failed samplesjmeter.save.saveservice.response_data.on_error=falsejmeter.save.saveservice.response_message=truejmeter.save.saveservice.successful=truejmeter.save.saveservice.thread_name=truejmeter.save.saveservice.time=truejmeter.save.saveservice.subresults=truejmeter.save.saveservice.assertions=truejmeter.save.saveservice.latency=true# Only available with HttpClient4jmeter.save.saveservice.connect_time=truejmeter.save.saveservice.samplerData=truejmeter.save.saveservice.responseHeaders=truejmeter.save.saveservice.requestHeaders=truejmeter.save.saveservice.encoding=falsejmeter.save.saveservice.bytes=true# Only available with HttpClient4#jmeter.save.saveservice.sent_bytes=truejmeter.save.saveservice.url=truejmeter.save.saveservice.filename=truejmeter.save.saveservice.hostname=truejmeter.save.saveservice.thread_counts=truejmeter.save.saveservice.sample_count=truejmeter.save.saveservice.idle_time=true
5、创建build.xml文件:vim /opt/apache-jmeter-5.1.1/report/build.xml
内容如下,根据自己的路径修改:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project name="ant-jmeter-test" default="run" basedir="."> 4 <tstamp> 5 <format property="time" pattern="yyyy-MM-dd_HHmm" /> 6 </tstamp> 7 <!-- 需要改成自己本地的 Jmeter 目录--> 8 <property name="jmeter.home" value="/opt/apache-jmeter-5.1.1" /> 9 <!-- jmeter生成jtl格式的结果报告的路径--> 10 <property name="jmeter.result.jtl.dir" value="/opt/apache-jmeter-5.1.1/report/jtl" /> 11 ▽ <!-- jmeter生成html格式的结果报告的路径--> 12 <property name="jmeter.result.html.dir" value="/opt/apache-jmeter-5.1.1/report/html" /> 13 <!-- 生成的报告--> 14 <property name="ReportName" value="TestReport" /> 15 <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /> 16 <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" /> 17 18 <target name="run"> 19 <antcall target="test" /> 20 <antcall target="report" /> 21 </target> 22 23 <target name="test"> 24 <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> 25 <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> 26 <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本--> 27 <testplans dir="/opt/apache-jmeter-5.1.1/test" includes="*.jmx" /> 28 <property name="jmeter.save.saveservice.output_format" value="xml"/> 29 </jmeter> 30 </target> 31 32 <path id="xslt.classpath"> 33 <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> 34 <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> 35 </path> 36 37 <target name="report"> 38 <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp> 39 <xslt 40 classpathref="xslt.classpath" 41 force="true" 42 in="${jmeter.result.jtlName}" 43 out="${jmeter.result.htmlName}" 44 style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl"> 45 46 47 <param name="dateReport" expression="${report.datestamp}"/> 48 </xslt> 49 <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> 50 <copy todir="${jmeter.result.html.dir}"> 51 <fileset dir="${jmeter.home}/extras"> 52 <include name="collapse.png" /> 53 <include name="expand.png" /> 54 </fileset> 55 </copy> 56 </target> 57 </project>
三、jenkins配置
下载插件 HTML Publisher Plugin、Ant、Git下载插件 email extension plugin(可选)、performance plugin
1、配置全局变量(JDK、Git、Ant)
2、新建job
3、选择构建记录要保留的天数或个数
4、配置多套测试环境
5、配置Git,从Git拉取最新脚本
6、定时构建,当前设置为:每周一至周五,早上10点至下午18点,每隔1小时构建一次
7、为方便查看,这里选择把将时间戳添加到控制台输出
8、在/opt/apache-jmeter-5.1.1/test目录下创建3个不同的shell脚本文件,分别为test1,test2和test3,目的是更改jmeter脚本文件中用户定义的变量启用和禁用来切换环境,根据自己设置的名称填写
vim /opt/apache-jmeter-5.1.1/test/test1
sed -i 's/testname="用户定义的变量-test1" enabled="false"/testname="用户定义的变量-test1" enabled="true"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test2" enabled="true"/testname="用户定义的变量-test2" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test3" enabled="true"/testname="用户定义的变量-test3" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx
vim /opt/apache-jmeter-5.1.1/test/test2
sed -i 's/testname="用户定义的变量-test1" enabled="true"/testname="用户定义的变量-test1" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test2" enabled="false"/testname="用户定义的变量-test2" enabled="true"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test3" enabled="true"/testname="用户定义的变量-test3" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx
vim /opt/apache-jmeter-5.1.1/test/test3
sed -i 's/testname="用户定义的变量-test1" enabled="true"/testname="用户定义的变量-test1" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test2" enabled="true"/testname="用户定义的变量-test2" enabled="false"/g' /opt/apache-jmeter-5.1.1/test/test.jmx sed -i 's/testname="用户定义的变量-test3" enabled="false"/testname="用户定义的变量-test3" enabled="true"/g' /opt/apache-jmeter-5.1.1/test/test.jmx
9、新建两个shell文件,删除旧的报告,只保留最新的10个
vim /opt/apache-jmeter-5.1.1/report/rm_html #新建删除html报告脚本
#!/bin/bash#保留文件数ReservedNum=10FileDir=/opt/apache-jmeter-5.1.1/report
FileNum=$(ls -l $FileDir/*.html |grep ^- |wc -l)
while(( FileNum > ReservedNum))doOldFile=$(ls -rt $FileDir/*.html| head -1)echo "Delete File:" $OldFilerm -f $OldFilelet "FileNum--"done
vim /opt/apache-jmeter-5.1.1/report/rm_jtl #新建删除jtl报告脚本
#!/bin/bash#保留文件数ReservedNum=10FileDir=/opt/apache-jmeter-5.1.1/report
FileNum=$(ls -l $FileDir/*.jtl |grep ^- |wc -l)
while(( FileNum > ReservedNum))doOldFile=$(ls -rt $FileDir/*.html| head -1)echo "Delete File:" $OldFilerm -f $OldFilelet "FileNum--"done
10、增加构建步骤,执行shell,删除旧的测试报告和根据选择的环境,执行不同的shell脚本
11、增加构建步骤,Execute system Groovy script(报告显示非HTML格式时配置该选项)
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
12、增加构建步骤,invoke Ant,选择自己配置的ant和build.xml文件路径
13、新建钉钉通知脚本(根据自己路径替换curl和text内容)
vim notify.sh
#!/bin/bash
curl 'https://oapi.dingtalk.com/robot/send?access_token=6bb1b219edd2ad72b02596d73cc22b331044f30b3e6edfc832bdbfb49831e67b' \-H 'Content-Type: application/json' \-d '{"msgtype": "markdown","markdown": {"title":"构建失败","text": "#### 接口运行失败\n\n > 项目:单体药店\n\n > 环境:线上\n\n > ##### [点击查看](https://jenkins-ep.test.ybm100.com/job/SAAS-automation/job/saas-dt-prod/HTML_20Report/) \n"},"at": {"atMobiles": ["152xxxx"],"isAtAll": true}}
14、增加构建步骤,再次选择执行shell,因为无论报告结果是否正确,jenkins都会认为构建成功,我们断言执行结果的jtl文件,如果存在断言失败,就认为构建失败。
内容如下,根据自己路径填写:
file=$(ls -t /home/dev/saas_test/report-md-test3/jtl/*.jtl | head -1)cp -rf $file /home/dev/saas_test/report-md-test3/jtl/TestReport.jtlif grep -qE "true" $file ;thenecho "接口运行失败,发送通知到钉钉!"sh /home/dev/saas_test/report-md-test3/notify.sh exit 1elseecho "接口执行成功"exit 0fi
15、增加构建后操作,用来查看测试报告
16、生成多个HTML报告
这里配置两个报告,一个简单的汇总报告,一个是详细报告(用于定位接口错误信息)
添加第二个报告
新增一个xslt标签
运行成功后会生成两个html报告
第一个汇总报告
第二个详细报告
四、报错信息查看
1、构建失败,收到通知
2、点击查看,进入HTML报告列表
3、概要汇总报告
4、详细报告,可以看到具体的错误信息
5、性能报告查看
6、如果HTML Report 没有本次构建产生的报告,一般是在执行接口脚本之前就出错了,我们需要去控制台查看失败原因
如:下图为未连接到Git服务导致构建失败,其次服务器磁盘空间不足、Ant、环境或其他因素导致的失败等。
附:钉钉access token查看
进入钉钉群,选择添加机器人-自定义-添加-复制Webhook链接(钉钉通知只填写access_token=后面部分)-安全设置(选择自定义关键字:构建)-完成