前言
由于公司项目需要,将一个公共的文件存储模块封装成了SDK,供各个子系统客户端调用。但是近期出现了一些性能问题,为了找出程序的性能瓶颈,需要直接对SDK进行压测。SDK是用Java代码编写的一个jar包,所以就是需要对Java代码进行压测,于是我就想到了用Jmeter的Java请求,果然Jmeter还是够强大,完美的实现了对SDK的压测,顺利的帮助我们找到了性能瓶颈。
以下是使用IDEA创建的基于Maven项目管理的Java工程
一、创建Java工程实现对被测程序的调用
1.创建基于Maven的Java工程
在IDEA中,点击新建项目,选择Maven项目,点击Next,输入项目名称
2.将测试jar包导入Jmeter
创建好的项目中会自动生成一个pom.xml文件
在pom.xml文件中引入Jmeter的jar包
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>2.12</version>
<exclusions>
<exclusion>
<groupId>d-haven-managed-pool</groupId>
<artifactId>d-haven-managed-pool</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3.编写测试类
在java目录下新建一个class文件,此处implements JavaSamplerClient接口或者是extends AbstractJavaSamplerClient父类 都可以。
Jmeter自带的jar包给我们提供了4个方法,可根据实际需要完善对应的方法,以实现对被测程序的压测。
- getDefaultParameters方法
例如以下代码片段中,设置了param1和param2两个参数,其中param1设置了默认值1
//设置java request的入参,可设置默认值
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("param1", "1");
params.addArgument("param2", "");
params.addArgument("treadNum","${__threadNum}");
return params;
}
在Jmeter中,Java Request界面可以看到有param1和param2两个参数,且param1的value给了默认值1
- setupTest方法
//每个线程会执行1次,用于初始化参数
public void setupTest(JavaSamplerContext javaSamplerContext) {
treadNum = javaSamplerContext.getIntParameter("treadNum");
log.info("treadNum:"+treadNum+" setupTest执行成功!!");
}
- runTest方法
//调用被测程序的主方法,通过该方法入参javaSamplerContext可以获取到jmeter传入的参数
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult result = new SampleResult();
String param1 = javaSamplerContext.getParameter("param1");
String param2 = javaSamplerContext.getParameter("param2");
//设置java Request开始,从此处开始计时,用于统计聚合报告
result.sampleStart();
//设置java Request的返回内容
result.setResponseData("返回消息体,param1:" + param1 + ",param2:" + param2, "utf-8");
//设置java Request的返回状态,true为请求成功,false为请求失败
result.setSuccessful(true);
//设置java Request结束,从此处开始计时,用于统计聚合报告
result.sampleEnd();
return result;
}
- teardownTest方法
//测试结束时调用,每个线程只执行一次。
public void teardownTest(JavaSamplerContext javaSamplerContext) {
log.info("treadNum:"+treadNum+" teardownTest执行成功!!");
}
二、将生成的jar包导入Jmeter
为了让Jmeter中能够加载到我们编写的测试类,需要将生成jar包拷贝到jmeter安装目录下的/lib/ext文件夹中。
但是每次我们用maven打完jar包之后,都有手动拷贝,比较麻烦。我们可以在maven的pom.xml中加上如下代码,指定jar拷贝目录,直接在打包的同时,就将jar包自动拷贝到了jmeter安装目录下的/lib/ext文件夹中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-files</id>
<phase>package</phase>
<configuration>
<tasks>
<!--将生成的项目jar拷贝到jmeter的lib/ext目录下 -->
<copy file="${project.build.directory}/JmeterTestForSDK-0.0.1-SNAPSHOT.jar"
tofile="D:\apache-jmeter-2.13\lib\ext\JmeterTestForSDK-0.0.1-SNAPSHOT.jar"
overwrite="true"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
三、创建Jmeter压测脚本
完成以上步骤后,我们打开jmeter.bat,创建java Request后,就可以看到ClassName下拉框中,出现了我们自己创建的测试类了。
将线程组设置为3个并发,循环5次,咱们来测试一下。
结果树组件中,我们可以看到,执行了15次请求,Response data中打印出了我们在runTest中指定的返回内容。
通过查看bin目录下的jemter.log可以看到,3个线程循环执行5次。setupTest和teardownTest都是每个线程仅执行一次。