【问题标题】:Jmeter Dynamic Json Array Generation from CSV file从 CSV 文件生成 Jmeter 动态 Json 数组
【发布时间】:2017-04-25 05:52:32
【问题描述】:

我有以下 Json 数据要发布。

{
    "id": 1,
    "name": "Zypher",
    "price": 12.50,
    "tags": [{
        "tag": 1,
        "tagName": "X"
    },
    {
        "tag": 2,
        "tagName": "Y"
    },
    {
        "tag": 2,
        "tagName": "Z"
    }]
}

我的 Jmeter 测试计划如下,

- Test Plan
    - Thread Group
        - Http Request Defaults
        - Http Cookie Manager
        - Simple Controller
            - CSV Data Set Config (Sheet_1)
            - Http Header Manager
            - Http Request (The hard coded json was provided here as body data)

一切正常。现在我想使用 csv 来参数化我的 Json。

Sheet_1:
id,name,price
1,Zypher,12.50 

我用这 3 个参数修改了 json,它对我有用。现在我想参数化细节部分。我不知道该怎么做。 我只想让我的json像这样,

{
    "id": ${id},
    "name": ${name},
    "price": ${price},
    "tags": [
    {
        "tag": ${tag},
        "tagName": ${tagName}
    }]
}

我如何动态地制作 json 数组 tags 以获取来自 csv 数据的详细信息部分?我希望它作为 csv 文件中提供的行进行循环。

更新的 csv

id,name,price,tag,tagname
1,Zypher,12.50,7|9|11,X|Y|Z

这种格式会很棒

id,name,price,tag
1,Zypher,12.50,7:X|9:Y|11:Z

标签有两个除以:的属性

【问题讨论】:

    标签: json csv jmeter load-testing


    【解决方案1】:

    您可以使用JSR223 PreProcessorGroovy language 来实现,例如:

    1. 假设您具有以下 CSV 文件结构:

      id,name,price,tag
      1,Zypher,12.50,X|Y|Z
      
    2. 还有以下CSV Data Set Config设置:

    3. 将 JSR223 PreProcessor 添加为 HTTP Request 采样器的子级,并将以下代码放入“脚本”区域:

      import groovy.json.JsonBuilder
      
      def json = new JsonBuilder()
      def tagsValues = vars.get("tags").split("\\|")
      
      class Tag {int tag; String tagName }
      
      
      List<Tag> tagsList = new ArrayList<>()
      def counter = 1
      tagsValues.each {
          tagsList.add(new Tag(tag: counter, tagName: it))
          counter++
      }
      
      json {
          id Integer.parseInt(vars.get("id"))
          name vars.get("name")
          price Double.parseDouble(vars.get("price"))
          tags tagsList.collect { tag ->
              ["tag"    : tag.tag,
               "tagName": tag.tagName]
          }
      
      }
      
      sampler.addNonEncodedArgument("",json.toPrettyString(),"")
      sampler.setPostBodyRaw(true) 
      
    4. 从 HTTP 请求采样器“正文数据”选项卡中删除所有硬编码数据(它应该是绝对空白的)

    5. 运行您的请求 - JSON 有效负载应由 Groovy 代码动态填充:

    参考资料:


    更新:

    CSV 格式

    id,name,price,tag
    1,Zypher,12.50,7:X|9:Y|11:Z
    

    替换下面的 Groovy 代码:

    List<Tag> tagsList = new ArrayList<>()
    def counter = 1
    tagsValues.each {
        tagsList.add(new Tag(tag: counter, tagName: it))
        counter++
    }
    

    List<Tag> tagsList = new ArrayList<>();
    tagsValues.each {
        String[] tag = it.split("\\:")
        tagsList.add(new Tag(tag: Integer.parseInt(tag[0]), tagName: tag[1]))
    }
    

    【讨论】:

    • 你能分享你的jmx吗?我尝试过,但在请求中发现我的 POST 数据为空。
    • 顺便说一句,是否可以使用 java 或 javascript。我是一个完全的 groovy 菜鸟。
    • 我认为问题出在def tagsValues = vars.get("tags").split("\\|") 行。因为我在日志中得到了Cannot invoke method split() on null object。 csv中没有名为tags的参数。
    • 您需要在 CSV 数据集配置中将 tag 更改为 tags,反之亦然:将 Groovy 代码中的 def tagsValues = vars.get("tags").split("\\|") 更改为 def tagsValues = vars.get("tag").split("\\|")
    • 是的,谢谢已经这样做了。另一件事是您使用counter 生成了tag 的值。 csv文件如何管理?你知道它并不总是增量的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2015-05-17
    相关资源
    最近更新 更多