2017-04-25 41 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