我想使用 BeanShell PreProcessor 将一个 JSON 对象发送到 JMeter 中的 HTTP 请求正文。为了对JSON对象进行建模,我正在使用java代码(带有一些业务逻辑(。因此,我创建了一个BeanShell预处理器,并编写了如下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 不是最好的脚本选项,当你用大量线程运行测试时,这个函数将成为瓶颈,你应该考虑切换到 JSR223 PreProcessor 和 Groovy 语言。Groovy具有内置的JSON支持,其性能要好得多,因为可以编译和缓存行为良好的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())