【问题标题】:Access session values while executing ChainBuilder在执行 ChainBuilder 时访问会话值
【发布时间】:2018-09-12 19:34:16
【问题描述】:

是否可以访问会话值并仍然执行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))
    }

【问题讨论】:

    标签: scala gatling


    【解决方案1】:

    它不会那样工作,因为 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)))
    

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多