从CSV文件生成Jmeter动态Json数组

Est*_*sty 2 csv json jmeter load-testing

我要发布以下Json数据。

{
    "id": 1,
    "name": "Zypher",
    "price": 12.50,
    "tags": [{
        "tag": 1,
        "tagName": "X"
    },
    {
        "tag": 2,
        "tagName": "Y"
    },
    {
        "tag": 2,
        "tagName": "Z"
    }]
}
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

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

Sheet_1:
id,name,price
1,Zypher,12.50 
Run Code Online (Sandbox Code Playgroud)

我用这3个参数修改了json及其对我有用。现在,我想对细节部分进行参数化。我不知道该怎么做。我想要保持我的json这样的一切,

{
    "id": ${id},
    "name": ${name},
    "price": ${price},
    "tags": [
    {
        "tag": ${tag},
        "tagName": ${tagName}
    }]
}
Run Code Online (Sandbox Code Playgroud)

我如何动态地tags从csv数据中为细节部分创建json数组?我希望将其循环为csv文件中提供的行。

更新的csv

id,name,price,tag,tagname
1,Zypher,12.50,7|9|11,X|Y|Z
Run Code Online (Sandbox Code Playgroud)

这种格式会很棒

id,name,price,tag
1,Zypher,12.50,7:X|9:Y|11:Z
Run Code Online (Sandbox Code Playgroud)

标签具有两个属性,除以 :

Dmi*_*i T 5

您可以使用JSR223 PreProcessorGroovy语言(例如:

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

    id,name,price,tag
    1,Zypher,12.50,X|Y|Z
    
    Run Code Online (Sandbox Code Playgroud)
  2. 以及以下CSV数据集配置设置:

    JMeter CSV数据集配置

  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) 
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从HTTP请求采样器的“主体数据”标签中删除所有硬编码的数据(该数据应绝对为空白)

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

    Groovy的JMeter JSON

参考文献:


更新:

CSV格式

id,name,price,tag
1,Zypher,12.50,7:X|9:Y|11:Z
Run Code Online (Sandbox Code Playgroud)

替换下面的Groovy代码:

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

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