说明与步骤
- 原则上jmeter的java请求,可以压测一切可使用java访问的东西,包括Redis,MQ等等。
- 需要lib/ext中的ApacheJMeter_core.jar,如扩展java请求则还需要ApacheJMeter_java.jar,扩展http请求则需要ApacheJMeter_http.jar,依次类推,都在lib/ext中,另外lib中的avalon-framework-4.1.4.jar根据实际需要也会用到(jmeter3.2中名称是framework)
- 下文中的代码,则是具体的被测类和测试类的编写。(当然,你要先用eclipse创建工程,导入前面说的jar包,再新建package,新建class,撸代码),完成后导出被测jar包放到lib中,测试用的jar包放到lib/ext中。
- 新建java请求,就可以看到。并传入响应的参数。比如method=add,num1=111,num2=222,然后点击执行,就可以看到结果,如下图。
代码实例
被测类
public class Calc {
public int add(int x, int y){
return x + y;
}
public int minus(int x, int y){
return x - y;
}
}
测试类
package com.cmos.test;
/*
* 一般来说,扩展java请求通常需要的类有:
* AbstractJavaSamplerClient
* JavaSamplerContext 容器类
* SampleResult 结果统计类
* Argument 参数类
* */
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.config.Arguments;
import java.util.Random;
import com.cmos.JmeterTest.Calc;
public class TestCalc extends AbstractJavaSamplerClient {
/*
* 一般来说,需要定义全局变量,是用来实现逻辑处理
* 包括控制变量、入参、结果。一般由被测方法决定
* */
private String method;
private int x;
private int y;
private String resultData;
Calc c = new Calc();
/*
* 通过getDefaultParameters()可以来定义入参
*
* */
public Arguments getDefaultParameters(){
//定义属性对象,用来添加GUI参数
Arguments params = new Arguments();
//添加一个GUI参数,名称叫"method",值是"add"
params.addArgument("method", "add");
params.addArgument("num1","111");
params.addArgument("num2",null);
return params;
}
//每个线程测试前执行一次,做一些初始化工作;
public void setupTest(JavaSamplerContext arg0) {
}
//JavaSampleContext arg0()就是用来接收GUI所提交的
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
SampleResult sr = new SampleResult();
try{
//将GUI界面传递过来的值赋给全局变量
method = arg0.getParameter("method");
x = Integer.parseInt(arg0.getParameter("num1",null));
y = Integer.parseInt(arg0.getParameter("num2",null));
//是表示请求开始计时
sr.sampleStart();
//实际测试不需要,模拟处理过程中所需消耗的时间
// Random rnd = new Random();
// Thread.sleep(rnd.nextInt(1000));
//通过GUI传递的method参数来决定所执行的方法
if(method.equals("add")){
resultData = String.valueOf(c.add(x, y));
}
else if(method.equals("minus")){
resultData = String.valueOf(c.minus(x, y));
}
if(resultData != null && resultData.length()>0){
//设置响应数据为resutlData;也可以用sr.setSamplerData("OK");
sr.setResponseData(resultData,null);
//设置响应代码为0
sr.setResponseCode("0000");
//设置响应类型为text
sr.setContentType(SampleResult.TEXT);
//设置响应状态为true
sr.setSuccessful(true);
//设置响应信息
sr.setResponseMessage("方法执行成功!");
}
else{
sr.setResponseData(resultData,null);
//设置响应代码为-9999
sr.setResponseCode("-9999");
//设置响应类型为txt
sr.setContentType(SampleResult.TEXT);
//设置响应状态为true
sr.setSuccessful(false);
//设置响应信息
sr.setResponseMessage("方法执行失败!");
}
}
catch(Exception e){
sr.setResponseData(e.getMessage(),null);
e.printStackTrace();
sr.setResponseCode("-1");
sr.setContentType(SampleResult.TEXT);
sr.setSuccessful(false);
sr.setResponseMessage("捕获异常!");
}
finally{
//表示请求结束计时
sr.sampleEnd();
}
//表示返回这个SampleResult对象sr
return sr;
}
public void teardownTest(JavaSamplerContext arg0) {
// System.out.println(end);
// System.out.println("The cost is"+(end-start)/1000);
}
}