0

我目前是 Jmeter 的新手,并试图创建一个 Jmeter 脚本来测试一个请求需要多长时间来处理和完成。

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

C:我正在尝试能够监控此请求,以了解它何时完成失败等。

  1. 我创建了带有获取请求的 Http 请求示例 在此处输入图像描述

  2. 我能够获得请求 200,但它不等待完成

在此处输入图像描述

所以在控制台应用程序中运行它,它会等待一段时间检查状态......

有没有办法在 bean shell 或 groovy 中编写类似于 C# 代码的代码来等待。我也在阅读有关while控制器的信息...

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 

timeout) { if (timeout <= 0) return 0;

        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 Sampler 开始,但想看看是否有更好、更简单的方法来实现这一点。

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);
        }
    }
}

List sendGet(String url, Map<String,String> body) {

    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);
        }
    }
}
   
4

1 回答 1

0

JMeter 中通常使用的方法是将您的请求置于While 控制器下,该控制器将检查Status可以使用合适的后处理器从响应中获取的值,因此除非“状态”更改,否则将重试请求达到您期望的某个值(或超时)

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

示例测试计划大纲:

在此处输入图像描述

于 2021-01-11T07:38:50.047 回答