Отправить случайный запрос через Gatling

У меня есть файл с телами запросов Json в файле. Я хотел бы протестировать веб-сайт, отправляющий постоянное количество запросов в секунду, используя constantUsersPerSec (..).

Однако каждый раз, когда отправляется запрос, я хотел бы, чтобы он брался из списка запросов (случайным образом или в цикле, мне все равно).

Я не могу понять, как это сделать с Гатлингом. Используя следующий код, запрос выбирается случайным образом один раз, и один и тот же запрос отправляется снова и снова. Что не то, что я хочу

Мой код:

class GcStressManyRequests extends Simulation{ 
  ...
  ...
    val httpProtocol: HttpProtocolBuilder = http
    .baseURL(baseUrl)
    .contentTypeHeader(contentType)  

    var requests = Source.fromResource("bodies/requests.txt").getLines().toIndexedSeq
    val random = new Random(System.currentTimeMillis())

    val scn: ScenarioBuilder = scenario("AE prod requests")
    .exec (
         http("bid_request")
         .post(endpoint)
         .body(StringBody(requests(random.nextInt(requests.length))))
         .asJSON
         .check(status.is(200))) 

         setUp(
         scn.inject(
         constantUsersPerSec(400) during (1 minutes),
         ).protocols(httpProtocol))

 }

person Michael P    schedule 01.02.2018    source источник


Ответы (3)


Я вижу, у вас есть ваши запросы в текстовом файле body.txt. Для вашей задачи я бы использовал Feeder (проверьте шаг 03). С помощью устройства подачи вы можете извлечь случайный элемент из списка элементов и использовать его в своих звонках. Шаги, которые вы должны предпринять, чтобы это работало:

  1. Преобразуйте текстовый файл в файл csv, файлу csv нужен только заголовок, а затем значения. По одной строке для каждого значения. Допустим, вы называете заголовок «запрос».
  2. Создайте кормушку:

    val random_request = csv("bodies.csv").random
    
  3. Изменить сценарий:

     val scn: ScenarioBuilder = scenario("AE prod requests")
       .feed(random_request) //Puts a random request in your session.
       .exec (
         http("bid_request")
         .post(endpoint)
         .body(StringBody(${request})) //Retrieve the request from current session.
         .asJSON
         .check(status.is(200))) 
    
     setUp(
       scn.inject(
       constantUsersPerSec(400) during (1 minutes),
     ).protocols(httpProtocol))
    
person Stanko    schedule 05.02.2018

Для полноты, я хотел бы поделиться ответом Домингоса Креадо на группы Google Gatling, который сработал для меня.

val scn: ScenarioBuilder = scenario("AE prod requests")
.exec(session => {
          val session2 = session.set("therequest", requests(random.nextInt(requests.length)))
          session2
        })
.exec (
     http("bid_request")
     .post(endpoint)
     .body(StringBody("${therequest}"))
     .asJSON
     .check(status.is(200))) 
person Michael P    schedule 02.02.2018

Шаг 1. Создайте ввод, в моем случае это стек. Ниже приведен только метод, который вы можете использовать в своей собственной реализации.

var jobsQue: Stack[InputData] = GenerateInput.creatJobsCollection()

Шаг 2: используйте это

val execScn = scenario("Requests").group("Groups") {
asLongAs(session => jobsQue.length > 0) {  exec { session =>
    var length = jobsQue.length  //Whatever
    var reportElement = jobsQue.pop(); //POP it } } }

Надеюсь, это поможет вам продолжить работу.

person user666    schedule 02.02.2018
comment
Спасибо user666. Я не понимаю, зачем мне группа и asLongAs. Также самая важная часть, как отправить запрос, не находится в ответе, и я не могу понять, как это сделать. - person Michael P; 02.02.2018
comment
Я использую asLongAs для короткого замыкания, поэтому он будет продолжать работать до тех пор, пока длина стека не станет больше нуля, которая появляется ниже. - person user666; 03.02.2018