通过Jmeter进行Java接口压测往往需要对ApacheJMeter_java进行二次开发,对ApacheJMeter_java进行扩展。此篇内容适合于RPC接口测试等。
此章节自行实践
1.2.1、引入jmeter依赖包
<dependency>
<groupId>org.apache.jmetergroupId>
<artifactId>ApacheJMeter_coreartifactId>
<version>3.3version>
dependency>
<dependency>
<groupId>org.apache.jmetergroupId>
<artifactId>ApacheJMeter_javaartifactId>
<version>3.3version>
dependency>
1.2.2、引入hsf依赖包
<dependency>
<groupId>com.taobao.hsfgroupId>
<artifactId>hsf-app-springartifactId>
<version>2.2.4.9version>
dependency>
<dependency>
<groupId>com.taobao.hsfgroupId>
<artifactId>hsf-registry-configserverartifactId>
<version>2.2.4.9version>
dependency>
1.2.3、引入被测试hsf接口依赖包
<dependency>
<groupId>com.alibaba.gdsgroupId>
<artifactId>gds-sparta-modelartifactId>
<version>1.6.20-SNAPSHOTversion>
dependency>
<dependency>
<groupId>com.autonavi.frameworkgroupId>
<artifactId>amap-data-framework-logs-slf4jartifactId>
<version>2.1-SNAPSHOTversion>
dependency>
新建测试类,该类必须继承AbstractJavaSamplerClient类或实现JavaSamplerClient接口,需要重写以下方法:
//设置入参,已设置的参数会显示在jmeter GUI的参数列表中
public Arguments getDefaultParameters();
//初始化方法,用于初始化性能测试的每个线程,每个线程前都会执行一次。
public void setupTest(JavaSamplerContext context);
//性能测试的线程运行体,测试执行主体,从arg0中获取参数,并调用被测方法,完成与服务器的交互。
//该方法是java Sampler实现的重点,执行次数取决于线程数和循环次数。
public SampleResult runTest(JavaSamplerContext arg0);
//测试结束时调用,每个线程执行一次。setupTest和teardownTest方法不需要时可以不写。
public void teardownTest(JavaSamplerContext arg0);
以上4个方法中只有runTest是必须实现的,其他3个可根据需求去覆盖。如果需要对多个方法进行性能测试,则需要建多个测试类。
sampleResult的sampleStart和sampleEnd方法调用时会分别生成一个时间戳,两个时间戳之差就是一次java请求的响应时间,单位是ms。
代码编写完成后,可以写一个main方法对整个过程进行测试。
mport com.alibaba.rpc.api.TransactionWebApiService;
import com.alibaba.rpc.api.args.TransQueryReqArgs;
import com.autonavi.framework.hsf.response.Result;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 数据获取接口性能测试,jmeter
*/
public class GetDataPerformersTest extends AbstractJavaSamplerClient {
private TransactionWebApiService transactionWebApiService;
/**
* JMeter界面中展示出此方法所设置的默认参数
* @return 返回默认参数
*/
@Override
public Arguments getDefaultParameters(){
Arguments args = new Arguments();
args.addArgument("hsfServer", "com.alibaba.rpc.api.TransactionWebApiService");
args.addArgument("hsfGroup", "HSFQA3");
args.addArgument("hsfVersion", "1.0.0.DAILY");
args.addArgument("taskId", "");
args.addArgument("queryType", "1");
return args;
}
@Override
public void setupTest(JavaSamplerContext context){
// 获取JMeter中输入的用户参数
String hsfServer = context.getParameter("hsfServer");
String hsfGroup = context.getParameter("hsfGroup");
String hsfVersion = context.getParameter("hsfVersion");
transactionWebApiService = TransactionWebApi.getServerAPI(hsfServer,hsfGroup,hsfVersion);
}
@Override
public void teardownTest(JavaSamplerContext context){
System.exit(0);
}
@Override
public SampleResult runTest(JavaSamplerContext context) {
// 创建SampleResult对象,用于记录执行结果的状态,并返回
SampleResult sampleResult = new SampleResult();
// 获取JMeter中输入的用户参数
String taskId = context.getParameter("taskId");
String queryType = context.getParameter("queryType");
// 开始
sampleResult.sampleStart();
//调用被测试的接口
List layerList = new ArrayList<>();
layerList.addAll(Arrays.asList(layers.split(",")));
TransQueryReqArgs transQueryReqArgs = new TransQueryReqArgs();
transQueryReqArgs.setTransId(Long.parseLong(taskId));
transQueryReqArgs.setQueryType(Integer.parseInt(queryType));
Result
代码中的log.info,将在jmeter的日志信息中进行展示,但要注意日志输出不要放在sampleStart和sampleEnd之间,以免影响性能结果的正确性,示例代码中未实现,大家可以自行实现。
sampleResult.setResponseCode(“200”);
sampleResult.setResponseMessage(“成功测试”);
sampleResult.setSampleLabel(“样式1”); //示例中并没有实现,大家可以自行实现。
results.setSamplerData(“请求参数”+str1) //示例中并没有实现,大家可以自行实现。
results.setResponseData(“响应结果”, null);
1.5.1、打包时不要把依赖包一起打入Jar包,否则jmeter不能识别被测试的方法。
1.5.2、idea打包配置如下(这里使用idea本身的编译工具进行编译打包,需要使用其他方式的可以自行研究)
第一步:选择File -> project structure…
第二步:选择Artifacts 点击 + 选择 JAR -> From modules with dependencies…
第三步:选择要打包的Module,选择 Jarfiles from libraries 为第二项 copy to the output directory and link via manifest,并选择存MANIFEST.MF文件的位置(建议放在resources下),不用选Main Class。
第四步:在Output Layout 选项卡下 建立一个文件夹,将所有的依赖文件拖放到文件夹中。
第五步:在Output Layout 选项卡下选择将要打包的JAR包的名字,并在弹出的配置中,配置Class path,修改所有依赖包的相对路径。
第六步:确认或者修改编译输出目录(建议使用默认目录)并勾选 include in project build。
第七步:代码调试并测试通过代码, 点击Idea 的build菜单,完成代码编译。
很多时候我们本地的机器的配置(cpu, 内存, 带宽等)都不足以进行灰度环境的压测,又或者本地机器无法连接灰度环境的原因,在实际压测过程中都要有施压机。
更进一步,可以做一个工具对Jmeter进行封装。该工具能够根据需求来分配施压机,同时又可以直接运行jmeter脚本进行压测。