在同一用户的后续请求的馈线中使用一个请求的加特林馈线内部生成的值

Use the value generated inside a Gatling Feeder of one request inside the feeder of a consequent request for the same user

我正在使用 Gatling 测试一个系统,该系统需要 2 个连续的 Post 请求,比如 R1 和 R2。这些 Post 个请求具有不同的 Json 个请求主体,但有一个公共密钥 "ID"。因此,一个用户应该按顺序执行 R1-R2,并且应该为每个用户生成一个新的随机 ID。在 R1 中生成的这个 ID 应该传递给 R2,因此在其请求主体中添加为 ID 键的值。

随机 ID 是在 R1 请求时在馈线内部生成的:

val R1Id = Iterator.continually(Map("randId1" -> R1_requestBody.replace("0000000000", randomTokenGenerator.generateTokenID())))

val r1 = 
scenario("R1Scenarios").feed(R1Id)
.exec(http("POST R1")
.....
.body(StringBody(session => """${randId1}""")).asJSON                        

现在,在R2中,我想喂食需要在R1的喂食器中生成ID值。

val R2Id = Iterator.continually(Map("randId2" -> R2_requestBody.replace("0000000000", ***Token generated in the first request***)))

 val R2= {
scenario("R2 Scenarios")
.exec(R1.r1) 

//calls the first scenario as R2 should be executed after R1
.feed(R2Id )
.exec(http("POST R2")
....
.body(StringBody(session => """${randId2}""")).asJSON

最终执行模拟:

val jsonScenario = R2.r2.inject(constantUsersPerSec(2) during (1 second))

setUp(jsonScenario)
.protocols(httpConf)

您可以只生成那个随机 ID,而不是在馈线中生成整个 body,我们称之为 userToken:

val tokenFeeder = Iterator.continually(Map(
  "userToken" -> randomTokenGenerator.generateTokenID()
))

并在构建请求时替换它 body:

.body(
    StringBody(session => R1_requestBody.replace(
      "0000000000",
      session("userToken").as[String]
    ))
).asJSON

甚至更干净更好 - 使用 Gatling 将每个包含 ${sessionAttributeName} 等占位符的字符串替换为 session 属性字符串值而不是在 [=26] 中使用 "0000000000" =] 模板使用 ${userToken} 占位符 fe:

val bodyTemplate ="""{
  |"userName": "John Doe",
  |"userToken": "${userToken}"
  |}""".stripMargin

然后只需将该模板用于 body,Gatling 表达式语言将发挥神奇作用:

.body(StringBody(bodyTemplate)).asJSON