51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2042|回复: 0
打印 上一主题 下一主题

Jmeter之自定义java请求性能测试

[复制链接]
  • TA的每日心情
    擦汗
    13 小时前
  • 签到天数: 1049 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-10-11 14:50:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、环境准备
      1、新建一个java工程
      2、导入jar包:ApacheJMeter_core.jar ApacheJMeter_java.jar
      这两个jar是使用jmeter最基础的jar,能够让你的代码在jmeter中运行起来,如果在写代码的过程中需要其他的jar,自行导入。
      二、写代码前该知道的
      1、如果想要让你的代码在jmeter中运行起来,在创建类的时候需要去继承AbstractJavaSamplerClient抽象类或者是实现JavaSamplerClient接口
      AbstractJavaSamplerClient抽象类是JavaSamplerClient接口的子类,当你不需要复写所有的需要复写的方法时,那么你只需要去继承AbstractJavaSamplerClient抽象类即可。
      如果你选择了实现JavaSamplerClient接口,那么你需要复写的方法有:
    1.  public SampleResult runTest(JavaSamplerContext context) {}
    2.   public void setupTest(JavaSamplerContext context) {}
    3.   public void teardownTest(JavaSamplerContext context) {}
    4.   public Arguments getDefaultParameters() {}
    复制代码
     这4个方法就必须要复写,但是如果选择继承AbstractJavaSamplerClient这个抽象类,那么只需要复写你需要的方法即可。
      2、方法说明:
    1. public Arguments getDefaultParameters() {}
    复制代码
    这个方法由Jmeter在进行添加javaRequest时第一个运行,它决定了你要在GUI中默认显示出哪些属性。

    1.  public void setupTest(JavaSamplerContext context) {}
    复制代码
    这个方法相当于loadrunner中的init,我们可以用它来进行一些初始化的动作。

    1.  public SampleResult runTest(JavaSamplerContext context) {}
    复制代码
    这个方法相当于loadrunner中的action,我们的核心测试代码就在这里了。
    1.  public void teardownTest(JavaSamplerContext context) {}
    复制代码
     这个方法相当于loadrunner中的end,收尾的工作可以由它来做。
      3、除了以上2点,我们一般还需要去实现Serializable,序列化标记接口,这样可以让我们的类去实现序列化。
      三、代码书写
    package com.lingfeng.jmeter.practice;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.Serializable;
      import java.net.MalformedURLException;
      import java.net.URL;
      import java.net.URLConnection;
      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;
      public class MyJavaRequest extends AbstractJavaSamplerClient implements Serializable {
      private static final long serialVersionUID = 1L;
      private String sUrl;//存储用户输出的url
      private static final String URL_NAME="URL" ;//设置GUI页面显示的变量名称
      //设置GUI页面默认显示的变量值,默认值就是访问百度
      private static final String URLVALUE_DEFAULT="http://www.baidu.com";
      //resultData变量用来存储响应的数据,目的是显示到查看结果树中。
      private String resultData;
      StringBuilder sbResultData = new StringBuilder();
      /*
      * 这个方法用来控制显示在GUI页面的属性,由用户来进行设置。
      * 此方法不用调用,是一个与生命周期相关的方法,类加载则运行。
      * (non-Javadoc)
      * @see org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient#getDefaultParameters()
      */
      @Override
      public Arguments getDefaultParameters() {
      Arguments arguments = new Arguments();
      arguments.addArgument(URL_NAME, String.valueOf(URLVALUE_DEFAULT));
      return arguments;
      }
      @Override
      public void setupTest(JavaSamplerContext context) {
      sUrl = context.getParameter(URL_NAME, URLVALUE_DEFAULT);
      if(sUrl.length()==0){
      sUrl="http://www.baidu.com";//假如用户没有设置url,那么就让他访问百度,哈哈。
      }
      }
      @Override
      public SampleResult runTest(JavaSamplerContext context) {
      /*
      * SampleResult这个类是用来将测试结果输出到查看结果树中的。
      * 并且也是用来控制事务的开始和结束的。
      */
      SampleResult results = new SampleResult();
      results.setSampleLabel("测试"+sUrl+"网站访问速度了啊!!");
      try{
      URL url = new URL(sUrl);
      URLConnection conn = url.openConnection();
      InputStream in = conn.getInputStream();
      byte[] buffer = new byte[1024];
      int len;
      //事务开始标记
      results.sampleStart();
      while((len=in.read(buffer))!=-1){
      resultData = new String(buffer,"UTF-8");//将每次读到的页面返回信息存储到resultData中
      sbResultData.append(resultData);//每读到一次,添加到sb中。
      }
      in.close();
      }catch (MalformedURLException e) {
      results.setSuccessful(false);
      e.printStackTrace();
      }catch (IOException e) {
      results.setSuccessful(false);
      e.printStackTrace();
      }catch(Exception e){//如果发生异常,则捕捉,并且发送事务失败的消息。
      results.setSuccessful(false);
      e.printStackTrace();
      }finally{
      //标记事务结束
      results.sampleEnd();
      }
      results.setSuccessful(true);
      resultData = sbResultData.toString();//将所有读到的数据转换为字符串
      results.setResponseData(resultData,null);//将数据打印到查看结果树当中
      results.setDataType(SampleResult.TEXT);
      return results;
      }
      }

    四、jmeter运行java代码
      1、将代码打包成jar
      2、把打包成的jar放在\apache-jmeter-2.12\lib\ext路径下
      3、打开jmeter GUI,添加线程组,再添加一个java请求,如下图:

     4、添加查看结果树,运行后结果如下:

     五、补充事项
      当我们的代码在运行时发生异常,就会被打印在doc窗口中:

    我这里没有发生异常,所以没有数据,当发生异常时就会打印在这里。注意观察,有助于调试代码。
      六、最后的话
      其实由以上的代码可以看出,这一段测试代码其实没有太大的测试意义,就是模拟了一个HTTP请求访问一个网站。
      但是当我们需要进行一段代码的性能测试的时候,这样来进行书写,并且在runTest方法中进行调用后,那么就可以测试出这段代码的性能如何。





    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-19 22:40 , Processed in 0.066710 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表