Jmeter-maven-plugin在maven编译过程中默认从<basedir>\src\test\jmeter下搜索jmx测试计划,并在verify阶段执行测试计划,最后把执行的日志结果保存在<project.build.directory>\jmeter\results下。
对于jmeter内置支持的sampler来说jmeter-maven-plugin只需要维护好测试计划即可,但java request的请求还需要提前把发压的jar拷贝到jmeter的lib\ext目录下,发压jar依赖的所有jar放到lib下。经过多次尝试决定将编写java request的项目与jmeter-maven-plugin的项目分开,因为java request的测试接口可能会增加、减少,或调整传入参数数量、取值范围等,接口调用的工作可以让项目内的性能测试工程师专职维护,jmeter-maven-plugin的项目不需要编写脚本,仅维护测试用例和发压数据,在jenkins上通过配置参数实现一键发压,让项目组内任何测试工程师执行。
Jmeter java request项目的编写可参见《神州买卖车性能测试脚本编写方法》,pom文件中将jmeter升级为3.1,由于被测接口需要,还需多依赖一个servlet-api,另外将maven命令改为clean install,将项目的jar install到maven本地仓库中(jmeter-maven-plugin项目中会用到)。
Jmeter-maven-plugin项目不维护任何接口调用的代码,只通过配置实现依赖jar的复制,并配合jenkins实现对测试计划中相关参数的赋值,以实现性能自动化。
项目组织结构如下:
在项目的main/resources下新建data目录,里面存放接口发压用到的参数化文件,文件名最好与接口名一致。在test下新建jmeter目录,jmeter-maven-plugin插件默认会从这里搜索所有jmx测试计划,测试计划名最好与接口名一致。
pom文件如下:
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ucar.perf</groupId>
<artifactId>jmeter-ucoms-jenkins</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.ucar.perf</groupId>
<artifactId>jmeter-ucoms</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteReleases>true</overWriteReleases>
<overWriteIfNewer>true</overWriteIfNewer>
<outputDirectory>${project.build.directory}/jmeter/lib</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>2.1.0</version>
<executions>
<execution>
<id>jmeter-tests</id>
<phase>verify</phase>
<goals>
<goal>jmeter</goal>
</goals>
</execution>
</executions>
<configuration>
<downloadExtensionDependencies>false</downloadExtensionDependencies>
<testFilesIncluded>
<jMeterTestFile>getBookOrderDetailByNo.jmx</jMeterTestFile>
</testFilesIncluded>
<propertiesUser>
<parameterFilePath>${project.build.outputDirectory}/data/</parameterFilePath>
</propertiesUser>
<resultsFileNameDateFormat>yyyy-MM-dd</resultsFileNameDateFormat>
<resultsFileFormat>csv</resultsFileFormat>
<jmeterExtensions>
<artifact>com.ucar.perf:jmeter-ucoms:0.0.1-SNAPSHOT</artifact>
</jmeterExtensions>
<jMeterProcessJVMSettings>
<xms>128</xms>
<xmx>128</xmx>
</jMeterProcessJVMSettings>
</configuration>
</plugin>
</plugins>
</build>
</project>
Dependency里只依赖java request里要用到的jar,因为上一步编译时已经install到maven本地仓库了,因此这里可以从本地仓库中获取。
l Build下使用maven-dependency-plugin将依赖的jar复制到${project.build.directory}/jmeter/lib下;
l jmeter-maven-plugin下通过<jmeterExtensions>将java request的jar复制到jmeter/lib/ext下(即dependency里依赖的jar);
l 通过<testFilesIncluded>指定jmx测试计划的名字(与jenkins结合时这里可以用参数指定);
l 通过<propertiesUser>在jmeter的user.properties中添加用户级别的参数,配合测试计划中添加相同的用户参数,让jmeter可以找到参数化文件的路径,这里添加parameterFilePath指向编译后的参数化文件路径${project.build.outputDirectory}/data/(在jenkins机器上执行发压时必须指定这个路径,因为参数化文件会放到编译输出的路径下,如果调用远程发压机则不需在这里指定,而需要通过jenkins里的插件将参数化文件复制到发压机指定目录下);
l jmeter-maven-plugin执行发压时将启动新的java进程,通过<jMeterProcessJVMSettings>可以添加各种jvm的参数,这里指定jvm heap最大最小都为128m;
Maven命令为clean
verify
参数化设置中将参数化文件命改为${parameterFilePath}getBookOrderDetailByNo.dat
同时添加User Defined Variables,添加自定义的参数parameterFilePath,Value为${__P(parameterFilePath,)},表示从jmeter的properties文件中取值:
在pom中面已通过<propertiesUser>向jmeter的user.properties文件中增加了参数parameterFilePath,jmeter执行时这里就被替换成了具体的参数化文件路径。