前言
一个完整的接口自动化测试平台需要支持接口的自动执行,自动生成测试报告,以及持续集成。今天Darren洋为大家讲解JMeter5.4.1+Ant1.0.13+Jenkins2.411用来搭建一个完整的接口自动化测试平台的方法及步骤,免去到处找东墙补西墙之苦,直接无脑搭建接口自动化工具类平台,JMeter用于支持接口的测试,Ant用于支持自动构建,而Jenkins支持持续集成,所以三者组合在一起可以构成一个功能完善的接口自动化测试平台。
一、下载安装JMeter
jmeter下载安装步骤见Darren洋之前发过的博客文章
传送带:接口测试——JMeter测试工具安装过程_Darren洋的博客-CSDN博客
下载jmeter之前应先安装好相应版本的jdk(建议用jdk8及以上版本),因为jmeter是基于java语言开发的,so其环境必须依赖于jdk,此次Darren洋安装的jmeter版本为5.4.1版本,检查版本时输入jmeter --version即可检查jmeter环境是否配置完成。
二、下载ant
下载传送带:https://ant.apache.org/bindownload.cgi
网络差点意思打不开的话,建议开加速器加加速就能轻松打开此页面,选择合适版本下载即可(这里Darren洋下载的ant版本是1.10.13版本)。
三、配置Ant环境变量
解压ant安装包到对应路径之后,按照如下步骤配置好ant的环境变量
四、检查ant版本
将jmeter 的extras目录下的ant-jmeter-1.1.1.jar 文件拷贝到ant安装目录下的lib文件夹中
build.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="E:\apache-jmeter-5.4.1" />
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="E:\apache-jmeter-5.4.1\loadTest\report\latest\jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="E:\apache-jmeter-5.4.1\loadTest\report\latest\html" />
<!-- 生成的报告的前缀-->
<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" />
<!-- 生成的shanhe.me.xsl报告的前缀 -->
<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" />
<!--项目依次运行以下target-->
<target name="run">
<antcall target="init" />
<antcall target="test" />
<antcall target="report" />
</target>
<!--项目初始化设置-->
<target name="init">
<!--删除jtl文件夹下生成的所有文件和文件夹,即替换旧报告-->
<delete verbose="true" includeemptydirs="true">
<fileset dir="${jmeter.result.jtl.dir}">
<include name="**/*"/>
</fileset>
</delete>
<!--删除html文件夹下生成的所有文件和文件夹,即替换旧报告-->
<delete>
<fileset dir="${jmeter.result.html.dir}">
<include name="**/*"/>
</fileset>
</delete>
</target>
<target name="test" depends="init">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="E:\apache-jmeter-5.4.1\loadTest" includes="*.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="report" depends="test">
<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_30.xsl" />
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlNamedetail}"
out="${jmeter.result.htmlNamedetail}"
style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl" />
<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
在jmeter中bin目录下jmeter.properties里把jmeter.save.saveservice.output_format=csv 改为 jmeter.save.saveservice.output_format=xml,并去掉前面的注释符号#
把下列都改为true
若出现build successful提示,则说明jmeter与ant关联构建成功。
五、下载安装Jenkins
传送带链接如下:
Jenkins download and deployment
安装过程中有个端口设置,设置的端口不被系统服务占用即可
这里注意jdk11、17、21才支持较新版本的Jenkins,若不是,则需切换至以上版本的jdk包。
切换好jdk版本后可检查一下jdk版本然后重复上述安装步骤即可。
自定义设置,默认即可,点击next进入下一步
安装完毕后,浏览器输入:http://localhost:+安装时设置的端口号,访问jenkins
第一次访问jenkins需要解锁,管理员密码在日志文件可以查看到
安装插件:
DingTalk -----------发送钉钉消息的插件
HTML Publisher---------生成可视化html测试报告的插件
Ant In Workspace -------------ant构建配置插件
安装完毕插件后,最好重启一下jenkins,后面jenkins构建配置才能选择对应的插件。
六、钉钉机器人配置
添加构建JOB,新建一个自定义风格的JOB
+ 环境:测试环境
+ 项目名称:$PROJECT_NAME
+ [点击查看HTML测试报告](${PROJECT_URL}HTML_20Report)
+ [点击查看变更记录](${BUILD_URL}changes)
+ [点击查看构建日志](${BUILD_URL}console)
+ [点击编辑编译信息](${BUILD_URL}configure)
+ [点击删除当前构建](${BUILD_URL}confirmDelete)
在构建定时设置,主要是设置jenkins何时定时自动执行该构建项目
定时构建语法:
* * * * *(五颗星,中间用空格隔开)
第一颗*表示分钟,取值 0~59第二颗*表示小时,取值 0~23第三颗*表示一个月的第几天,取值 1~31第四颗*表示第几月,取值 1~12第五颗*表示一周中的第几天,取值 0~7,其中 0 和 7 代表的都是周日
每隔5分钟构建一次
H/5 * * * *
每两小时构建一次
H H/2 * * *
每天中午12点定时构建一次
H 12 * * *
每天下午18点定时构建一次
H 18 * * *
在每个小时的前半个小时内的每10分钟
H(0-29)/10 * * * *
每两小时45分钟,从上午9:45开始,每天下午3:45结束
45 9-16/2 * * 1-5
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)
H H(9-16)/2 * * 1-5
e:
cd E:\apache-ant-1.10.13-bin\apache-ant-1.10.13\bin
ant run
同时也会钉钉群推送构建通知,如下图:
七、钉钉自动构建效果
八、飞书机器人配置
feishu.py代码:
import os
import sys
import time
import requests
JOB_URL = sys.argv[1]
JOB_NAME = sys.argv[2]
WORKSPACE = sys.argv[3]
BUILD_NUMBER = sys.argv[4]
currenttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#获取生成的txt报告数据
d = {}
proDir = "\\report\html\export\prometheusData.txt"
f = open(WORKSPACE + proDir, 'r')
for lines in f:
for c in lines:
launch_name = lines.strip('\n').split(' ')[0]
num = lines.strip('\n').split(' ')[1]
d.update({launch_name: num})
f.close()
retries_run = d.get('launch_retries_run') # 运行总数
status_passed = d.get('launch_status_passed') # 通过数量
status_failed = d.get('launch_status_failed') # 不通过数
status_broken = d.get('launch_status_broken') # 异常数量
status_passedcode = format((float(status_passed) / float(retries_run))*100, ".4f")
url = 'XXX'
method = 'post'
headers = {
'Content-Type': 'application/json'
}
json = {
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": True,
"enable_forward": True
},
"elements": [{
"tag": "div",
"text": {
"content": "项目名称:" + JOB_NAME + "\n项目环境:测试环境" +
"\n构建编号:第" + BUILD_NUMBER + "次构建" +
"\n运行时间:" + currenttime +
"\n运行总数:" + retries_run +
"\n通过数量:" + status_passed +
"\n不通过数:" + status_failed +
"\n异常数量:" + status_broken +
"\n通过率为:" + status_passedcode + "%"
,
"tag": "lark_md"
}
}, {
"actions": [{
"tag": "button",
"text": {
"content": "查看allure测试报告",
"tag": "lark_md"
},
"url": JOB_URL + '/allure',
"type": "default",
"value": {}
}],
"tag": "action"
}],
"header": {
"title": {
"content": JOB_NAME + " 构建报告",
"tag": "plain_text"
}
}
}
}
requests.request(method=method, url=url, headers=headers, json=json)