利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台
0. 环境准备
安装如下工具:
1、Jmeter:编写测试脚本,相关的安装、配置、编写可以参考:快速掌握jmeter的基本操作和使用
2、ant:执行测试脚本,并生成测试报告,相关的安装以及build.xml的编写语法可以参考:Apache-ant 工具的介绍、安装及build.xml文件的解析
3、Jenkins:持续集成平台可以实现脚本的定时运行、邮件发送、测试报告展示等
1. ANT-执行测试脚本并生成测试报告
测试脚本运行后生成的是JTL(xml)格式的文件,这些文件不具备可读性,因此我们要把他转化为可以阅读的html格式报告。
转化步骤如下:
下载ant安装包并将jmeter所在extras目录下的ant-jmeter-1.1.1.jar文件copy到ant所在的lib目录下
Jmeter配置文件修改
1)修改原因:
a) jmeter执行结果文件默认保存的不是xml格式,无法转化成html格式
b) jmeter执行结果文件默认有很多执行数据是不保存的,而测试报告需要这些数据
2)配置路径:
${jmeterhome}/bin/jmeter.profile
3) 修改内容:
a) 修改jtl文件格式:
jmeter.save.saveservice.output_format=xml (去掉注释(#),修改csv 为 xml)
b) 添加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=false # 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=false jmeter.save.saveservice.responseHeaders=false jmeter.save.saveservice.requestHeaders=false 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=false jmeter.save.saveservice.hostname=false jmeter.save.saveservice.thread_counts=true jmeter.save.saveservice.sample_count=false jmeter.save.saveservice.idle_time=true
编写ant的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="/Users/leiyuxing/apache-jmeter-5.0"/> <!-- jmeter生成jtl格式的结果报告的路径 --> <property name="jmeter.result.jtl.dir" value="/Users/leiyuxing/apache-jmeter-5.0/AntReport"/> <!-- jmeter生成html格式的结果报告的路径 --> <property name="jmeter.result.html.dir" value="/Users/leiyuxing/apache-jmeter-5.0/AntReport"/> <!-- 生成报告的前缀 --> <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"/> <target name="run"> <antcall target="init"/> <!-- 调用其他的目标 --> <antcall target="testOneLogin"/> <antcall target="test2NumByTypeAndSample"/> <antcall target="logout"/> <antcall target="report"/> </target> <!-- 定义一个目标,任务名称为ini——将需要的外部文件删除将需要的外部文件删除 --> <target name="init"> <!-- 每次运行前删除之前产生的报告文件 --> <delete > <fileset dir="/Users/leiyuxing/apache-jmeter-5.0/AntReport" includes="*.doc,*.html,*.jtl,*.xls"/> </delete> </target> <target name="testOneLogin"> <!-- 定义一个任务,任务名称为jmeterA --> <taskdef name="jmeterA" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/> <jmeterA jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 声明要运行的脚本 --> <testplans dir="/Users/leiyuxing/apache-jmeter-5.0/AntReport" includes="一次登录-suadmin.jmx"/> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeterA> </target> <target name="test2NumByTypeAndSample"> <delete file="/Users/leiyuxing/apache-jmeter-5.0/AntReport/submitInfo.txt"/> <!-- 定义一个任务,任务名称为jmeterA --> <taskdef name="jmeterA" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/> <jmeterA jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 测试脚本 --> <testplans dir="/Users/leiyuxing/apache-jmeter-5.0/AntReport" includes="CoinCola_3.4.5Test.jmx"/> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeterA> </target> <target name="logout"> <!-- 定义一个任务,任务名称为jmeterA --> <taskdef name="jmeterA" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/> <jmeterA jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 声明要运行的脚本 --> <testplans dir="/Users/leiyuxing/apache-jmeter-5.0/AntReport/" includes="CoinCola_3.4.5Test.jmx"/> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeterA> </target> <!-- 自定义的path路径,该路径下包含下面匹配的jar包,下面会用到 --> <path id="xsltA.classpath"> <fileset dir="${jmeter.home}/lib" includes="xalan*.jar,serializer*.jar"/> </path> <target name="report"> <!-- 这里用到了上面定义的path路径 --> <xslt classpathref="xsltA.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"> <param name="deateReport" expression="${time}"/> <!-- 有没有这句没有什么影响 --> </xslt> <!-- 复制两个图片过来,已经有的就可以不用复制了 --> <!-- <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png"/> <include name="expand.png"/> </fileset> </copy> --> </target> </project>
注:我目前只放了一个测试用例,当然可以放多个文件,在build.xml中添加指定的任务代码即可。
cmd下运行ant命令,生成html文件
$ ant Buildfile: /Users/leiyuxing/apache-jmeter-5.0/extras/build.xml run: init: testOneLogin: test2NumByTypeAndSample: [jmeterA] Executing test plan: /Users/leiyuxing/apache-jmeter-5.0/AntReport/CoinCola_3.4.5Test.jmx ==> /Users/leiyuxing/apache-jmeter-5.0/AntReport/TestReport201811301031.jtl [jmeterA] Creating summariser <summary> [jmeterA] Created the tree successfully using /Users/leiyuxing/apache-jmeter-5.0/AntReport/CoinCola_3.4.5Test.jmx [jmeterA] Starting the test @ Fri Nov 30 10:31:48 CST 2018 (1543545108243) [jmeterA] Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 [jmeterA] summary = 6 in 00:00:02 = 3.9/s Avg: 176 Min: 0 Max: 685 Err: 1 (16.67%) [jmeterA] Tidying up ... @ Fri Nov 30 10:31:50 CST 2018 (1543545110071) [jmeterA] ... end of run logout: [jmeterA] Executing test plan: /Users/leiyuxing/apache-jmeter-5.0/AntReport/CoinCola_3.4.5Test.jmx ==> /Users/leiyuxing/apache-jmeter-5.0/AntReport/TestReport201811301031.jtl [jmeterA] Creating summariser <summary> [jmeterA] Created the tree successfully using /Users/leiyuxing/apache-jmeter-5.0/AntReport/CoinCola_3.4.5Test.jmx [jmeterA] Starting the test @ Fri Nov 30 10:31:52 CST 2018 (1543545112819) [jmeterA] Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 [jmeterA] summary = 6 in 00:00:02 = 3.4/s Avg: 214 Min: 1 Max: 659 Err: 1 (16.67%) [jmeterA] Tidying up ... @ Fri Nov 30 10:31:54 CST 2018 (1543545114883) [jmeterA] ... end of run report: [xslt] Processing /Users/leiyuxing/apache-jmeter-5.0/AntReport/TestReport201811301031.jtl to /Users/leiyuxing/apache-jmeter-5.0/AntReport/TestReport201811301031.html [xslt] Loading stylesheet /Users/leiyuxing/apache-jmeter-5.0/extras/jmeter-results-detail-report_21.xsl BUILD SUCCESSFUL Total time: 10 seconds
最终你会发现此时你的目标文件夹中会多两个文件:
其中:TestReport201811301031.jtl文件可以通过jmeter打开查看结果报告
而/TestReport201811301031.html文件则支持直接打开,可以通过邮件形式发送给他人
2. Jenkins - 持续集成平台
注:部署到持续集成平台可以实现脚本的定时运行,这是接口、性能测试的核心。
具体步骤如下:
新建一个job
jenkin相关插件介绍与配置
提前下载好插件
系统管理-管理插件-可选插件
下载所需要的插件,例如:Performance plugin、HTML Publisher plugin、 Ant Plugin等
1)配置中添加Jmeter插件:Performance plugin、HTML Publisher plugin
功能:用来展示jmeter执行结果
Report file:配置jtl文件路径,相对路径与绝对路径均可
HTML directory to archive:生成的html文件路径
注:修改build.xml文件生成jtl和html文件的目录到jenkins的工作目录下!!!
查看Jekins 工作目录:系统管理-系统设置 - 高级
修改如下
<!-- jmeter生成jtl格式的结果报告的路径 --> <property name="jmeter.result.jtl.dir" value="/Users/leiyuxing/apache-jmeter-5.0/AntReport"/> <!-- jmeter生成html格式的结果报告的路径 --> <property name="jmeter.result.html.dir" value="/Users/leiyuxing/apache-jmeter-5.0/AntReport"/>
2)配置中添加Ant插件:Ant Plugin
功能:用来执行Ant,以下路径全改为你电脑build.xml文件所在路径
Build File:build.xml文件路径
后面可根据所需配置邮件、定时任务等
3)构建脚本
4)查看报告