GULI
GULI

Reputation: 13

How to obtain virtual user id/details in gatling?

I am new to Gatling and Scala and I need your advice. I would like to obtain load test for n-users. Each user have to send request for creating different accounts. This is obtained by sending json file with appropriate array of objects ('entries' in our case). Each single user must send different login as our backend system is checking if username is unique. Somehow we have to be sure that gatling is sending different data for each virtual user and also for each entries as well. We noticed that there us session element which represents virtual user's state. Problem is that code showed below will not work as Exec structure used with expression function does not send any request. There is section that could work but I do not know how to determine third parameter to distinguish virtual user id. Please find below simple json file structure used for this test

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

and scala code with my comments

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

}

Can you help me on that please? Is there any other way to do that in gatling? Thank you very much in advance

Upvotes: 1

Views: 2253

Answers (1)

James Warr
James Warr

Reputation: 2604

so you are trying to have each user have a unique userId?

you could create a feeder that does this

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
      )

Upvotes: 3

Related Questions