Esty
Esty

Reputation: 1912

Jmeter Dynamic Json Array Generation from CSV file

I have a following Json data to post.

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

My Jmeter Test Plan is as following,

- 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)

Every thing works fine. Now I want to use csv to parametrised my Json.

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

I modified json with these 3 parameters and its works for me. Now I want to parametrise detail portion. I have no idea how to do this. All I want to keep my json like this,

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

How could I dynamically make json array tags for details portion from csv data? I want it to be looped as row provided in csv file.

Updated csv

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

It would be great in this format

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

tag has two properties dividing by :

Upvotes: 4

Views: 5887

Answers (1)

Dmitri T
Dmitri T

Reputation: 168157

You can do it using JSR223 PreProcessor and Groovy language, something like:

  1. Given you have the following CSV file structure:

    id,name,price,tag
    1,Zypher,12.50,X|Y|Z
    
  2. And the following CSV Data Set Config settings:

    JMeter CSV Data Set Congif

  3. Add JSR223 PreProcessor as a child of the HTTP Request sampler and put the following code into "Script" area:

    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. Remove any hard-coded data from the HTTP Request sampler "Body Data" tab (it should be absolutely blank)

  5. Run your request - JSON payload should be populated dynamically by the Groovy code:

    JMeter JSON from Groovy

References:


Update:

for CSV format

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

Replace the below Groovy code:

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

with

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

Upvotes: 6

Related Questions