jmeter中java协议请求

发表于:2018-7-25 16:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:milkty    来源:博客园

#
Jmeter
分享:
  测试工具:myecplise10.5
  jdk版本:1.8.73
  jmeter: 2.13
  一、核心步骤
  1.创建一个Java工程;
  2.将JMeter的lib目录下的jar文件添加进此工程的Build Path;
  3.创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写;
  public Arguments getDefaultParameters();设置可用参数及的默认值,已设置的参数会显示在jmeter GUI的参数列表中;
  public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
  public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,并调用被测方法,完成与服务器的交互;
  public void teardownTest(JavaSamplerContext arg0):测试结束时调用;
  setupTest和teardownTest方法不需要时可以不写。runTest 该方法是java Sampler实现的重点,执行次数取决于线程数和循环次数。
  以上4个方法中只有runTest是必须实现的,其他3个可根据需求去覆盖。这4个方法执行的先后顺序与其前面的显示顺序相对应。
  如果需要对多个方法进行性能测试,则需要建多个测试类,多个测试类可以放在同一个包下面,也可以放在单独的包中。
  4.Export为Runnable Jar File;
  5.将此jar包放入JMETER_HOME\lib\ext目录;
  6.以管理员身份打开JMeter;
  7.创建线程组、Java Request、查看结果树,进行测试;
  二、实例
  1.在eclipse里面新建一个工程:JavaForJMeter
  2.把{Jmeter_home}\lib目录下的所有jar,引用的jar包复制到lib目录,并添加进此工程的Build Path;
  注意:lib\ext目录下ApacheJMeter_core.jar,ApacheJMeter_java.jar两个jar包肯定需要build到项目中,另外还需要对其如果在ecplise中执行时报其他错可再添加相应的jar包。为方便,就可导入lib目录下的所有jar包。
  Logkit-2.0.jar :记录 jmeter 打屏日志使用的包
  Httpclient-4.3.2.jar : http 相关接口包
  3.添加类Hello,代码如下:
  package test;
  public class Hello {
  public String sayHello()
  {
  return "Hello";
  }
  //    public String sayHelloToPerson(String s)
  //    {
  //        if(s == null || s.equals(""))
  //            s = "nobody";
  //        return (new StringBuilder()).append("Hello ").append(s).toString();
  //    }
  public int sum(int a,int b)
  {
  return a+b;
  }
  }

  4.添加类perftest,并继承AbstractJavaSamplerClient,并添加代码如下:
  注意:
  1)System.out等的输出会显示在启动JMeter时的命令窗口内,但过多的输出会影响性能的准确性。
  2)http请求在任何情况下都会有给客户端一个反馈,但是java请求不一定。在设置的压力较大时,服务器可能会吃不消直接异常退出,客户端获取不到任何返回值,保存返回结果的对象(如本例中的resultData)的值就为null。所以需要做空指针的判断,保证代码的正常运行。
  package 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 test.Hello;
  public class test extends AbstractJavaSamplerClient {
  private String a;
  private String b;
  private String resultData = null ;
  // 这个方法是用来自定义java方法入参的。
  // params.addArgument("num1","");表示入参名字叫num1,默认值为空。
  // 设置可用参数及的默认值;
  public Arguments getDefaultParameters() {
  Arguments params = new Arguments();
  params.addArgument("num1", "");//未设默认值
  params.addArgument("num2", "");
  return params;
  }
  // 每个线程测试前执行一次,做一些初始化工作;
  public void setupTest(JavaSamplerContext arg0) {
  }
  // 开始测试,从arg0参数可以获得参数值;
  public SampleResult runTest(JavaSamplerContext arg0) {
  a = arg0.getParameter("num1");
  b = arg0.getParameter("num2");
  SampleResult sr = new SampleResult();
  sr.setSampleLabel("qingqiu");
  try {
  sr.sampleStart();// jmeter 开始统计响应时间标记
  Hello test = new Hello();
  // 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
  resultData = String.valueOf(test.sum(Integer.parseInt(a), Integer
  .parseInt(b)));
  if (resultData != null && resultData.length() > 0) {
  sr.setResponseData("结果是:"+resultData, null);//第二个参数指定编码方法
  sr.setDataType(SampleResult.TEXT);
  }
  System.out.println(resultData);
  sr.setSuccessful(true); //将这行放在上边if语句里更好?
  } catch (Throwable e) {
  sr.setSuccessful(false); //设置本次测试结果为false
  e.printStackTrace();
  } finally {
  sr.sampleEnd();// jmeter 结束统计响应时间标记
  }
  return sr;
  }
  // 测试结束时调用;
  public void teardownTest(JavaSamplerContext arg0) {
  //System.out.println(end);
  // System.out.println("The cost is"+(end-start)/1000);
  }
  // main只是为了调试用,最后打jar包的时候注释掉。
  public static void main(String[] args) {
  Arguments params = new Arguments();
  params.addArgument("num1", "1");//设置参数,并赋予默认值1
  params.addArgument("num2", "2");//设置参数,并赋予默认值2
  JavaSamplerContext arg0 = new JavaSamplerContext(params);
  test test = new test();
  test.setupTest(arg0); //无初始化,可不使用
  test.runTest(arg0);
  test.teardownTest(arg0); //方法中无代码,可不使用
  }
  }
  main方法执行结果如下:
  WARN    2016-03-20 00:20:01.895 [jmeter.u] (): Unexpected value set for boolean property:'sampleresult.getbytes.body_real_size', defaulting to:true
  WARN    2016-03-20 00:20:01.941 [jmeter.u] (): Unexpected value set for boolean property:'sampleresult.getbytes.headers_size', defaulting to:true
  WARN    2016-03-20 00:20:01.941 [jmeter.u] (): Unexpected value set for boolean property:'sampleresult.timestamp.start', defaulting to:false
  WARN    2016-03-20 00:20:01.941 [jmeter.u] (): Unexpected value set for boolean property:'sampleresult.useNanoTime', defaulting to:true
  WARN    2016-03-20 00:20:01.941 [jmeter.u] (): Unexpected value set for int property:'sampleresult.nanoThreadSleep', defaulting to:5000
  INFO    2016-03-20 00:20:01.941 [jmeter.s] (): Note: Sample TimeStamps are END times
  INFO    2016-03-20 00:20:01.942 [jmeter.s] (): sampleresult.default.encoding is set to ISO-8859-1
  INFO    2016-03-20 00:20:01.942 [jmeter.s] (): sampleresult.useNanoTime=true
  INFO    2016-03-20 00:20:01.942 [jmeter.s] (): sampleresult.nanoThreadSleep=5000
  3

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号