【问题标题】:How can I create my own exec function which has extended functionality?如何创建自己的具有扩展功能的 exec 函数?
【发布时间】:2019-12-09 14:54:19
【问题描述】:

所以我有许多看起来或多或少像的加特林休息调用函数:

  val restCall = {
    exec(http("RestCall")
      .post("/restCall")
      .body(ElFileBody("json/body.json")).asJson
      .check(saveResponseToSession(status,bodyString,header))
    )
    .exec(session => {validateResponse(session)})
    .pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)
  }

.check(saveResponseToSession(status,bodyString,header))

.exec(session => {validateResponse(session)})

.pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)

这三个函数在我所有的 API 调用上都执行,对我来说意味着数百行代码重复...

我正在寻找一种方法来创建/覆盖 .exec 链函数,它将在每次调用结束时包含这 3 个函数。

因此,例如上面的示例将如下所示:

  val restCall = {
    customExec(http("RestCall")
      .post("/restCall")
      .body(ElFileBody("json/body.json")).asJson)

但也会包括:

      .check(saveResponseToSession(status,bodyString,header))
    )
    .exec(session => {validateResponse(session)})
    .pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)
  }

正如我在第一个示例中所示。

【问题讨论】:

    标签: scala gatling


    【解决方案1】:

    您可以只拥有一个运行 ChainBuilder 的函数,然后运行验证和暂停步骤。

    val restCall = {
      exec(http("RestCall")
        .post("/restCall")
        .body(ElFileBody("json/body.json")).asJson
        .check(saveResponseToSession(status,bodyString,header))
      )
    }
    
    def validateAndWait(chain: ChainBuilder) = 
      exec(chain)
      .exec(session => {validateResponse(session)})
      .pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)
    
    def scn = scenario("action with validation").exec(validateAndWait(restCall))
    

    【讨论】:

    • 出于兴趣,你在 validateResponse 中做什么?如果您将验证从 api 调用中移开,它将降低您的脚本的可读性,因此除非您检查真正通用的东西,否则它可能不是一个好方法
    • 感谢您的关注!我显然是 Gatling 和 Scala 的新手,所以我正在做的验证可能是......尴尬。我想打印 Body、header sessionid 和 HTTP 状态以防出现错误,以便进一步调试问题。所以验证响应正是这样做的:
    • def validateResponse(session: Session): Validation[Session] = { val statusCode = session("HTTP_STATUS_CODE").as[String] val body = session("RESPONSE_BODY").as[String] val sessionId = session("RESPONSE_SESSION_ID").as[String] if (body.isEmpty() || body.contains("error\":") || statusCode != "200") { println(s"ERROR: session-id:[$sessionId], status-code:[$statusCode], body:[$body]") } return session }
    • 默认情况下,gatling 会在控制台中记录失败的请求和会话的内容——因此您实际上不需要手动获取响应详细信息来记录
    • 我们大多数失败的请求都使用 HTTP 200 发回,所以 gatling 没有问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2014-12-22
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多