用Jenkins+ant+jmeter,做接口自动化,然后想到是不是可以把jmeter的一些数据进行参数化,然后构建的时候直接传参过去。
一、把脚本进行参数化
1、希望把线程数、循环次数,启动时间都参数化,用jmeter的函数助手,选择__p,可以设置默认值,也可以不设,如下图1所示
2、参数化服务器名称和端口,用jmeter的函数助手,选择__property,可以设置默认值,也可以不设,如下图2所示
二、修改build.xml文件
1、在build文件中定义脚本中的变量,并在构建时传参给脚本,详细代码为
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <tstamp> <format property="time" pattern="yyyyMMddHHmm" /> </tstamp> <!-- 本地存放报告的路径--> <property name="basedirectory" value="D:\software\workspace\report" /> <!-- 本地存放脚本的路径--> <property name="scriptdirectory" value="D:\scriptFile\jmeter\yuejuanxing" /> <!-- 需要改成自己本地的 Jmeter 目录--> <property name="jmeter.home" value="D:\software\apache-jmeter-3.0" /> <!-- jmeter生成jtl格式的结果报告的路径--> <property name="jmeter.result.jtl.dir" value="${basedirectory}" /> <!-- jmeter生成html格式的结果报告的路径--> <property name="jmeter.result.html.dir" value="${basedirectory}" /> <!-- Name of test (without .jmx) --> <property name="testscript" value="Test"/> <!-- 生成的报告的前缀--> <property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${testscript}${time}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${testscript}${time}.html" /> <!-- 声明要往测试脚本里传递的参数--> <property name="threadscount" value="1" /> <property name="loop" value="1" /> <property name="host" value="www.baidu.com" /> <property name="port" value="80" /> <property name="ramp" value="0" /> <path id="xslt.classpath"> <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> </path> <target name="run"> <property name="run.log" value="${basedirectory}/${threadscount}_${loop}.log"/> <echo message="${run.log}"/> <record name="${run.log}"/> <echo message="server: ${host}:${port}"/> <echo message="threads = ${threadscount}"/> <echo message="loops = ${loop}"/> <echo message="rampups = ${ramp}"/> <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}"> <!--声明要传递的参数--> <property name="threadscount" value="${threadscount}" /> <property name="loop" value="${loop}" /> <property name="host" value="${host}" /> <property name="port" value="${port}" /> <property name="ramp" value="${ramp}" /> <!--声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本--> <testplans dir="${scriptdirectory}" includes="${testscript}.jmx" /> </jmeter> </target> <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="${basedirectory}/jmeter.results.shanhe.me.xsl"> <param name="dateReport" expression="${report.datestamp}"/> </xslt> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> </target> </project>
三、运行ant或Jenkins,看是否成功
1、直接用ant,然后用命令
ant -Dhost=真实服务器地址 -Dport=80 -Dthreadscount=3 -Dloop=1 -Dramp=0 -Dtestscript=测试传参结果jmx文件没有运行,后来调试了好久,发现是有两个参数传过去出错了,好像是不支持,也不知道为什么不支持,于是把port和ramp这两个参数,在build.xml里注释掉了
<!--<property name="port" value="${port}" /> <property name="ramp" value="${ramp}" />-->然后再运行,就没有问题了
2、用Jenkins直接传参
(1)在job的配置里,参数化构建过程里添加参数,选择string parameter,如下图
(2)构建时,输入参数后构建,构建成功
遇到的问题
1、参数传过去后,没有运行jmx文件,上面已经给出了解决方案,有两个参数port和ramp不支持,于是在build文件里被注释掉,就好了
2、运行次数翻倍了,本来传参时写着2个线程循环2次,应该是运行4次,结果运行了8次,后来才发现是因为我在下图的命令框中加入了ant命令
ant -Dhost=真实服务器地址 -Dport=80 -Dthreadscount=3 -Dloop=1 -Dramp=0 -Dtestscript=脚本名称ant命令本身就执行了一次,然后又调用ant再执行了一次,所以总次数翻倍了,于是把ant命令这一行删除,次数就正常了