zoukankan      html  css  js  c++  java
  • Jmeter自定义Java请求开发

    一、本次实验目的

    IDEA新建maven项目,使用java开发自定义jmeter的请求。

    本次开发使用的代码,会百度云分享给大家。

    二、本次实验环境

    Idea

    2017.02

    Jmeter

    5.1.1

    三、新建maven项目

    pom.xml文件中导入依赖。

     
     <dependencies>
    
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_functions -->
        <dependency>
          <groupId>org.apache.jmeter</groupId>
          <artifactId>ApacheJMeter_functions</artifactId>
          <version>5.1.1</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core -->
        <dependency>
          <groupId>org.apache.jmeter</groupId>
          <artifactId>ApacheJMeter_core</artifactId>
          <version>5.1.1</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_java -->
        <dependency>
          <groupId>org.apache.jmeter</groupId>
          <artifactId>ApacheJMeter_java</artifactId>
          <version>5.1.1</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.5.5</version>
        </dependency>
    
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.47</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    
      </dependencies>

    四、代码编写

    4.1、以上一节监控的demo实现的两个接口为例,来编写实现请求的自定义请求

    打开jmeter,添加javarequest如下图所示:

    image.png默认只有两个class。

    4.2、新建class实现JavaSamplerClient接口

     
    package com.jmeter.functions;
    import org.apache.jmeter.config.Arguments;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;
    public class CustemRequest implements JavaSamplerClient {
        @Override    public void setupTest(JavaSamplerContext javaSamplerContext) {
        }
        @Override    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
            return null;
        }
        @Override    public void teardownTest(JavaSamplerContext javaSamplerContext) {
        }
        @Override    public Arguments getDefaultParameters() {
            return null;
        }
    }

    我们可以看到,具体会实现4个方法。

    4.3、实现具体方法

    启动上一节实现的应用。localhost:8086

    image.png

    具体实现代码如下:

     
    package com.jmeter.functions;
    
    import com.alibaba.fastjson.JSONObject;
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicHeader;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.apache.jmeter.config.Arguments;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;
    
    
    import java.net.URISyntaxException;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Random;
    
    public class CustemRequest implements JavaSamplerClient {
    
        //定义显示请求地址的变量名
        private static final String REQUEST_RUL = "URL";
    
        //定义默认请求的URL地址
        private static final String DEFAULT_URL = "http://localhost:8086/user/get";
    
        //用户输入的URL
        private String inputUrl;
    
        //用来保存http请求的响应结果,并把结果放到jmeter的查看结果树里面
        private String ResponseResult;
    
        //返回成功的状态码
        private static final int SUCCESS_CODE = 200;
    
    
        //以下方法,打印输出的目的就是检验此4个方法的执行顺序,大家执行的时候可以后台结果详细查看
        @Override
        public void setupTest(JavaSamplerContext javaSamplerContext) {
            System.out.println("******setupTest******");
            inputUrl = javaSamplerContext.getParameter(REQUEST_RUL,DEFAULT_URL);
            System.out.println("用户默认输出的URL地址------>:" + inputUrl);
    
        }
    
        /**
         * 真正执行的方法
         * @param javaSamplerContext
         * @return
         */
        @Override
        public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
            SampleResult sampleResult = new SampleResult();
    
            Object[] param = new Object[]{"id"};
            Object[] value = new Object[]{26};
            List<NameValuePair> nameValuePairs = getParam(param, value);
            /**
             * 标记一个事务的开始
             */
            sampleResult.sampleStart();
            try {
                ResponseResult = (String) sentGetRequest(inputUrl, nameValuePairs);
            } catch (Exception e) {
                e.printStackTrace();
            }
            sampleResult.setSampleLabel("自定义本地的请求访问");
            sampleResult.setSuccessful(true);   //告诉查看结果树是否成功
            sampleResult.setResponseData(ResponseResult,"utf-8");
            sampleResult.setDataType(SampleResult.TEXT);
            return sampleResult;
        }
    
        @Override
        public void teardownTest(JavaSamplerContext javaSamplerContext) {
    
        }
    
        @Override
        public Arguments getDefaultParameters() {
            //在jmeter显示属性
            Arguments arguments = new Arguments();
            arguments.addArgument(REQUEST_RUL,DEFAULT_URL);
            return arguments;
        }
    
        //自定义实现get请求
    
        /**
         * 发送get请求
         * @param url 请求URL地址
         * @param nameValuePairs 请求参数
         * @return JSON或者字符串
         * @throws Exception
         */
        public static Object sentGetRequest(String url, List<NameValuePair> nameValuePairs) throws Exception{
    
            CloseableHttpClient client = null;
            CloseableHttpResponse response = null;
    
    
            try {
                /**
                 * 新建HttpClient对象
                 */
    
                client = HttpClients.createDefault();
    
                /**
                 * 新建URIBuilder
                 */
                URIBuilder uriBuilder = new URIBuilder(url);
    
                /**
                 * 设置参数
                 */
                uriBuilder.addParameters(nameValuePairs);
                /**
                 * 创建HttpGet
                 */
                HttpGet httpGet = new HttpGet(uriBuilder.build());
                /**
                 * 设置请求头部编码
                 */
                httpGet.setHeader(new BasicHeader("content-Type","application/x-www-form-urlencoded; charset=utf-8"));
                /**
                 * 请求服务
                 */
                response = client.execute(httpGet);
    
                int statusCode = response.getStatusLine().getStatusCode();
                if (SUCCESS_CODE == statusCode){
                    /**
                     * 获取返回对象
                     */
                    HttpEntity entity = response.getEntity();
                    /**
                     * 通过EntityUtils获取返回内容
                     */
                    String result = EntityUtils.toString(entity,"utf-8");
    
                    return result;
                }else {
                    System.out.println("请求失败!!!!!!");
                }
    
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }finally {
                response.close();
                client.close();
            }
    
            return null;
        }
    
        private static List<NameValuePair> getParam(Object[] params,Object[] values){
            /**
             * 参数简单校验合法性
             */
            boolean flag = params.length>0 && values.length>0 && params.length == values.length;
            if (flag){
                List<NameValuePair> nameValuePairs = new LinkedList<>();
                for (int i = 0 ; i<params.length; i++){
                    nameValuePairs.add(new BasicNameValuePair(params[i].toString(),values[i].toString()));
                }
                return nameValuePairs;
            }else {
                System.out.println("请求参数为空且参数长度不一致");
            }
            return null;
        }
    
        public static void main(String[] args) {
            Object[] param = new Object[]{"id"};
            Object[] value = new Object[]{26};
            final String DEFAULT_URL = "http://localhost:8086/user/get";
            List<NameValuePair> nameValuePairs = getParam(param, value);
    
            try {
                String o = (String) sentGetRequest(DEFAULT_URL, nameValuePairs);
                System.out.println(o);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    4.4、maven到处jar包

      • 放到jmeter G:apache-jmeter-5.1.1libext目录
      • 重新打开jmeter

    image.png

    image.png

    五、总结

    至此我们自定义的java的request的请求已经开发完毕。

    有两个问题?后面会一一实现。

    1. 在代码中如何实现get请求中的id参数化?
    2. 在代码中如何编写post请求?
  • 相关阅读:
    IOS添加pch预编译文件
    UITableview控件基本使用
    两种单例模式的写法
    提交app Store审核时,Missing 64-bit support问题的解决办法
    IOS开发NSString与int和float的相互转换以及字符串拼接、NSString、NSData、char* 类型之间的转换
    获取UITableView每行中不同的UITextField输入的内容(例如修改登陆密码)
    UITextField常用属性归纳:文本框样式、文字样式、键盘样式、左右视图样式、清除按钮设置等,iosuitextfield
    UITabBarController(标签栏控制器)
    iOS基础控件UINavigationController中的传值
    IOS开发之多线程
  • 原文地址:https://www.cnblogs.com/hardy-test/p/11204353.html
Copyright © 2011-2022 走看看