在 Gatling 中连接一个向量
Concatenate a vector in Gatling
我正在尝试将一个向量连接成一个字符串,以便将其插入到 get 调用中。
之前在我的代码中使用了以下内容:
.exec(http("request_11")
.get("/api/data/users/${userId}")
.headers(headers_3)
.check(jsonPath("$..users[0].links.orgRoles[*]").findAll.saveAs("orgRoles")))
这给了我一个 orgRoles
会话变量:
Vector(b2b5fb81-4025-48a5-9890-a6ec7d64f317, 744db047-1477-4bb6-9c55-70071ce41cb8, 423b0b07-7bfa-416a-9b95-cc1d75d7d781)
然后我想像这样使用这个串联的会话变量:
.exec(http("request_50")
.get("/api/data/orgRoles/${orgRoles}")
这实际上会执行以下 get 调用:
.exec(http("request_50")
.get("/api/data/orgRoles/b2b5fb81-4025-48a5-9890-a6ec7d64f317,744db047-1477-4bb6-9c55-70071ce41cb8,423b0b07-7bfa-416a-9b95-cc1d75d7d781")
.headers(headers_3))
我是 Gatling 和 Scala 的新手,并且进行了大量研究。我发现以下 answer 提供
session => session("itemIds").validate[Seq[String]].map(_.mkString(","))
是正确的做法。反过来,我尝试使用以下内容操作会话变量:
...
.exec { session =>
session("orgRoles").map(_.mkString(","))
}
.exec(http("request_50")
.get("/api/data/orgRoles/${orgRoles}")
.headers(headers_3))
...
但最终出现错误:
value mkString is not a member of io.gatling.core.session.SessionAttribute
对前进有什么建议吗?
您是否尝试过调用 toString 或 groupHierarchy?
session => session("itemIds").validate[Seq[String]].map(_.toString.mkString(","))
session => session("itemIds").validate[Seq[String]].map(_.groupHierarchy.mkString(","))
我最终解决了这个问题:
.exec(session =>
session.set("orgRolesConcat", session("orgRoles").as[Seq[String]].mkString(",")))
您收到的错误是因为:
session("orgRoles")
您正在会话实例 (for more see source code) 调用 Session.apply
方法。 apply
方法returnsSessionAttribute
实例,有以下方法:
// Use when you are certain that key exists in session, otherwise you'll get exception which you has to handle
def as[T: NotNothing]: T
// Use when you want to handle also not existing key and you can react to `None` case
def asOption[T: TypeCaster: ClassTag: NotNothing]: Option[T]
// Use when you want to code against success path and use combinators provided by `Validation`
def validate[T: TypeCaster: ClassTag: NotNothing]: Validation[T]
每个服务器都有不同的用途(见评论)。以上所有SessionAttribute
的方法都是getters from session。它们的唯一目的是以任何形式为您提供存储在会话中的密钥值。
只有在获取到值后才能对它做任何事情。最安全的选择是使用 validate
方法,该方法提供通用组合器(在所有 Scala 集合中使用)map
和 flatMap
来操作存在的值。您可以找到更多关于 Validation
概念 here 的信息。因此,您的代码应如下所示:
// Just getting from session and concatenating
session => session("orgRoles").validate[Seq[String]].map( _.mkString(",") )
// also storing back to session
session => session.set("orgRoles", session("orgRoles").validate[Seq[String]].map( _.mkString(",") ))
这也是你上面已经写的。但是您已经在使用 check
DSL 方法,因此您可以在第一次调用中直接使用 transform()
作为:
.exec(
http("request_11")
.get("/api/data/users/${userId}")
.headers(headers_3)
.check(
jsonPath("$..users[0].links.orgRoles[*]")
.findAll
.transform( _.mkString(",") )
.saveAs("orgRoles")
)
)
它简单易懂,并且没有临时保存到 Session
。甚至你放在 transform
中的函数也更容易,而它被定义为 A => B
因此简单的转换。查看有关转换 here.
的更多信息
我正在尝试将一个向量连接成一个字符串,以便将其插入到 get 调用中。
之前在我的代码中使用了以下内容:
.exec(http("request_11")
.get("/api/data/users/${userId}")
.headers(headers_3)
.check(jsonPath("$..users[0].links.orgRoles[*]").findAll.saveAs("orgRoles")))
这给了我一个 orgRoles
会话变量:
Vector(b2b5fb81-4025-48a5-9890-a6ec7d64f317, 744db047-1477-4bb6-9c55-70071ce41cb8, 423b0b07-7bfa-416a-9b95-cc1d75d7d781)
然后我想像这样使用这个串联的会话变量:
.exec(http("request_50")
.get("/api/data/orgRoles/${orgRoles}")
这实际上会执行以下 get 调用:
.exec(http("request_50")
.get("/api/data/orgRoles/b2b5fb81-4025-48a5-9890-a6ec7d64f317,744db047-1477-4bb6-9c55-70071ce41cb8,423b0b07-7bfa-416a-9b95-cc1d75d7d781")
.headers(headers_3))
我是 Gatling 和 Scala 的新手,并且进行了大量研究。我发现以下 answer 提供
session => session("itemIds").validate[Seq[String]].map(_.mkString(","))
是正确的做法。反过来,我尝试使用以下内容操作会话变量:
...
.exec { session =>
session("orgRoles").map(_.mkString(","))
}
.exec(http("request_50")
.get("/api/data/orgRoles/${orgRoles}")
.headers(headers_3))
...
但最终出现错误:
value mkString is not a member of io.gatling.core.session.SessionAttribute
对前进有什么建议吗?
您是否尝试过调用 toString 或 groupHierarchy?
session => session("itemIds").validate[Seq[String]].map(_.toString.mkString(","))
session => session("itemIds").validate[Seq[String]].map(_.groupHierarchy.mkString(","))
我最终解决了这个问题:
.exec(session =>
session.set("orgRolesConcat", session("orgRoles").as[Seq[String]].mkString(",")))
您收到的错误是因为:
session("orgRoles")
您正在会话实例 (for more see source code) 调用 Session.apply
方法。 apply
方法returnsSessionAttribute
实例,有以下方法:
// Use when you are certain that key exists in session, otherwise you'll get exception which you has to handle
def as[T: NotNothing]: T
// Use when you want to handle also not existing key and you can react to `None` case
def asOption[T: TypeCaster: ClassTag: NotNothing]: Option[T]
// Use when you want to code against success path and use combinators provided by `Validation`
def validate[T: TypeCaster: ClassTag: NotNothing]: Validation[T]
每个服务器都有不同的用途(见评论)。以上所有SessionAttribute
的方法都是getters from session。它们的唯一目的是以任何形式为您提供存储在会话中的密钥值。
只有在获取到值后才能对它做任何事情。最安全的选择是使用 validate
方法,该方法提供通用组合器(在所有 Scala 集合中使用)map
和 flatMap
来操作存在的值。您可以找到更多关于 Validation
概念 here 的信息。因此,您的代码应如下所示:
// Just getting from session and concatenating
session => session("orgRoles").validate[Seq[String]].map( _.mkString(",") )
// also storing back to session
session => session.set("orgRoles", session("orgRoles").validate[Seq[String]].map( _.mkString(",") ))
这也是你上面已经写的。但是您已经在使用 check
DSL 方法,因此您可以在第一次调用中直接使用 transform()
作为:
.exec(
http("request_11")
.get("/api/data/users/${userId}")
.headers(headers_3)
.check(
jsonPath("$..users[0].links.orgRoles[*]")
.findAll
.transform( _.mkString(",") )
.saveAs("orgRoles")
)
)
它简单易懂,并且没有临时保存到 Session
。甚至你放在 transform
中的函数也更容易,而它被定义为 A => B
因此简单的转换。查看有关转换 here.