很难为这个问题写好标题。我正在Gatling开发一个SOAP Web服务的性能测试。我对加特林的经验不是很充实,所以我在学习的过程中一直在学习,但这个难题让我完全陷入困境。
我正在实施测试的一个场景是一个订单流程,包括对Web服务的几个唯一连续调用,其中一个是轮询调用,它返回订购流程的当前状态。简化后,此调用将获得一个SOAP响应,其状态可以是三种类型:
PROCESSING
- 表示订单仍在处理中。ORDER_OK
- 订单已完成且没有错误。 EVERYTHING_ELSE
- 一组不同的错误状态和其他结果。我想要做的是让Gatling不断轮询网络服务,直到处理状态发生变化 - 然后检查状态是否说成功完成。持续进行轮询很容易实现,但在完成检查后进行检查是一项比任何业务都要大得多的挑战。
到目前为止,这是我为解决民意而做的事情:
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
该服务可以返回很多不同的"不是快乐的一天"然而,我只对其他两个消息感兴趣,所以我最好能够只检查两个有效的快乐日回复。检查一个确切的东西是否存在似乎比检查几十件事情更为明智。
我认为我能够做的是当步骤退出asLongAs循环时检查用户status
中的session
变量,并继续/退出该用户的方案。由于它是一个会话变量,我可以在整个场景的下一步中执行此操作并在那里中断该用户的运行,但这也意味着错误报告在错误的位置,并且下一次调用错误 - %会因前一次通话中的错误而受到污染。
使用伪代码,能够在退出asLongAs循环后立即执行此类操作会非常完美:
if (session("status").as[String].equals("ORDER_OK")) ? continueTheScenario : failTheScenario
但是我没能做任何类似于gatling-chain内部的事情。它几乎开始似乎不可能做到这样的事情,但任何人都可以看到我没有看到的解决方案吗?