使用UUID.randomUUID()。toString在发出问题的请求正文中设置密钥-Scala

时间:2019-06-20 20:02:27

标签: scala gatling

我是使用scala和gatling的新手。我正在定义一个正在执行http post调用以创建资源的方案。在请求正文的键/字段之一中,我想为名称添加一个唯一的标识符,因此使用UUID.randomUUID(),但是使用以下代码时请求失败。

> Artist.first.genres
=>["alternative emo", "anthem emo", "dreamo", "emo", "neon pop punk", "pop emo", "pop punk"]

> Artist.last.genres
=> ["emo", "brooklyn indie", "indie pop", "indie poptimism", "indie rock", "indietronica", "modern rock", "shimmer pop"] 

即使打印uuid确实会在控制台中打印id,但由于我认为“ $ {uuid}”可能是错误的,但会在后请求正文上引发错误,但我不确定。

任何建议/帮助都非常感谢!

1 个答案:

答案 0 :(得分:3)

在加特林的内部Expression替换和scala的字符串插值之间,您会感到困惑。

大量的DSL方法可以使您在字符串中使用诸如'$ {uuid}'之类的令牌-发生这种情况时,gatling实际上会获取会话值'uuid'并将其替换。但这仅适用于存在的密钥在会议中。如果不存在,则加特林将只使用'$ {uuid}'作为字符串文字。

Scala支持使用s"$uuid"进行字符串插值。在这种情况下,它将构建一个字符串,该字符串具有scala变量“ uuid”的值。

在您的情况下,您有一个'uuid'变量,但尚未加入到加特林会话中。您可以只将scala变量与scala字符串插值语法一起使用,但这不会给您期望的结果,因为所有gatling dsl方法都定义了在启动时执行的构建器-您的所有uuid的值都相同。

您需要做的是构建一个生成随机uuid的feeder,然后使用加特林的feeder构造在每次执行中获取唯一值。

private val uuidFeeder = Iterator.continually(Map("uuid" -> UUID.randomUUID().toString))

val scn = scenario("Testing !")
.feed(uuidFeeder) //this gets the next random uuid and puts it in the session
.exec(http("create resource")
            .post("/data")
            .body(StringBody(
            """{
               "add_name": "${uuid}",
            }""")).asJSON
            .check(status is(200)))