利用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

最终你会发现此时你的目标文件夹中会多两个文件:

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台


其中:TestReport201811301031.jtl文件可以通过jmeter打开查看结果报告

 

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台
而/TestReport201811301031.html文件则支持直接打开,可以通过邮件形式发送给他人

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

 

2. Jenkins - 持续集成平台

注:部署到持续集成平台可以实现脚本的定时运行,这是接口、性能测试的核心。

具体步骤如下:

新建一个job

 

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

jenkin相关插件介绍与配置

提前下载好插件

系统管理-管理插件-可选插件
下载所需要的插件,例如:Performance plugin、HTML Publisher plugin、 Ant Plugin等

1)配置中添加Jmeter插件:Performance plugin、HTML Publisher plugin

功能:用来展示jmeter执行结果

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

 

 

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

Report file:配置jtl文件路径,相对路径与绝对路径均可

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

HTML directory to archive:生成的html文件路径

注:修改build.xml文件生成jtl和html文件的目录到jenkins的工作目录下!!!

查看Jekins 工作目录:系统管理-系统设置 - 高级

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

 

修改如下

<!-- 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文件所在路径

 

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

Build File:build.xml文件路径
后面可根据所需配置邮件、定时任务等

3)构建脚本

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

 

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台

4)查看报告

利用jmeter Ant Jenkins搭建 接口 性能测试 持续集成平台