最近做公司一个接口的并发测试,传递参数为json格式,要在json里面传一个200个不同用户的列表,如果用手动添加感觉太吃力了,因此想办法在BeanShell中将json拼好后传入jmeter请求。公司Java大神帮忙写的在jmeter中不能完美运行,总是有问题,因此就自己半桶水Java开干,全部不使用第三方jar包。
直接上干货。
1.将一下代码封装成jar包
package openapiTest;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class creat_jsonObject {
/**
* 获取js数据
* @param 元数据map
* @return js数据
*/
public synchronized static String getJsData(Object obj) { //synchronized为线程锁,当一个线程正访问该方法时其他线程将不能访问
return createJsData(obj);
}
/**
* 生成js数据
* @param 元数据map
* @return js数据
*/
//J2SE 提供的最后一个批注是 @SuppressWarnings。该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。
@SuppressWarnings("unchecked")
public static String createJsData(Object obj) {
if (null == obj) {
return "\"\"";
}
StringBuffer resultStr = new StringBuffer();
if (obj instanceof Collection) { // 集合List、Set等类型
resultStr.append("[");
Collection collection = (Collection) obj;
if (collection.size() > 0) {
//Object类型之后可以给任意类型的值或者对象赋值给当前的object 对象,而不需要强制类型转换,方便操作。声明一个对象的数组,在数组索引范围内设置任意的你想要设置的对象
Object[] collectionObj = collection.toArray();
for (int i = 0; i < collectionObj.length; i++) {
resultStr.append(createJsData(collectionObj[i]) + ",");
}
//StringBuffer类型删除最末位字符
resultStr.deleteCharAt(resultStr.lastIndexOf(","));
}
resultStr.append("]");
} else if (obj instanceof Map) { // Map类型
resultStr.append("{");
Map map = (Map) obj;
if (map.size() > 0) {
//Iterator迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象.iterator()方法是java.lang.Iterable接口,被Collection继承。
Iterator<Entry> iter = map.entrySet().iterator();
while (iter.hasNext()) {
//遍历Map
Map.Entry entry = iter.next();
String key = entry.getKey().toString();
resultStr.append("\"" + key + "\":"); // jquery1.4以上要求双引号包裹
Object tempObj = entry.getValue();
resultStr.append(createJsData(tempObj) + ",");
}
resultStr.deleteCharAt(resultStr.lastIndexOf(","));
}
resultStr.append("}");
} else { // 基本类型
try {
int arrLength = Array.getLength(obj);
resultStr.append("[");
if (arrLength > 0) {
for (int i = 0; i < arrLength; i++) {
resultStr.append(createJsData(Array.get(obj, i)) + ",");
}
resultStr.deleteCharAt(resultStr.lastIndexOf(","));
}
resultStr.append("]");
} catch (IllegalArgumentException e) { // 不是数组,是最基本的数据
resultStr.append("\"" + stringToJson(obj + "") + "\"");
}
}
return resultStr.toString();
}
/**
* 处理特殊字符
* @param json字符串
* @return 处理过的字符串
*/
public static String stringToJson(String str) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
switch (c) {
case '\"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
}
2.jmeter引用封装好的jar包(引用方式略)
3.BeanShell将参数放入map,调用jar包方法返回json格式字符串
得到结果:
OK,大功告成。