Ant+JMeter集成

Posted zhengna

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ant+JMeter集成相关的知识,希望对你有一定的参考价值。

实例一(不推荐)

1.Ant下载(https://ant.apache.org/bindownload.cgi),解压缩,配置环境变量(不配也可以,配了更方便一些)。

我这里下载的是apache-ant-1.10.5-bin.zip,在运行时需要Java8。(JDK8下载安装

Ant 环境变量配置:
计算机→属性→高级系统设置→高级→环境变量→系统变量;
新建“ANT_HOME”变量,变量值为:D:\\software\\apache-ant-1.10.5(根据ant的实际解压路径填写);
在path变量里添加变量值:%ANT_HOME%\\bin;。

2.将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制到Ant所在目录lib子目录之下,这样Ant运行时才能找到"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"这个类,从而成功触发JMeter脚本。

3.jmeter默认保存的是.csv格式的文件,所以我们先要设置一下bin/jmeter.properties文件内容,保存。

jmeter.save.saveservice.output_format=xml

否则会报错:com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 前言中不允许有内容。

4.提前准备一个测试脚本(手机号码归属地测试.jmx)并测试通过。

5.主要逻辑思路:运行D:\\jemeterTest\\script下面的.jmx脚本,生成.jtl文件放入 D:\\jemeterTest\\resultLog\\jtl文件中,ant在将相应的文件转换为对应的html文件放入D:\\jemeterTest\\resultLog\\html中。

build.xml文件中的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<project name="JmeterTest" default="all" basedir=".">
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 需要改成自己本地的 Jmeter 目录-->
    <property name="jmeter.home" value="D:\\software\\apache-jmeter-5.1" />
    <!-- jmeter生成jtl格式的结果报告的路径-->
    <property name="jmeter.result.jtl.dir" value="D:\\jmeterTest\\resultLog\\jtl" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="D:\\jmeterTest\\resultLog\\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" />
    <!-- 接收测试报告的邮箱 -->
    <property name="mail_to" value="hello@163.com" />
    <target name="all">
        <antcall target="test" />
        <antcall target="report" />
    </target>
    <target name="test">
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
        <jmeter jmeterhome="$jmeter.home" resultlog="$jmeter.result.jtlName">
            <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本 -->
            <testplans dir="D:\\jmeterTest\\script" includes="*.jmx" />
        </jmeter>
    </target>
    <target name="report">
        <xslt in="$jmeter.result.jtlName" out="$jmeter.result.htmlName" style="$jmeter.home/extras/jmeter-results-detail-report_21.xsl" />
        <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
        <copy todir="$jmeter.result.html.dir">
            <fileset dir="$jmeter.home/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
    <!-- 发送邮件 -->
</project>

6.测试前(创建相应目录并将脚本和构建文件放入其中):

技术图片

7.命令行到build.xml所在的目录,ant,回车运行。

技术图片

8.测试后:

技术图片

浏览器打开HTML文件,显示正确(缺点是min time和max time没有值)

技术图片

打开jtl文件

技术图片

 

实例二(推荐)

上面的步骤有点乱,感觉不易于理解。后来我从书上发现,其实上面的2,3步骤完全可以在build.xml中配置好,完全不需要这么麻烦。下面是书上的例子,我稍加修改,更易于理解。

1.Ant下载,解压缩,配置环境变量。

2.提前准备一个测试脚本(手机号码归属地测试.jmx)并测试通过。

3.创建目录、构建文件及批处理文件。

技术图片

技术图片
<?xml version="1.0"?>
<project name="ant-jmeter" default="all">
    <description>
        Jmeter+Ant+Jenkins <!--文件描述,可选择项-->
    </description>
    
    <!--定义变量并赋值,能够减少配置工作量,后面会用到-->
    <!--定义JMeter的工作目录,与%JMETER_HOME%指向同一个目录-->
    <property name="jmeter.home" value="D:\\software\\apache-jmeter-5.1"/>
    
    <!--定义JMeter脚本存放目录-->
    <property name="script.dir" value="D:\\jmeterTest\\script"/>
    
    <!--定义JMeter的测试结果存放目录-->
    <property name="jmeter.result.dir" value="D:\\jmeterTest\\resultLog"/>
    
    <!--定义测试报告Title-->
    <property name="report.title" value="Performance Test Summary Report"/>

    <!--定义测试结果名称-->
    <property name="jmeter.result.name" value="Test"/>
    
    <!--测试报告中是否显示失败事务,n为不显示-->
    <property name="show-data" value="n"/>
    
    <!--定义样式版本,有更新时只需要修改此处即可,其他调用处不用更改-->
    <property name="format" value="2.1"/>
        
    <condition property="style_version" value="_21">
        <equals arg1="$format" arg2="2.1"/>
    </condition>

    <condition property="funcMode">
        <equals arg1="$show-data" arg2="y"/>
    </condition>
    
    <condition property="funcMode" value="false">
      <not>
        <equals arg1="$show-data" arg2="y"/>
      </not>
    </condition>

    <!--定义依赖包目录-->
    <path id="jmeter.classpath">
        <fileset dir="$jmeter.home\\extras">
          <include name="ant-jmeter*.jar"/>
        </fileset>
    </path>

    <!--定义任务,即测试活动,依赖于ant-jmeter.jar包-->
    <taskdef
        name="jmeter"
        classpathref="jmeter.classpath"
        classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>
    
    <!--定义任务,一个是run,即运行脚本,一个是report,即生成报告-->
    <target name="all" depends="run,report"/>

    <!--定义run任务-->
    <target name="run">
        <!--显示上面定义的$show-data取值-->
        <echo>funcMode = $funcMode</echo>
        <!--删除前一次的测试报告,Html格式的,上面有定义$jmeter.result.name变量的值-->
        <delete file="$jmeter.result.dir/$jmeter.result.name.html"/>
        <!--删除前一次的测试报告,Html格式的,上面有定义$jmeter.result.name变量的值-->
        <delete file="$jmeter.result.dir/$jmeter.result.name.jtl"/>
        
        <jmeter
            jmeterhome="$jmeter.home"
            jmeterproperties="$jmeter.home/bin/jmeter.properties"
            
            resultlog="$jmeter.result.dir/$jmeter.result.name.jtl">

            <!-- 指定测试脚本。"*.jmx"指包含此目录下的所有jmeter脚本 -->
            <testplans dir="$script.dir" includes="*.jmx" />
            
            <!--指定测试结果输出格式,在此指定的是xml,也可以指定成文本格式及CSV格式-->
            <!--先暂时指定成xml格式,后续会变换成文本格式-->
            <property name="jmeter.save.saveservice.output_format" value="xml"/>
            <!--是否记录错误信息,上面已经定义了$funcMode=n-->
            <property name="jmeter.save.saveservice.response_data.on_error" value="$funcMode"/>
        </jmeter>
    </target>

    <!--定义依赖包目录-->
    <property name="lib.dir" value="$jmeter.home/lib"/>

    <!-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ -->
    <path id="xslt.classpath">
        <fileset dir="$lib.dir" includes="xalan*.jar"/>
        <fileset dir="$lib.dir" includes="serializer*.jar"/>
    </path>

    <!--定义report任务,此任务依赖于xslt-report,copy-images这2个任务-->
    <target name="report" depends="xslt-report,copy-images">
        <echo>Report generated at $report.datestamp</echo>
    </target>

    <!--xslt-report是使用xslt来把xml文件转换成Html格式来显示-->
    <!--_message_xalan 被xslt-report依赖,由它生成报告-->
    <target name="xslt-report" depends="_message_xalan">
        <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
        <!--in:将测试结果作为输入-->
        <!--style:xslt定义的模板文件地址-->
        <xslt
            classpathref="xslt.classpath"
            force="true"    
            in="$jmeter.result.dir/$jmeter.result.name.jtl"
            out="$jmeter.result.dir/$jmeter.result.name.html"
            style="$jmeter.home/extras/jmeter-results-detail-report$style_version.xsl">
            <param name="showData" expression="$show-data"/>
            <param name="titleReport" expression="$report.title"/>
            <param name="dateReport" expression="$report.datestamp"/>
        </xslt>
    </target>

    <!--copy-images用来cpoy图片,xslt模板中的图片由copy-images任务copy到报告目录-->
    <target name="copy-images" depends="verify-images" unless="samepath">
        <!--生成Html报告时需要Copy图标到报告目录,expand.png展开图标,collapse.png收起图标-->
        <copy file="$jmeter.home/extras/expand.png" tofile="$jmeter.result.dir/expand.png"/>
        <copy file="$jmeter.home/extras/collapse.png" tofile="$jmeter.result.dir/collapse.png"/>
    </target>

    <target name="verify-images">
        <condition property="samepath">
                <equals arg1="$jmeter.result.dir" arg2="$jmeter.home/extras/" />
        </condition>
    </target>
    
    <!--检查依赖-->
    <condition property="xalan.present">
          <and>
              <!-- No need to check all jars; just check a few -->
            <available classpathref="xslt.classpath" classname="org.apache.xalan.processor.TransformerFactoryImpl"/>
            <available classpathref="xslt.classpath" classname="org.apache.xml.serializer.ExtendedContentHandler"/>
          </and>
    </condition>

    <target name="_message_xalan" unless="xalan.present">
        <echo>Cannot find all xalan and/or serialiser jars</echo>
        <echo>The XSLT formatting may not work correctly.</echo>
        <echo>Check you have xalan and serializer jars in $lib.dir</echo>
    </target>

    <!--仅仅打印前面定义的变量的值,检查是否如你所愿,在定义变量时做调试用,可以去掉-->
    <echo>jmeter.home = $jmeter.home</echo>
</project>
build.xml
技术图片
%ANT_HOME%\\bin\\ant -f .\\build.xml
run.bat

4.在命令行输入ant运行或者直接双击run.bat运行

技术图片
D:\\jmeterTest>ant
Buildfile: D:\\jmeterTest\\build.xml
     [echo] jmeter.home = D:\\software\\apache-jmeter-5.1

run:
     [echo] funcMode = false
   [jmeter] Executing test plan: D:\\jmeterTest\\script\\手机号码归属地测试.jmx
 D:\\jmeterTest\\resultLog\\Test.jtl
   [jmeter] Creating summariser <summary>
   [jmeter] Created the tree successfully using D:\\jmeterTest\\script\\手机号码
属地测试.jmx
   [jmeter] Starting the test @ Sun Apr 28 19:15:06 CST 2019 (1556450106344)
   [jmeter] Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump mes
e on port 4445
   [jmeter] summary =      1 in 00:00:02 =    0.4/s Avg:  1864 Min:  1864 Max
1864 Err:     0 (0.00%)
   [jmeter] Tidying up ...    @ Sun Apr 28 19:15:09 CST 2019 (1556450109627)
   [jmeter] ... end of run

_message_xalan:

xslt-report:
     [xslt] Processing D:\\jmeterTest\\resultLog\\Test.jtl to D:\\jmeterTest\\resu
og\\Test.html
     [xslt] Loading stylesheet D:\\software\\apache-jmeter-5.1\\extras\\jmeter-re
ts-detail-report_21.xsl

verify-images:

copy-images:
     [copy] Copying 1 file to D:\\jmeterTest\\resultLog
     [copy] Copying 1 file to D:\\jmeterTest\\resultLog

report:
     [echo] Report generated at 2019/04/28 19:15

all:

BUILD SUCCESSFUL
Total time: 13 seconds
运行信息

测试后

技术图片

浏览器打开HTML文件,显示正确

技术图片

打开jtl文件

技术图片

 

以上是关于Ant+JMeter集成的主要内容,如果未能解决你的问题,请参考以下文章

01 jenkins01 linux+jenkins+ant+jmeter集成

Jmeter+Ant集成环境搭建

Jmeter命令行和ant的集成

jmeter + ant + jenkins 自动化集成环境搭建

Jenkins+Jmeter+Ant持续集成

jmeter+ant+jenkins集成