问题背景
通常在一个项目中,进行列表的数据查询时,都会发送GET的请求方式,在URL都带有查询条件的参数,而这些参数通常会被转码后才发送到服务器。在进行接口测试的时候往往会对请求参数进行参数化,而转码会带来参数化的复杂性,非常麻烦。
例如:
转码后发送到服务器的URL请求:http://tool.chinaz.com/login?%2flogin%3fusername%3dadmin%26password%3dadmin
解码后还原的URL请求:http://tool.chinaz.com/login?username=admin&password=admin
解决方法
1.为了解决URL的转码问题,在发送URL请求时,使用fiddler进行抓取发送的URL参数进行解码还原后,再进行拼接请求参数。
2.将拼接好的URL请求使用JAVA编写的代码进行转码,以JAVA文件的方式导出,提供给JMETER进行方法调用。
3.为Http Request添加JSR223 PreProcessor组件,该组件是在Http 请求之前调用JAR文件的JAVA代码的方法对参数进行转码处理。
3.将转码好的数据进行参数化提供jmeter引用。
解决步骤
转码和解码的JAVA源代码
package evmsc2.com;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class UrlCoder {
public String urlDecoder(String decodeUrlParm) {
String decoderStr = null;
try {
decoderStr = URLDecoder.decode(decodeUrlParm, "utf-8");
System.out.println("解码:" + decoderStr);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return decoderStr;
}
public String urlEncoder(String encodeUrlParm) {
String encodeStr = null;
try {
encodeStr = URLEncoder.encode(encodeUrlParm, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("编码:" + encodeStr);
return encodeStr;
}
}
JMETER引用转码和解码的JAR文件
将该文件的代码以JAR文件的格式进行导出后,放在JMETER目录的/lib/ext目录下
在测试计划中的Library以相对路径的方式引用JAR文件。
JSR223 PreProcessor组件中调用JAR文件的转发方法
调用方法代码如下:
import evmsc2.com.UrlCoder;
import evmsc2.com.DateTimeTool;
String beginTime = vars.get("last_upload_time");
String vin = vars.get("vin");
String begin = new DateTimeTool().getSpecialDayAddOrBefore(beginTime,-5,0,1,1);
String end = new DateTimeTool().getSpecialDayAddOrBefore(beginTime,0,0,1,1);
String str = "{\"conditions\":[{\"name\":\"beginTime\",\"value\":\"" + begin + "\"},"
+ "{\"name\":\"endTime\",\"value\":\"" + end + "\"},{\"name\":\"vin\",\"value\":\"" + vin + "\"}],"
+ "\"sort\":[],\"start\":0,\"limit\":10}";
String url = new UrlCoder().urlEncoder(str);
log.info(url);
vars.put("parameter",url);
调用之前需要进行导入包和类,跟java的风格一样。str参数就是发送URL请求的参数,所以需要str进行转码。
String url = new UrlCoder().urlEncoder(str);该行代码进行调用JAVA的方法进行转码,返回转码后的数据。
vars.put("parameter",url);该行代码进行将转码后的数据封装在一个变量中,提供jmeter进行使用,以${变量名}的方式获取值。
获取转码后的变量发送转码后的URL请求
根据JMETER获取变量值的方式${parameter},获得值后,发送请求。
在JMETER的View Reesults Tree中可以查看到发送求前参数被转码,完美解决该问题。
注意:如果对本博文有疑问或者有错误的地方可留言。