我正在尝试将向量连接到字符串中,以便将其插入到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}")
实际上,接下来会进行以下调用:
.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))
我是加特林和斯卡拉的新手,并做了大量的研究。我发现以下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不是io.gatling.core.session.SessionAttribute
的成员
有关前进的任何建议吗?
答案 0 :(得分:1)
您是否尝试过调用toString或者groupHierarchy?
session => session("itemIds").validate[Seq[String]].map(_.toString.mkString(","))
session => session("itemIds").validate[Seq[String]].map(_.groupHierarchy.mkString(","))
答案 1 :(得分:1)
你得到的错误是因为:
"hdfs://defaultFsAddress:8020/
您正在会话实例(for more see source code)上调用session("orgRoles")
方法。 Session.apply
方法返回apply
实例,该实例具有以下方法:
SessionAttribute
每个服务器的目的不同(请参阅注释)。 // 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]
的所有上述方法都只是getters from session。它们的唯一目的是为您提供以任何形式存储在会话中的密钥的值。
只有在获得价值后,您才能对其采取任何措施。最安全的做法是使用SessionAttribute
方法,该方法提供了常见的组合子(在所有Scala集合中使用)validate
和map
来操作值。您可以找到有关flatMap
概念here的更多信息。因此,您的代码应如下所示:
Validation
这也是你上面已经写过的内容。但您已使用// 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(",") ))
DSL方法,因此您可以在第一次通话中直接使用check
:
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
因此简单的转换。查看有关转换here的更多信息。
答案 2 :(得分:0)
我最终解决了这个问题:
.exec(session =>
session.set("orgRolesConcat", session("orgRoles").as[Seq[String]].mkString(",")))