【问题标题】:How to pass a list of maps to pebble template in Gatling?如何将地图列表传递给 Gatling 中的卵石模板?
【发布时间】:2021-01-12 02:24:52
【问题描述】:

Gatling 中有 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(
    .......

我的 pebble 模板如下所示:

[
{% 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}

【问题讨论】:

    标签: scala gatling scala-gatling pebble


    【解决方案1】:

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

    Gatling 3.4.0 有一些缺点:

    • 我们不会将 Scala 映射封装到 Java 映射中
    • 我们不会深度包装/转换 Session 内容,只有根元素

    现在尝试使用 Java 集合。

    【讨论】:

    • 那么从官方文档中创建一个 feeder 来支持这部分 pebble 模板的正确方法是什么? {% for child in children %} { "id": {{child.id}}, "name": "{{child.name}}" }{% if loop.last %}{% else %},{% endif %} {% endfor %}
    【解决方案2】:

    要使用 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。之后我可以创建馈线:

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

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 2020-01-31
      • 2013-02-14
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多