[置顶] jmeter之编写java请求-扩展Java Sampler

新浪围脖>@o蜗牛快跑o   企鹅交流群>79642549

通常情况下,推荐使用jmeter之java请求编写一beashell调用java代码(上篇)(推荐)编写java 请求

有以下优势

  • 脚本易维护
  • 易调试
  • 开发脚本周期短

不过网上扩展java请求文章比较多的还是,通过实现org.apache.jmeter.protocol.java.sampler.JavaSamplerClient接口

或是继承AbstractJavaSamplerClient虚类来实现java请求

大致步骤如下:

1. 建立java工程
2. 加载依赖包到java工程环境变量中,ApacheJMeter_core.jar和ApacheJMeter_java.jar编写时需要,调试需要加载jmeter全部依赖包(jmeter_home/lib下所有,实际上不是所有,包比较多,很难辨别)
3. 编写Java Sampler,继承AbstractJavaSamplerClient,并重写如下方法

public Arguments getDefaultParameters();可选,定义可用参数及默认值;
public void setupTest(JavaSamplerContext arg0):可选,测试前执行,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0);必选,实现自定义请求;
public void teardownTest(JavaSamplerContext arg0):可选,测试结束时调用;
4. 打jar包,将包放到jmeter_home/lib/ext/下
5. 记得把所有额外的(自定义协议依赖的,非jmeter的)依赖包放到jmeter环境变量中
6. 重启jmeter,创建java Sampler选择刚定义好的测试类,如下图:
[置顶] jmeter之编写java请求-扩展Java Sampler_第1张图片

7. 调整好参数即可开始测试。

编写模板介绍

package com.sampler;
//编写jmeter.sampler插件需加载的包
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.io.PrintWriter;
import java.io.StringWriter;


/**
*
* @author wo niu
* @func test ejb interface
*
*  继承虚类AbstractJavaSamplerClient
*/
public class JavaSampler extends AbstractJavaSamplerClient {

// main只是为调试用,最好先调试再打包
//运行前请把jmeter_home/lib下的所有jar包加载到IDE工具环境变量
  public static void main(String[] args)
  {
      Arguments args0 = new Arguments();
      args0.addArgument("parm_1","val_1");
      args0.addArgument("parm_2","val_2");
      args0.addArgument("parm_N","val_N");
      JavaSampler  test = new JavaSampler();
      JavaSamplerContext context = new JavaSamplerContext(args0);
      test.setupTest(context);
      test.runTest(context);
      test.teardownTest(context);
  }

/**
 *  实现 runTest(JavaSamplerContext context)方法
 *  runTest()具体实施测试动作
 */
public SampleResult runTest(JavaSamplerContext context)  {
    /*
     *  SampleResult只能定义为局部变量,避免出现多线程安全问题
     *  网上一些帖子,定义为全域变量,这种做法是错误的
     */
    SampleResult results = new SampleResult();
    //默认请求成功
    results.setSuccessful(true);
    results.sampleStart(); //记录响应时间开始
    try{
        //动态变量从context中读取:
        // String key = context.getParameter("key");
        //TO-DO ejb接口调用

        if(false){ //失败时处理
            results.setSuccessful(false);
            results.setResponseData("响应数据","utf8");
        }
    }catch(Throwable e){
        e.printStackTrace();
        results.setSuccessful(false);
        //处理异常堆栈为String,只有String才能回写响应数据
        results.setResponseData(toStringStackTrace(e),"utf8");
    }
    results.sampleEnd(); //记录响应时间结束
    return results;
}

/**
 * 测试开始时调用,初始化
 */
public void setupTest(JavaSamplerContext context){
}
/**
 * 测试结束时调用
 */
public void teardownTest(JavaSamplerContext context){
}

/**
 *  定义默认参数
 */
@Override
public Arguments getDefaultParameters() {
    Arguments args = new Arguments();
    /*
     * test data
     */
    args.addArgument("parm_1","val_1");
    args.addArgument("parm_2","val_2");
    args.addArgument("parm_N","val_N");
    return args;
}

/**
 *  处理异常堆栈为String,只有String才能回写响应数据
 * @param e
 * @return
 */
private String toStringStackTrace(Throwable e){
    String exception = null;
    try {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        exception = sw.toString();
        pw.close();
        sw.close();
    } catch (Exception e1) {
        e1.printStackTrace();
    }
    return exception;
}

}



你可能感兴趣的:(性能测试,JMeter,场景设计,java请求编写)