在 Gatling 中为异步调用设置超时

Setting a timeout to an asynchronous call in Gatling

我正在使用 Gatling 对微服务架构进行一些负载测试。我正在测试两个 REST 服务;服务 A 上的 POST 开始执行引擎,而服务 B 上的 GET 最终 检索此类执行的结果.

使用 asLongAs 构造,我重试进行 GET REST 调用,直到结果未准备好。但是,我不想永远循环。我需要设置超时或最大尝试时间。

我使用的代码摘录如下。

scenario("my-scenario")
  .feed(feeder)
  .exec(
    http("post-to-A")
      .post("/execution")
      .body(StringBody(
        """{
          | "information": ${INFORMATION}
          |}""".stripMargin
      ))
     .asJSON
     .check(status.is(200))
  )
  .exec(_.set("result", ""))
  .asLongAs(session => session("result").validate[String].get != "") {
    exec(
      http("get-to-B")
        .get("/result")
        .check(status.is(200))
        .check(jsonPath("$.result").saveAs("result"))
    )
  }

如何在上面的代码中设置超时?

感谢大家。

您可以使用 during 代替 asLongAs 来完成指定时间的循环(查看 Gatling Session API documentation 了解用法)。 另外,您可能需要检查您的状况。到目前为止,您的循环仅在 result 的值不是空字符串时才执行,这意味着它根本不会执行。

在谷歌搜索了一下之后,我发现关于 Gatling 中复杂场景开发的文档和示例非常少。得出与我类似结论的优秀 post 如下:Stress testing asynchronous REST service with Gatling.

由于缺少满足我要求的本机构造,我们可以构建的最佳解决方案是一起使用 tryMax and asLongAs 方法。

我问题中 post 的代码变为以下内容。

scenario("my-scenario")
  .feed(feeder)
  .exec(
    http("post-to-A")
      .post("/execution")
      .body(StringBody(
        """{
          | "information": ${INFORMATION}
          |}""".stripMargin
      ))
     .asJSON
     .check(status.is(200))
  )
  .exec(_.set("result", ""))
  .tryMax(10) {
    asLongAs(session => session("result").validate[String].get != "") {
      exec(
        http("get-to-B")
          .get("/result")
          .check(status.is(200))
          .check(jsonPath("$.result").saveAs("result"))
      )
    }
  }

Gatling 将尝试调用第二个 REST 服务 10 次,直到调用成功。显然,你的 REST 服务应该设计得当,响应一个不同于 200 的 HTTP 状态,直到无法达到结果。

唯一的缺点是

request failed are counted towards failed requests what in our case would drastically falsify results.

希望对您有所帮助。