jmeter自动化-传参

时间:2021-07-31 18:20:12

用Jenkins+ant+jmeter,做接口自动化,然后想到是不是可以把jmeter的一些数据进行参数化,然后构建的时候直接传参过去。

一、把脚本进行参数化

1、希望把线程数、循环次数,启动时间都参数化,用jmeter的函数助手,选择__p,可以设置默认值,也可以不设,如下图1所示

2、参数化服务器名称和端口,用jmeter的函数助手,选择__property,可以设置默认值,也可以不设,如下图2所示

jmeter自动化-传参

jmeter自动化-传参


二、修改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,如下图

jmeter自动化-传参

(2)构建时,输入参数后构建,构建成功

jmeter自动化-传参


遇到的问题

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命令这一行删除,次数就正常了

jmeter自动化-传参