如何在gatling中获取虚拟用户ID /详细信息?

问题描述 投票:0回答:1

我是加特林和斯卡拉的新手,我需要你的建议。我想获得n个用户的负载测试。每个用户都必须发送创建不同帐户的请求。这是通过发送带有适当对象数组的json文件(在我们的例子中为'entries')来获得的。每个用户必须发送不同的登录信息,因为我们的后端系统正在检查用户名是否唯一。不知何故,我们必须确保gatling为每个虚拟用户以及每个条目发送不同的数据。我们注意到有会话元素代表虚拟用户的状态。问题是下面显示的代码不起作用,因为与表达式函数一起使用的Exec结构不会发送任何请求。有部分可以工作,但我不知道如何确定第三个参数来区分虚拟用户ID。请在下面找到用于此测试的简单json文件结构

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

和scala代码与我的评论

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

}

你可以帮我吗?在加特林有没有其他方法可以做到这一点?非常感谢你提前

performance-testing gatling scala-gatling
1个回答
0
投票

所以你试图让每个用户都有一个唯一的userId?

你可以创建一个这样做的馈线

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
      )
© www.soinside.com 2019 - 2024. All rights reserved.