如何在加特林将地图列表传递到鹅卵石模板?

问题描述

在加特林有Pebble模板的官方文档:https://gatling.io/2018/11/06/gatling-3-pebble-templating/

最后,您可以看到代码

{% for child in children %}
  {
    "id": {{child.id}},"name": "{{child.name}}"
  }{% if loop.last %}{% else %},{% endif %}
{% endfor %}

这意味着children变量是一个列表,其中包含带有键idname的映射 但是如何创建这样的列表并让Pebble知道呢?

当前,我有一种用于创建地图列表的方法

  def getArray(count: Integer): mutable.MutableList[Map[String,String]] = {
    var array = mutable.MutableList[Map[String,String]]()
    for (i <- 0 until count) {
      array += Map(
        "UniqueString" -> UUID.randomUUID.toString,"RandomNumber" -> (Random.nextInt(10000) + 10000).toString,"contentId" -> UUID.randomUUID.toString
      )
    }
    array
  }

我有一个供料器:

  val elementsFeeder = Iterator.continually(Map(
    "elements" -> getArray(documentsMultiple)
  ))

我照常喂它:

  def archive = repeat(1){
    Feed(elementsFeeder)
    .exec(
    .......

我的卵石模板如下:

[
{% for element in elements %}
  Debugging info <element>: {{element}}
  {"name": "{{element.UniqueString}}","value": "{{element.RandomNumber}}"}{% if loop.last %}{% else %},{% endif %}
{% endfor %}
]

但是当调试行看起来像这样时,我看到的不是引号和值,而是引号之间只有空白:

Debugging info <element>: Map(UniqueString -> 81a92aeb-3966-43ff-8c42-1e0e93ace3a4,RandomNumber0To100000 -> 11775,contentId -> 436701db-d66b-4819-b33e-3e455dbe19fc)

即使我通过在新的Map声明后添加.asJava来更改地图生成以将其转换为Java的地图,我仍然会看到空白并显示以下输出

Debugging info <element>: {UniqueString=119593c6-e526-4cca-a2d5-34d57bbfb22d,RandomNumber0To100000=16945,contentId=57385850-670b-484b-96e6-a1ec05c568ac}

解决方法

Pebble是一个Java库,可用于Java集合,而不是Scala集合。

从加特林(Gatling)3.4.0开始,存在一些缺点:

  • 我们不会将Scala Maps包装到Java中
  • 我们不深度包装/转换会话内容,仅根元素

现在尝试使用Java集合。

,

要使用pebble从地图中获取值,您应该像常规的Java地图一样访问它:

{% for element in elements %}
  {"name": "{{element.get("UniqueString"}}","value": "{{element.get("RandomNumber")}}"}{% if loop.last %}{% else %},{% endif %}
{% endfor %}

要创建供料器,我使用2种方法。其中一个返回java.util.HashMap的新实例,第二个创建这些映射的java.util.ArrayList。然后,我可以创建Feeder:

val elementsFeeder = Iterator.continually(Map(
  "elements" -> getJavaArray(10)
))