使用针对同一用户的后续请求的供稿器内部的一个请求的加特林馈送器内部生成的值

时间:2019-09-10 12:59:50

标签: scala gatling scala-gatling

我正在使用加特林(Gatling)测试一个系统,该系统需要两个连续的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)

1 个答案:

答案 0 :(得分:1)

您只能生成该随机ID,而不是在Feeder中生成整个主体,我们将其称为userToken

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

并在构建请求正文时将其替换:

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

或更干净,更好-使用以下事实:加特林将包含${sessionAttributeName}之类的占位符的每个字符串替换为该会话属性字符串值,而不是在您的正文模板中使用"0000000000"占位符fe:

${userToken}

然后使用该模板作为正文,Gatling表达式语言将发挥作用:

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