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

Scala 在同一用户的后续请求的加特林馈线内部使用一个请求的加特林馈线内部生成的值,scala,gatling,scala-gatling,Scala,Gatling,Scala Gatling,我正在使用Gatling测试一个系统,它需要两个连续的Post请求,比如R1和R2。这些Post请求具有不同的Json请求主体,但只有一个公共键“ID”。因此,一个用户应该按顺序执行R1-R2,并且应该为每个用户生成一个新的随机ID。R1中生成的这个ID应该传递给R2,并因此在其请求主体中添加为ID键的值 应R1请求,在馈线内部生成随机ID: val R1Id = Iterator.continually(Map("randId1" -> R1_requestBody.replace("0

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

应R1请求,在馈线内部生成随机ID:

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)

不要在feeder中生成整个身体,您只能生成那个随机id,让我们调用它
userToken

val tokenFeeder = Iterator.continually(Map(
  "userToken" -> randomTokenGenerator.generateTokenID()
))
并在构建请求主体时替换它:

.body(
    StringBody(session => R1_requestBody.replace(
      "0000000000",
      session("userToken").as[String]
    ))
).asJSON
或者更干净更好-使用一个事实,即Gatling将包含占位符的每个字符串(如
${sessionAttributeName}
)替换为会话属性字符串值,而不是在正文模板中使用
“0000000000”
,使用
${userToken}
占位符fe:

val bodyTemplate ="""{
  |"userName": "John Doe",
  |"userToken": "${userToken}"
  |}""".stripMargin
然后只需将该模板用于body和Gatling表达式语言,就可以发挥神奇的作用:

.body(StringBody(bodyTemplate)).asJSON

非常感谢你详细的回答。但是当我在我的主体模板中使用${userToken}时,它说“userToken”无法解析。我遗漏了什么?检查您的feeder是否生成了同名的属性。