当前位置: 首页 > 知识库问答 >
问题:

如何在Jmeter中等待请求完成

孔星宇
2023-03-14

我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。

a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成

C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。

var result = WaitForBuildToComplete(dest, requestData, token, timeout);

 static string GetStatus(string path, Token token)
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "GET";
        AddToken(token, httpWebRequest);

        WebResponse response = httpWebRequest.GetResponse();

        string responseFromServer = "";
        using (Stream dataStream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(dataStream);
            responseFromServer = reader.ReadToEnd();
        }

        // Close the response.  
        response.Close();
        return responseFromServer;
    }



static int WaitForBuildToComplete(string dest, RequestData requestData, Token token, int 
        var path = $"{ConfigurationManager.AppSettings[dest]}/policy?id={requestData.id}";

        var startTime = DateTime.Now;
        do
        {
            var status = GetStatus(path, token);
            var msg = JsonConvert.DeserializeObject<string>(status);
            var requestStatus = JsonConvert.DeserializeObject<RequestStatus>(msg);

            if (!string.IsNullOrEmpty(requestStatus.DllUrl))
            {
                Console.WriteLine($"\nResult dll at: {requestStatus.DllUrl}");
                return 0;
            }
            if (requestStatus.Status.ToUpper() == "FAILED")
            {
                Console.WriteLine($"\nFAILED");
                Console.WriteLine(requestStatus.Message);
                return -1;
            }

            if (requestStatus.Status.ToUpper() == "FAILED_DATA_ERROR")
            {
                Console.WriteLine($"\nFAILED_DATA_ERROR");
                Console.WriteLine(requestStatus.Message);
                return -1;
            }

            if (requestStatus.Status.ToUpper() == "NOT_NEEDED")
            {
                Console.WriteLine($"\nNOT_NEEDED");
                Console.WriteLine(requestStatus.Message);
                return -1;
            }

            Console.Write(".");
            System.Threading.Thread.Sleep(1000);
        } while ((DateTime.Now - startTime).TotalSeconds < timeout);
        Console.WriteLine("Time out waiting for dll.");
        return -1;
    }

我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。

List<String> sendRequest(String url, String method, Map<String,Object> body) {


    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(2000)
            .setSocketTimeout(3000)
            .build();

    StringEntity entity = new StringEntity(new Gson().toJson(body), "UTF-8");


    HttpUriRequest request = RequestBuilder.create(method)
            .setConfig(requestConfig)
            .setUri(url)
            .setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8")
            .setEntity(entity)
            .build();
            
   String req = "REQUEST:" + "\n" + request.getRequestLine() + "\n" + "Headers: " +
            request.getAllHeaders() + "\n" + EntityUtils.toString(entity) + "\n";
            

    HttpClientBuilder.create().build().withCloseable {httpClient ->

        httpClient.execute(request).withCloseable {response ->

            String res = "RESPONSE:" + "\n" + response.getStatusLine() + "\n" + "Headers: " +
                    response.getAllHeaders() + "\n" +
                    (response.getEntity() != null ? EntityUtils.toString(response.getEntity()) : "") + "\n";

            System.out.println(req + "\n"  + res );
            
            return Arrays.asList(req, res);
        }
    }
}

列表sendGet(字符串url,map 正文){

    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(2000)
            .setSocketTimeout(3000)
            .build();

    RequestBuilder requestBuilder = RequestBuilder.get()
            .setConfig(requestConfig)
            .setUri(url)
            .setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8");

    body.forEach({key, value -> requestBuilder.addParameter(key, value)});
    
    HttpUriRequest request = requestBuilder.build();

    String req = "REQUEST:" + "\n" + request.getRequestLine() + "\n" + "Headers: " +
            request.getAllHeaders() + "\n";

    HttpClientBuilder.create().build().withCloseable {httpClient ->

        httpClient.execute(request).withCloseable {response ->

            String res = "RESPONSE:" + "\n" + response.getStatusLine() + "\n" + "Headers: " +
                    response.getAllHeaders() + "\n" +
                    (response.getEntity() != null ? EntityUtils.toString(response.getEntity()) : "") + "\n";

            System.out.println(req + "\n"  + res );
            return Arrays.asList(req, res);
        }
    }
}
   

共有1个答案

潘翊歌
2023-03-14

JMeter中通常使用的方法是将请求置于While控制器下,该控制器将检查status值,该值可以使用适当的后处理程序从响应中获取,因此除非“status”更改为您预期的值(或超时),否则请求将被重试

如果您将整个构造置于事务控制器之下,您将获得状态更改的全部时间。

示例测试计划大纲:

 类似资料:
  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 问题内容: 我正在尝试编写一个JS代码,如果给定的数字已经存在于数据库中,它将取消“ btn_submit”按钮.onclick事件。我使用AJAX向数据库查询给定的编号,并确定是否应将数据发送到将上传问题的.php站点。为了确定这一点,我需要numOfRows变量的值,但是因为我在AJAX中将其设置为0,所以validation()函数将在我的AJAX查询完成之前完成,这将导致始终表示给定数字不

  • 我有一个简单的Java程序,它使用SpringWebClient发送多个请求。每个都返回一个mono,我使用的是response。subscribe()以检查结果。 但是,我的主执行线程在处理所有请求之前完成,除非我添加一个长线程。睡眠()。 对于CompletableFutures,您可以使用:CompletableFuture。allOf(期货)。join(); 有没有办法等待所有单声道的完成

  • 我正在编写一个应用程序,用谷歌的凌空API执行一系列请求。问题是我不知道请求什么时候完成。在我进一步行动之前,我需要知道一个请求是否已经完成。我不能用while循环或sleep/wait方法等待一定时间,因为它似乎会停止执行请求的线程。显然,请求有onResponse回调,我可以用它来标记单个请求何时完成。但我有一个活动可以发出多个请求,我希望该活动处于待机状态,直到所有请求都得到处理。就像我说的

  • 我使用相同的输入Json在REST API上提交多个POST提交。这意味着多用户(例如:10000)使用相同的Json提交相同的POST来测量POST请求的性能,但是我需要使用GET方法捕获每次提交的完成结果,并且仍然测量GET的性能。这是一个如下的异步过程。 提交后 因此,我需要创建一个jmeter测试计划,该计划可以处理多用户提交的异步POST,并等待它们被处理,最后捕获每次提交的完成情况。我

  • 问题内容: 我有一个页面,根据变量的长度,它可以发出不同数量的请求,然后我只想在所有请求完成后才将数据发送到范围。对于这个项目,我不想使用jQuery,因此请不要在答案中包含jQuery。目前,随着每个请求的完成,数据被发送到作用域,这不是我想要的。 这是我到目前为止的部分代码。 这是我对此表示怀疑的部分,因为某些东西需要作为的参数,但是在Angular的文档中并未提及,我不确定它的含义。 谢谢你