一、背景
现在有一个java的sdk,我想测试sdk接口的性能,因为这不是一个http请求,我无法直接使用jmeter的http请求取样器去进行测试,这时就需要使用jmeter的java请求取样器,他需要我们编写java代码来实现调用逻辑,jmeter来帮助我们去实际调用,我们依然可以使用其汇总结果或其他取样器来测试接口的性能指标,类似的需求还有当接口是自定义的tcp接口时也可以采用此种方式。
二、使用步骤
1.导入依赖(Maven项目)
在pom文件中添加如下依赖
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.5</version>
</dependency>
2.编写代码
创建一个测试类,继承抽象类AbstractJavaSamplerClient类,实现抽象方法runTest,该方法即为jmeter实际调用的功能测试方法,该抽象类还有其他默认实现的方法,在下方示例代码中做了简单的解释供参考。
package com.fkp.jmeter.test;
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.nio.charset.StandardCharsets;
public class TestDemo extends AbstractJavaSamplerClient {
private String name;
private int age;
/**
* 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
* @return Arguments对象
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("name", "zhangsan");
arguments.addArgument("age", "24");
return arguments;
}
/**
* 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作
* @param context 可以获取jmeter传递过来的参数
*/
@Override
public void setupTest(JavaSamplerContext context) {
//对成员变量初始化
name = context.getParameter("name");
age = context.getIntParameter("age");
}
/**
* 真正的测试代码块,jmeter按照配置的逻辑执行该方法
* @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数
* @return SampleResult对象用于封装结果
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sr = new SampleResult();
//设置标签
sr.setSampleLabel("testDemo");
//设置开始标志,否则无法统计tps等
sr.sampleStart();
try {
//执行业务逻辑
String data = "name: " + name + ", age: " + age;
sr.setResponseCodeOK();
sr.setResponseData(data, StandardCharsets.UTF_8.displayName());
sr.setSuccessful(true);
}catch (Throwable e){
e.printStackTrace();
sr.setResponseCode("500");
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
sr.setSuccessful(false);
}finally {
sr.sampleEnd();
}
return sr;
}
/**
* 测试完成后执行,一般用于关闭资源
* @param context 上下文对象,可用于获取jmeter传递的参数
*/
@Override
public void teardownTest(JavaSamplerContext context) {
System.runFinalization();
}
}
3.打包
可以是普通的JavaSE项目、Maven项目、SpringBoot项目,重点在于需要将项目打成jar包且满足以下结构。
xxx.jar
META-INF #元数据信息
MANIFEST.MF #记录打包的环境
com #完整的包目录结构,编译后的class文件
fkp
xxx.class #测试类
xxx.class #测试类
注意:xxx.jar包中不要存在依赖的jar包,如果打包后结构不是这样可以手动调整为这个结构
4.上传到jmeter中
将打包后的程序jar包(这里成为demo.jar)上传到jmeter根目录下的lib/ext目录下
将demo.jar依赖的jar包放到jmeter根目录下的lib目录下
5.使用jmeter进行测试
打开jmeter -> 添加线程组 -> 添加java请求取样器 -> 添加结果树(汇总报告等)
在java请求取样器中可以选择demo.jar中继承了AbstractJavaSamplerClient的测试类,选中后即可看到请求的默认参数(如果有的话),之后就和测试http接口相同了。