Jmeter - 动态传递对 HTTP 请求的特定 JSON 响应
Jmeter - Passing specific JSON response to HTTP request dynamically
我在 Jmeter(2.13) 中有一个特定要求,我需要多次动态传递两个参数作为 id 和 parentObjectApiName
{
"id":"SomeNumber",
"parentObjectApiName":"SomeName"
},
{
"id":"SomeNumber",
"parentObjectApiName":"SomeName"
},
}
我将从以下回复中得到:
{
"detailMap": {
"RootNumber": [
{
"id": "SomeNumber",
"properties": {
},
"isDeleted": false,
"version": "2017-11-20T08:13:30+00:00",
"referenceId": null,
"parentObjectApiName": "SomeName"
},
{
"id": "SomeNumber",
"properties": {
},
"isDeleted": false,
"version": "2017-04-21T15:40:10.742+00:00",
"referenceId": null,
"parentObjectApiName": "SomeName"
},
{
:
},
]
}
"state": {
"errorDetails": []
}
}
在 Jmeter(2.13) 中使用 beanshell 是否有任何解决上述要求的方法。
您的要求可以通过以下步骤实现。
- 将 "JSON Extractor" 添加到请求中,其中响应包含您要在下一个请求中传递的参数。(图 1)
- JSON 提取器配置(Image-2)
保持 JSON 提取器不变,将 "Beanshell PostProcessor" 添加到请求中并保留以下代码部分并尝试。您想要的 id 和 parentObjectApiName 将存储在变量 "json" 中。您可以在下一个请求中将其称为 ${json}
import java.io.file;
import java.util.*;
import org.apache.jmeter.services.fileserver;
StringBuilder output = new StringBuilder();
Random random = new Random();
int max = Integer.parseInt(vars.get("id_matchNr"));
for(int i=1;i<=max;i++)
{
output.append("{");
output.append("\"id\":\"" + vars.get("id_"+i) + "\",\"parentObjectApiName\":" + vars.get("parentObjectApiName_"+i));
output.append("}").append( "," );
}
String withoutLastComma = output.substring( 0, output.length( ) - ",".length( ) );
vars.put("json", withoutLastComma.toString());
Image-1
Image-2
注意since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for any scripting in JMeter. Groovy has much better performance than Beanshell does, moreover Groovy has built-in JSON support。
- 将 JSR223 PostProcessor 添加为上述 returns JSON
请求的子项
- 确保您在 "Language" 下拉列表中选择了
groovy
并勾选了 Cache compiled script if available
框
将以下代码放入"Script"区域:
import groovy.json.JsonBuilder
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import groovy.json.internal.LazyMap
def text = prev.getResponseDataAsString()
log.info('Original response: ' + text)
def json = new JsonSlurper().parseText(text)
def data = new ArrayList()
json.detailMap.RootNumber.each { rootNumber ->
def map = new LazyMap()
map.put("id", rootNumber.id)
map.put("parentObjectApiName", rootNumber.parentObjectApiName)
data.add(map)
}
vars.put('json',JsonOutput.prettyPrint(JsonOutput.toJson(data)))
log.info('Generated json: ' + vars.get('json'))
以上代码将生成如下JSON:
[
{
"id": "SomeNumber",
"parentObjectApiName": "SomeName"
},
{
"id": "SomeOtherNumber",
"parentObjectApiName": "SomeOtherName"
}
]
您将能够在需要时以 ${json}
的形式访问它(即在下一个 HTTP Request 采样器 "Body Data" 选项卡中)
我在 Jmeter(2.13) 中有一个特定要求,我需要多次动态传递两个参数作为 id 和 parentObjectApiName
{
"id":"SomeNumber",
"parentObjectApiName":"SomeName"
},
{
"id":"SomeNumber",
"parentObjectApiName":"SomeName"
},
}
我将从以下回复中得到:
{
"detailMap": {
"RootNumber": [
{
"id": "SomeNumber",
"properties": {
},
"isDeleted": false,
"version": "2017-11-20T08:13:30+00:00",
"referenceId": null,
"parentObjectApiName": "SomeName"
},
{
"id": "SomeNumber",
"properties": {
},
"isDeleted": false,
"version": "2017-04-21T15:40:10.742+00:00",
"referenceId": null,
"parentObjectApiName": "SomeName"
},
{
:
},
]
}
"state": {
"errorDetails": []
}
}
在 Jmeter(2.13) 中使用 beanshell 是否有任何解决上述要求的方法。
您的要求可以通过以下步骤实现。
- 将 "JSON Extractor" 添加到请求中,其中响应包含您要在下一个请求中传递的参数。(图 1)
- JSON 提取器配置(Image-2)
保持 JSON 提取器不变,将 "Beanshell PostProcessor" 添加到请求中并保留以下代码部分并尝试。您想要的 id 和 parentObjectApiName 将存储在变量 "json" 中。您可以在下一个请求中将其称为 ${json}
import java.io.file;
import java.util.*;
import org.apache.jmeter.services.fileserver;
StringBuilder output = new StringBuilder();
Random random = new Random();
int max = Integer.parseInt(vars.get("id_matchNr"));
for(int i=1;i<=max;i++)
{
output.append("{");
output.append("\"id\":\"" + vars.get("id_"+i) + "\",\"parentObjectApiName\":" + vars.get("parentObjectApiName_"+i));
output.append("}").append( "," );
}
String withoutLastComma = output.substring( 0, output.length( ) - ",".length( ) );
vars.put("json", withoutLastComma.toString());
Image-1
Image-2
注意since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for any scripting in JMeter. Groovy has much better performance than Beanshell does, moreover Groovy has built-in JSON support。
- 将 JSR223 PostProcessor 添加为上述 returns JSON 请求的子项
- 确保您在 "Language" 下拉列表中选择了
groovy
并勾选了Cache compiled script if available
框 将以下代码放入"Script"区域:
import groovy.json.JsonBuilder import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.json.internal.LazyMap def text = prev.getResponseDataAsString() log.info('Original response: ' + text) def json = new JsonSlurper().parseText(text) def data = new ArrayList() json.detailMap.RootNumber.each { rootNumber -> def map = new LazyMap() map.put("id", rootNumber.id) map.put("parentObjectApiName", rootNumber.parentObjectApiName) data.add(map) } vars.put('json',JsonOutput.prettyPrint(JsonOutput.toJson(data))) log.info('Generated json: ' + vars.get('json'))
以上代码将生成如下JSON:
[
{
"id": "SomeNumber",
"parentObjectApiName": "SomeName"
},
{
"id": "SomeOtherNumber",
"parentObjectApiName": "SomeOtherName"
}
]
您将能够在需要时以 ${json}
的形式访问它(即在下一个 HTTP Request 采样器 "Body Data" 选项卡中)