在Gatling

时间:2016-03-17 13:28:25

标签: scala 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}")

实际上,接下来会进行以下调用:

.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

的成员

有关前进的任何建议吗?

3 个答案:

答案 0 :(得分:1)

您是否尝试过调用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

答案 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集合中使用)validatemap来操作值。您可以找到有关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(",")))