在 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(","))

看看:https://github.com/gatling/gatling/blob/master/gatling-core/src/main/scala/io/gatling/core/session/Session.scala

我最终解决了这个问题:

.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 集合中使用)mapflatMap 来操作存在的值。您可以找到更多关于 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.

的更多信息