使用 BeanShell 预处理器发送 JSON 对象时出现问题
Issue while sending a JSON object with BeanShell PreProcessor
我想使用 BeanShell 预处理器向 JMeter 中的 HTTP 请求正文发送一个 JSON 对象。为了对 JSON 对象建模,我使用了 java 代码(带有一些业务逻辑)。因此我创建了一个 BeanShell PreProcessor 并编写了 java 代码如下,
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
String key="testKey";
int lastID=5548;
int totalCount=198;
JSONObject obj1 = new JSONObject();
JSONArray obj2 = new JSONArray();
for (int i=1;i<=totalCount;i++)
{
JSONObject item = new JSONObject();
item.put("taskId", Integer.toString(lastID+i));
item.put("taskOrder",1);
item.put("snapshotTemplateKey",key);
obj2.put(item);
obj1.put("changeControlTasks", obj2);
obj1.put("ccName","Eleven" );
obj1.put("snapshotTemplateKey",key);
}
log.info(obj1);
vars.putObject("jsonData",obj1);
并且在 HTTP 请求正文中,我尝试按如下方式获取数据,
${jsonData}
使用上面的代码,抛出以下共享错误
要求:
POST data:
${jsonData}
日志中的错误:
2017/08/06 07:27:10 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval
Sourced file: inline evaluation of: ``import org.json.JSONArray; import org.json.JSONException;
import org.json.JSONOb . . . '' : Error in method invocation: Method info( ) not found in class'org.apache.log.Logger'
任何人都可以建议上面的代码有什么问题以及如何解决这些问题。
任何建议或解决方案也将不胜感激。
obj2 保存数据。使用 obj2
而不是 obj1
:
vars.putObject("jsonData",obj2);
对于日志转换成Sring
log.info(obj1.toString());
你的 Beanshell 将无法工作,因为它会在这一行失败:
log.info(obj1);
因为您无法将 JSON 对象打印到日志中
- 即使你在 HTTP 请求采样器周围工作它也不会因为同样的原因工作:你不能将 JSON 对象作为正文数据,因为 JMeter 期望在那里有一个字符串
Beanshell is not the best scripting option, when you run your test with high number of threads this function will become the bottleneck, you should consider switching to JSR223 PreProcessor and Groovy language instead. Groovy has built-in JSON support and its performance is much better 以及行为良好的 Groovy 脚本可以被编译和缓存。替换 Groovy 代码类似于:
import groovy.json.JsonBuilder
def key = 'testKey'
def lastID = 5548
def totalCount = 198
JsonBuilder builder = new JsonBuilder()
def array = []
1.upto(totalCount, {
def taskId = (lastID + "${it}".toInteger())
array << [getKey: { key }, getTaskId: { taskId }, getTaskOrder: { 1 }]
})
builder(
{
changeControlTasks array.collect() {
[
"snapshotTemplateKey": it.getKey(),
"taskId" : it.getTaskId(),
"taskOrder" : it.getTaskOrder()
]
}
snapshotTemplateKey "testKey"
ccName "Eleven"
}
)
vars.put('jsonData', builder.toPrettyString())
我想使用 BeanShell 预处理器向 JMeter 中的 HTTP 请求正文发送一个 JSON 对象。为了对 JSON 对象建模,我使用了 java 代码(带有一些业务逻辑)。因此我创建了一个 BeanShell PreProcessor 并编写了 java 代码如下,
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
String key="testKey";
int lastID=5548;
int totalCount=198;
JSONObject obj1 = new JSONObject();
JSONArray obj2 = new JSONArray();
for (int i=1;i<=totalCount;i++)
{
JSONObject item = new JSONObject();
item.put("taskId", Integer.toString(lastID+i));
item.put("taskOrder",1);
item.put("snapshotTemplateKey",key);
obj2.put(item);
obj1.put("changeControlTasks", obj2);
obj1.put("ccName","Eleven" );
obj1.put("snapshotTemplateKey",key);
}
log.info(obj1);
vars.putObject("jsonData",obj1);
并且在 HTTP 请求正文中,我尝试按如下方式获取数据,
${jsonData}
使用上面的代码,抛出以下共享错误
要求:
POST data:
${jsonData}
日志中的错误:
2017/08/06 07:27:10 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval
Sourced file: inline evaluation of: ``import org.json.JSONArray; import org.json.JSONException;
import org.json.JSONOb . . . '' : Error in method invocation: Method info( ) not found in class'org.apache.log.Logger'
任何人都可以建议上面的代码有什么问题以及如何解决这些问题。
任何建议或解决方案也将不胜感激。
obj2 保存数据。使用 obj2
而不是 obj1
:
vars.putObject("jsonData",obj2);
对于日志转换成Sring
log.info(obj1.toString());
你的 Beanshell 将无法工作,因为它会在这一行失败:
log.info(obj1);
因为您无法将 JSON 对象打印到日志中
- 即使你在 HTTP 请求采样器周围工作它也不会因为同样的原因工作:你不能将 JSON 对象作为正文数据,因为 JMeter 期望在那里有一个字符串
Beanshell is not the best scripting option, when you run your test with high number of threads this function will become the bottleneck, you should consider switching to JSR223 PreProcessor and Groovy language instead. Groovy has built-in JSON support and its performance is much better 以及行为良好的 Groovy 脚本可以被编译和缓存。替换 Groovy 代码类似于:
import groovy.json.JsonBuilder def key = 'testKey' def lastID = 5548 def totalCount = 198 JsonBuilder builder = new JsonBuilder() def array = [] 1.upto(totalCount, { def taskId = (lastID + "${it}".toInteger()) array << [getKey: { key }, getTaskId: { taskId }, getTaskOrder: { 1 }] }) builder( { changeControlTasks array.collect() { [ "snapshotTemplateKey": it.getKey(), "taskId" : it.getTaskId(), "taskOrder" : it.getTaskOrder() ] } snapshotTemplateKey "testKey" ccName "Eleven" } ) vars.put('jsonData', builder.toPrettyString())