Gatling:轮询网络服务,并在不正确的情况下失败 response-messages

Gatling: polling a webservice, and failing the scenario on incorrect response-messages

这个问题很难写一个好的标题。我正在 Gatling 中为 SOAP Web 服务开发性能测试。我对 Gatling 不是很有经验,所以我边学边学,但这个难题让我完全难住了。

我正在实施测试的场景之一是 order-process 由对 web 服务的几个唯一的连续调用组成,其中一个是 return 的当前状态的轮询调用订购过程。简化后,此调用获得一个 SOAP 响应,其状态可以是三种类型:

我想做的是让 Gatling 连续轮询网络服务直到 processing-status 发生变化 - 然后检查状态是否表明它已成功完成。连续轮询很容易实现,但在完成后执行检查被证明是一个比任何业务都要大得多的挑战。

到目前为止,这是我为解决轮询所做的工作:

exec { session => session.set("status", "PROCESSING") }
.asLongAs(session => session("status").as[String].equals("PROCESSING")) {
  exec(http("Poll order")
    .post("/MyWebService")
    .body(ELFileBody("bodies/ws/pollOrder.xml"))
    .check(
      status.is(200),
      regex("soapFault").notExists,
      regex("pollResponse").exists,
      xpath("//*[local-name(.)='result']").exists.saveAs("status")
    )
  ).exitHereIfFailed.pause(5 seconds)
}

此片段似乎正在正确执行轮询,它会继续轮询,直到 orderStatus 从处理中变为其他状态。我需要检查 status 以查看它是否已更改为我感兴趣的响应,因为我不知道它是什么,而且它可能是众多结果中的唯一一个应该会导致场景继续对于该用户。

一个潜在的解决方法是在该调用中添加更多检查,如下所示:

.check(regex("EVERYTHING_ELSE_XYZ")).notExists

该服务可以 return 很多不同的 "not a happy day" 消息,但是我只对另外两个真正感兴趣,所以我最好能够做一个仅检查两个有效的 happy-day 响应。检查一件确切的事情是否存在似乎比检查许多事情不存在要明智得多。

我认为我可以做的是在步骤退出 asLongAs-loop 和 [=49= 时对用户 session 中的 status 变量执行检查] 该用户的场景。因为它是 session-variable 我可能会在整个场景的下一步中执行此操作并在那里为该用户打破 运行 ,但这也意味着错误报告在错误的地方,并且下一次调用 fault-% 会被上一次调用的错误污染。

使用伪代码,能够在退出 asLongAs 循环后立即执行这样的操作就完美了:

if (session("status").as[String].equals("ORDER_OK")) ? continueTheScenario : failTheScenario

但我无法在 gatling-chain 中做任何类似的事情。做那样的事情几乎开始显得不可能,但是有人能看到我没有看到的解决方案吗?

而不是 "exists",使用 "in" 检查结果是否为 2 个有效值之一。