2017-04-25 149 views
0

我有一个要发布的以下Json数据。Jmeter从CSV文件生成动态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} 
    }] 
} 

我怎么能动态地使从CSV数据细节部分JSON数组tags?我希望它在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 

标签有两个属性由:

回答

1

可以使用JSR223 PreProcessorGroovy language,像做划分:

  1. 鉴于你有以下CSV文件结构:

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

    JMeter CSV Data Set Congif

  3. 添加JSR223预处理器作为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代码来填充:

    JMeter JSON from 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])) 
} 
+0

请您分享您的jmx?我试过但发现我的POST数据是空的请求。 – Esty

+0

顺便说一句,它可以使用Java或JavaScript。我是groovy的完全noob。 – Esty

+0

我认为问题在'def tagsValues = vars.get(“tags”)。split(“\\ |”)'行。因为我得到了'不能在日志中的空对象'上调用方法split()。在csv中没有名为'tags'的参数。 – Esty