Как получить виртуальный идентификатор пользователя / детали в gatling? - PullRequest
0 голосов
/ 18 марта 2019

Я новичок в Гатлинге и Скале, и мне нужен ваш совет. Я хотел бы получить нагрузочный тест для n-пользователей. Каждому пользователю необходимо отправить запрос на создание разных учетных записей. Это получается отправкой файла json с соответствующим массивом объектов (в нашем случае это «записи»). Каждый пользователь должен отправить свой логин, так как наша бэкэнд-система проверяет уникальность имени пользователя. Так или иначе, мы должны быть уверены, что Гатлинг посылает разные данные для каждого виртуального пользователя, а также для каждой записи. Мы заметили, что используется элемент сеанса, который представляет состояние виртуального пользователя. Проблема в том, что приведенный ниже код не будет работать, поскольку структура Exec, используемая с функцией выражения, не отправляет никаких запросов. Есть раздел, который может работать, но я не знаю, как определить третий параметр, чтобы отличить виртуальный идентификатор пользователя. Ниже приведена простая структура файла json, используемая для этого теста

{
"entries": [
              {
                "userName": "some user name",
                "password": "some password"
              }
}

и скала код с моими комментариями

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class UserCreationTest extends Simulation {

  val profilesNumber = 2
  val virtualUsers = 2

  val httpConf = http
        .baseURL("some url")
        .acceptHeader("application/json")
        .basicAuth("username", "password")

  // This method will multiply 'entries' section in JSON 'entriesNumber' times
  def createJsonUserEntries(entriesNumber: Int, users: List[String], userId : Long): String = {
    val header = """{"entries": ["""
    val footer = """]}"""
    val builder = StringBuilder.newBuilder

    for (i <- 0 until entriesNumber) {
      val userIndex = (userId.toInt - 1) * entriesNumber + i
      val userName = users(userIndex).get

      val apiString =
        s"""{
              "userName": "${userName}"
              "password": "password"
           }"""

      builder.append(apiString)

      if (i != entriesNumber) {
        builder.append(",")
      }
    }
    header + builder.toString() + footer
  }

  // We do have method for generating user names based on profilesNumber and virtualUsers variables
  // but for sake of this example lets hardcode 4 (profilesNumber * virtualUsers) user names
  val usersList = List("user-1", "user-2", "user-3", "user-4")

  //This will throw exception as no request was send. According to documentation function block is used to debugging/editing session
  val scn = scenario("Create WiFi User Profile")
    .exec(session => {
      http("CreateUserProfile")
        .post("/userProfiles/create/")
        .body(StringBody(
          createJsonUserEntries(profilesNumber, userslList, session.userId).toString
          )
        ).asJSON
      session})

  // This exec block will send a request but I do not know how to determine third param that should be virtual user Id
  // To run this section please comment previous whole scenario block
  /*
  val scn = scenario("")
      .exec(http("CreateUserProfile")
              .post("/userProfiles/create/")
              .body(StringBody(
                createJsonUserEntries(profilesNumber, emailList, ???).toString
                )
              ).asJSON
      )
  */

  setUp(scn.inject(atOnceUsers(virtualUsers)).protocols(httpConf))

}

Не могли бы вы помочь мне в этом, пожалуйста? Есть ли другой способ сделать это в Гатлинге? Заранее большое спасибо

1 Ответ

0 голосов
/ 19 марта 2019

Итак, вы пытаетесь, чтобы у каждого пользователя был уникальный идентификатор пользователя?

Вы можете создать фидер, который делает это

var userIdFeeder = (1 to 999999).toStream.map(i => Map("userId" -> i)).toIterator

val scn = scenario("")
      .feed(userIdFeeder)
      .exec(http("CreateUserProfile")
              .post("/userProfiles/create/")
              .body(StringBody(
                createJsonUserEntries(profilesNumber, emailList, "${userId}").toString
                )
              ).asJSON
      )
...