我有一个加特林场景,我订阅了一个 websocket 并想要检查传入消息的内部一致性。
例如。通过 websocket 发送的消息是<user>: <sequence number>
,我想检查每个用户字符串的序列号是连续的并且从 1 开始递增。
a: 1
b: 1
a: 2
b: 2
a: 1 // <= this would be an error because last a was 2, so should be 3
我的第一个方法是存储类似Map[String, Int]
在会话变量中。但在我看来,gatting webservice API 不允许存储非字符串会话变量:
这(只是连接我们通过 WS 获得的所有内容)编译:
def updateState(text: String, session: Session): String = {
session("wsState").as[String] + "\n" + text
}
val scn = scenario("String")
.exec(ws("Connect WS")
.open("/indexWS?topic=${topic}")
.check(
wsListen
.within(3600.seconds)
.until(10)
.message
.find
.transform(updateState _)
.saveAs("wsState"))
)
但是,一旦 updateState 函数返回字符串以外的内容,它就不再编译
def updateState(text: String, session: Session): Map[String, Int] = {
session("counts").as[Map[String, Int]] // + update from message text
}
val scn = scenario("String")
.exec(ws("Connect WS")
.open("/indexWS?topic=${topic}")
.check(
wsListen
.within(3600.seconds)
.until(10)
.message
.find
.transform(updateState _)
.saveAs("counts"))
)
这是错误消息:
[error] found : io.gatling.core.check.CheckBuilder[io.gatling.http.check.ws.WsCheck,String,String,Int]
[error] required: io.gatling.http.check.ws.WsCheckBuilder
[error] (which expands to) io.gatling.core.check.CheckBuilder[io.gatling.http.check.ws.WsCheck, String, _, String]
现在显然我可以在每次更新时将地图序列化为字符串。但我宁愿避免这种情况。加特林似乎允许非字符串会话变量,那么为什么在 websockets 中不允许呢?