Jmeter Dynamic Json 从 CSV 文件生成数组
Jmeter Dynamic Json Array Generation from CSV file
我有一个 Json 数据到 post。
{
"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
标签有两个属性除以 :
您可以使用 JSR223 PreProcessor and Groovy language 来完成,例如:
假定您具有以下 CSV 文件结构:
id,name,price,tag
1,Zypher,12.50,X|Y|Z
以及以下 CSV Data Set Config 设置:
将 JSR223 PreProcessor 添加为 HTTP Request 采样器的子项,并将以下代码放入 "Script" 区域:
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)
从 HTTP 请求采样器 "Body Data" 选项卡中删除任何硬编码数据(它应该是绝对空白的)
运行 您的请求 - 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]))
}
我有一个 Json 数据到 post。
{
"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
标签有两个属性除以 :
您可以使用 JSR223 PreProcessor and Groovy language 来完成,例如:
假定您具有以下 CSV 文件结构:
id,name,price,tag 1,Zypher,12.50,X|Y|Z
以及以下 CSV Data Set Config 设置:
将 JSR223 PreProcessor 添加为 HTTP Request 采样器的子项,并将以下代码放入 "Script" 区域:
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)
从 HTTP 请求采样器 "Body Data" 选项卡中删除任何硬编码数据(它应该是绝对空白的)
运行 您的请求 - 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]))
}