Jenkins+Ant+Git+Jmeter接口自动化

 一、服务器分别安装JDK、Jenkins、Ant、Git、Jmeter

1、JDK安装参考:https://www.cnblogs.com/xiaoxitest/p/6168045.html

2、Jenkins安装参考:https://www.cnblogs.com/xiaoxitest/p/11947309.html

3、Ant安装参考:https://www.cnblogs.com/xiaoxitest/p/11947205.html

4、Git安装参考:https://www.cnblogs.com/xiaoxitest/p/10106302.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=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
# Save ResponseData for failed samples
jmeter.save.saveservice.response_data.on_error=false
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
# Only available with HttpClient4
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=false
jmeter.save.saveservice.bytes=true
# Only available with HttpClient4
#jmeter.save.saveservice.sent_bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.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>

6、测试build.xml文件是否生效(ant -f build.xml,出现如下提示:BUILD SUCESSFUL表示构建成功)

 

 

三、jenkins配置

下载插件 HTML Publisher Plugin
下载插件 email extension plugin(可选)、performance plugin

 1、新建job

2、选择构建记录要保留的天数或个数

 3、配置多套测试环境

 4、配置Git,从Git拉取最新脚本

 5、定时构建,当前设置为:每周一至周五,早上10点至下午18点,每隔1小时构建一次

 6、为方便查看,这里选择把将时间戳添加到控制台输出

 7、在/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

 

8、新建两个shell文件,删除旧的报告,只保留最新的10个

vim /opt/apache-jmeter-5.1.1/report/rm_html

#!/bin/bash
#保留文件数
ReservedNum=10
FileDir=/opt/apache-jmeter-5.1.1/report

FileNum=$(ls -l  $FileDir/*.html |grep ^- |wc -l)

while(( FileNum > ReservedNum))
do
    OldFile=$(ls -rt  $FileDir/*.html| head -1)
    echo  "Delete File:" $OldFile
    rm -f $OldFile
    let "FileNum--"
done

 

vim /opt/apache-jmeter-5.1.1/report/rm_jtl

#!/bin/bash
#保留文件数
ReservedNum=10
FileDir=/opt/apache-jmeter-5.1.1/report

FileNum=$(ls -l  $FileDir/*.jtl |grep ^- |wc -l)

while(( FileNum > ReservedNum))
do
    OldFile=$(ls -rt  $FileDir/*.jtl| head -1)
    echo  "Delete File:" $OldFile
    rm -f $OldFile
    let "FileNum--"
done

9、增加构建步骤,执行shell,删除旧的测试报告和根据选择的环境,执行不同的shell脚本(若没有配置多环境选项参数,则不加最后一句)

10、增加构建步骤,Execute system Groovy script(报告显示非HTML格式时配置该选项)

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

11、增加构建步骤,invoke Ant,选择自己配置的ant和build.xml文件路径

12、新建钉钉通知脚本(根据自己路径替换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
}
}'

13、增加构建步骤,再次选择执行shell,我们断言执行结果的jtl文件,如果存在断言失败,就发送通知到钉钉(为了方便查看错误报告,我们拷贝当前的错误报告重命名为Error.html)

 

 

内容如下,根据自己路径填写:

file=$(ls -t /opt/apache-jmeter-5.1.1/report/jtl/*.jtl | head -1)
file2=$(ls -t /opt/apache-jmeter-5.1.1/report/html/*.html | head -1)
cp -rf $file /opt/apache-jmeter-5.1.1/report/jtl/TestReport.jtl
if grep -qE "<failure>true</failure>"  $file ;then
  echo "接口运行失败,发送通知到钉钉!"
  cp -rf $file2 /opt/apache-jmeter-5.1.1/report/html/Error.html
  sh /opt/apache-jmeter-5.1.1/report/notify.sh  
  
else
  echo "接口执行成功"
  exit 0
fi

14、增加构建后操作,用来查看测试报告

15、增加构建后操作,添加钉钉通知器配置

步骤13是接口运行失败时接收报告的通知,但是有可能还没执行到步骤13就已经出错了,因此我们再次添加钉钉通知器配置,仅在构建失败时发送通知。

四、报告通知

1、接口运行失败,收到通知

2、构建失败,发送通知

 

 

五、生成多个HTML报告

这里配置两个报告,一个简单的汇总报告,一个是详细报告(用于定位接口错误信息)

添加第二个报告,vim /opt/apache-jmeter-5.1.1/report/build.xml

<!-- 生成第一个报告-->
<property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" /> <!-- 生成第二个报告--> <property name="detail" value="_detail" /> <property name="jmeter.result.jtlNamedetail" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /> <property name="jmeter.result.htmlNamedetail" value="${jmeter.result.html.dir}/${ReportName}${time}${detail}.html" />

另在原先报告下新增一个xslt标签

<target name="report">
        <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
        <xslt 
              classpathref="xslt.classpath"
              force="true"
              in="${jmeter.result.jtlName}"
              out="${jmeter.result.htmlName}"
              style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">
              <param name="dateReport" expression="${report.datestamp}"/>
        </xslt>

        <xslt 
              classpathref="xslt.classpath"
              force="true"
              in="${jmeter.result.jtlNamedetail}"
              out="${jmeter.result.htmlNamedetail}"
              style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl">
             <param name="dateReport" expression="${report.datestamp}"/>
        </xslt>

运行成功后会生成两个html报告

 

 第一个汇总报告

 

第二个详细报告

 

 

附:钉钉access token查看

进入钉钉群,选择添加机器人-自定义-添加-复制Webhook链接(钉钉通知只填写access_token=后面部分)-安全设置(选择自定义关键字:构建)-完成

 

 

posted @ 2019-11-29 16:51  小郗测试  阅读(1150)  评论(6编辑  收藏  举报