实际过程中采用Jmeter压测Http接口比较多,但当有些请求逻辑比较复杂的时候,Jmeter 中自带的sample比较难实现,或者是实际工作中也可能会遇见一些无法通过http 来实现的,比如通过SDK来获取token,然后拿token再去请求其他的接口等等,就需要借助java request来实现逻辑。
Jmeter自带的java request defaults(包含 java test 和 Sleep test 2个)
下面来看下创建自己需要的Java Request 的步骤:
1. 创建Java 工程
2. 引入JMeter在lib目录和lib\ext 目录下的jar包:
ApacheJMeter_core.jar
ApacheJMeter_java.jar
avalon-framework-4.1.4.jar
jorphan.jar
logkit-2.0.jar
-------------------------------------------------------------------
import org.apache.jmeter.config.Arguments; //请求参数
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; //请求基类
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; //请求上下文,可以理解为Jmeter传过来的内容
import org.apache.jmeter.samplers.SampleResult;//请求结果
3. 创建一个类并实现javaSamplerClient 接口或继承AbstractJavaSamplerClient,并重写:
public Arguments getDefaultParameters():设置可用参数及默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContest arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContest arg0):测试结束时调用;
( 调用顺序: getDefaultParameters——> setupTest——> runTest ——> teardownTest )
4. 导出jar包到 {JMETER_HOME}\lib\ext目录中。
5. 重启JMeter界面
6. 新增java请求,选择需要的类名称,填写参数。
7. 设置线程组、结果树、进行测试。
举例:新建一个随机生成中文姓名的Java请求
1. 创建类 TestDemo, 继承自AbstractJavaSamplerClient
public class TestDemo extends AbstractJavaSamplerClient;
2. getDefaultParameters: 默认参数设置,将显示在JMeter界面。
public Arguments getDefaultParameters(){
Argument args = new Arguments();
args.addArgument(name:"name_count", value:"2"); //设置参数name_count,并赋予默认值2
args.addArgument(name:"name_count", value:"3");
args.addArgument(name:"all_random", value:"true");
args.addArgument(name:"last_name", value:"张");
return args;
}
3. setupTest:初始化的操作,比如将参数复制给变量。
public void setupTest(JavaSamplerContest JavaSamplerContest){
this.labeName = JavaSamplerContest.getParameter( "TestElement");
this.nameCount = JavaSamplerContest.getIntParament("name_count");
this.nameLength = JavaSamplerContest.getIntParameter("name_length");
this.allRandom = Boolean.valueOf(JavaSamplerContest,getOaraneter("all_random");
this.lastName = javaSamplerContext.getParameter("last_name");
}
4. runTest: 逻辑主体
(sampleStart和sampleEnd作为统计事务的开始和结束。 setSuccessful 可以设置事务的成功失败。)
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult results = new SampleResult();
try{
results.sampleStart(); //统计时间开始标志
List<String> names = CreateName.GetName(nameCount, nameLength, allRandom, lastName);
//正常
results.setResponseDate(names.toString(),"UTF-8");
results.setDataType(SampleResult.TEXT);
results.setSuccessful(true);
} catch (Throwable e) {
//有异常
results.setSuccessful(false);
results.setResponseMessae(e.toString());
} finally {
results.sampleEnd();// jmeter 统计时间结束标记
}
return resules;
}
5. teardownTest:结束时的操作
public void teardownTest(JavaSamplerContext JavaSamplerContext) {
6. 导出jar包:TestDemo.jar, 放入 {JMETER_HOME}\lib\ext目录中.
7. 重启Jmeter, 新创建 java request,名称处可选择到TestDemo