• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Spillage
博客园    首页    新随笔    联系   管理    订阅  订阅
流量回复学习记录二

   继续上次的学习记录,因为整个流量回放的过程已经开发完成,所以可以来复盘一下。

   现在各类压测平台都使用 jmeter 执行压测,jmeter 是如何判断什么时候执行什么步骤?

   在一中提到,jmeter的脚本是 hashtree,为了保证压测(回放) 能按照顺序执行请求,因此可以采用 ListedHashTree 来根据添加到先后顺序决定执行顺序,同样的,每个 node 都是一个步骤。所以对于jmeter来说,常见的执行发送http请求的场景,通过 httpsampler 完成,在 listedhashtree 里,会使用 httpsamplerproxy 来完成这件事情。

   生成的顺序是,HttpSamplerProxy init -> TestPlan init -> BackendListener init -> BackendListener added to TestPlan -> TestPlan passed to Engine

   除了最后一步,一定是一个 testplan 提交给 jmeter 引擎外,其他步骤都是可以按不同顺序操作。

   如何初始化一个 sampler? sampler 里包含什么信息?

        HTTPSamplerProxy sampler = new HTTPSamplerProxy();

        sampler.setEnabled(true);
        sampler.setName("请求名称");
        sampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
        sampler.setProperty(TestElement.GUI_CLASS, "HttpTestSampleGui");
        sampler.setProperty(TestPlan.COMMENTS,"");
        sampler.setContentEncoding("UTF-8");
        sampler.setFollowRedirects(true);
        sampler.setAutoRedirects(false);
        sampler.setUseKeepAlive(true);
        sampler.setDoMultipartPost(false);
        sampler.setConnectTimeout("");
        sampler.setResponseTimeout("");
        sampler.setEmbeddedUrlRE("");

        sampler.setMethod(info.getJSONObject("request").getString("method"));
        String requestUrl = info.getJSONObject("request").getString("url");
        sampler.setPostBodyRaw(true);

        try{
            if(!StringUtils.isEmpty(info.getJSONObject("request").getString("body"))){
                JSONObject body = JSONObject.parseObject(info.getJSONObject("request").getString("body"));
                sampler.setArguments(addHttpArguments(body));

            }
        } catch (Exception e){
            log.info("Request body is not key-value pair!");
        }
        URL url = null;
        try {
            url = new URL(requestUrl);
            sampler.setDomain(URLDecoder.decode(url.getHost(),"UTF-8"));
            sampler.setPath(URLDecoder.decode(url.getPath() + "?" + url.getQuery(), "UTF-8"));
            sampler.setProtocol(URLDecoder.decode(url.getProtocol(),"UTF-8"));
            if (url.getPort() == -1 && url.getProtocol().equals("http")){
                sampler.setPort(80);
            }else if (url.getPort() == -1 && url.getProtocol().equals("https")){
                sampler.setPort(443);
            }else{
                sampler.setPort(url.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

 

     比较坑的一点是,httpsamplerproxy没有支持设置 rawdata的方法,尽管有

sampler.setPostBodyRaw(true);

  除了能设置 true/false , 其他在发送http 请求时的body部分,如果是Keyvalue pair ,需要自己转成 argument,如果是文件,需要转成二进制文件,看了好久的 jmeter官方文档,才确认了这一点,就是设置不了……

   

posted on 2021-08-02 15:55  Spillage  阅读(235)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3