Как дождаться завершения запроса в Jmeter

#jmeter

#jmeter

Вопрос:

В настоящее время я новичок в Jmeter и пытаюсь создать скрипт Jmeter, чтобы проверить, сколько времени требуется для обработки и завершения запроса.

a) Аутентификация с использованием токена — завершена b) Post Request — Complete — возвращает 200 c) Get Request — частично завершен

C: Я пытаюсь получить возможность отслеживать этот запрос, чтобы узнать, когда он либо завершен, либо завершен с ошибкой и т. Д.

  1. Я создал образец Http-запроса с помощью запроса Get введите описание изображения здесь
  2. Я могу получить запрос 200, но он не ожидает завершения

введите описание изображения здесь

Поэтому, запуская это в консольном приложении, оно ожидает определенное время проверки состояния….

Есть ли способ, возможно, написать код, похожий на код C # в bean shell или groovy для ожидания. Я также читал о while controller…

 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 
 

тайм-аут)
{
если (время ожидания <= 0) возвращает 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, но хотел посмотреть, есть ли лучший и более простой способ добиться этого.

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

Список отправки (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:

Подход, который обычно используется в JMeter, заключается в размещении вашего запроса под контроллером While, который будет проверять Status значение, которое, в свою очередь, может быть извлечено из ответа с использованием подходящего постпроцессора, поэтому запрос будет повторен, если «Статус» не изменится на некоторое ожидаемое значение (или время ожидания)

Если вы поместите всю конструкцию под контроллер транзакций, вы получите все время для изменения статуса.

Примерный план тестирования:

введите описание изображения здесь

Комментарии:

1. Спасибо тебе, Дмитрий!!! я попробую это сделать и свяжусь с вами. Есть ли способ проверить наличие нескольких статусов в одном и том же контроллере while?

2. Вы можете ввести любое выражение, которое захотите, во ввод «Условие», например, если вы используете функцию __groovy() , вы можете использовать любое количество выражений, просто убедитесь, что оно принимает значение true или false . См. Статью Apache Groovy — почему и как вы должны это использовать , чтобы ознакомиться с концепцией сценариев Groovy в JMeter