在执行ChainBuilder时访问会话值

时间:2018-09-11 20:50:12

标签: scala gatling

是否可以访问会话值并仍然执行ChainBuilder对象?目前,我的代码设置方式实际上是http请求,因为它只是返回了会话,因此它从未真正执行过。我需要会话属性才能使用所有这些会话值构建标头参数。

val testTCSService = scenario("Some Scenario")
    .doIf(session => session.contains("value")) {
      exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
        .exitHereIfFailed
        .exec{session => OtherClass.verifyHTTPCall(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String])
        session}
    }

def verifyHTTPCall(token: String, realmId: String, userId: String): ChainBuilder = {
        exec(http("HTTP Call")
          .post("Some URL")
          .header("header_value", generateHeader(value, secondValue, thirdValue))
          .check(status.is(200))
    }

1 个答案:

答案 0 :(得分:2)

那样就行不通了,因为加特林(Gatling)不能像您(以及基本上每个开始使用它的人)所认为的那样工作。方案链构建器在每个模拟中仅执行一次,并创建操作链,然后每个用户将其用作所有请求的模板。因此,您要做的不是在会话中创建ChainBuilder,而是在ChainBuilder中从会话中提取数据。在您的情况下,使用Session.Expression[T]会更容易(某些操作采用这种类型的参数,它是类型Session => T的函数,因此您的代码可能像这样:

val testTCSService = scenario("Some Scenario")
  .doIf(session => session.contains("value")) {
    exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
      .exitHereIfFailed
      .exec(verifyHTTPCall)
  }

def generateHeader(a: String, b: String, c: String): String = ???

def verifyHTTPCall = http("HTTP Call")
  .post("Some URL")
  .header("header_value", session => generateHeader(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String]))
  .check(status.is(200))

或更简单,传递整个会话而不是3个属性值,并去除多余的doIf(如果未设置任何值,则跳过整个方案,因此整个失败会话机制将不起作用):

def generateHeader(session: Session): String = {
  //Extract values from session and build header
}

val testTCSService = scenario("Some Scenario")
  .exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
    .exitHereIfFailed
    .exec(http("HTTP Call")
      .post("Some URL")
      .header("header_value", session => generateHeader(session))
      .check(status.is(200)))