JMeter进阶使用变量及BeanShell 预处理程序实现复杂服务器托管网调试
有一些测试需要做一些预处理程序才能做http请求,在JMeter下可以通过使用参数+BeanShell 预处理程序加工后再发起请求即可。例oauth服务需要通过username,password,client_id,client_secret,grant_type进行请求,这里的密码涉及安全性不能用明文进行传输,需要做预处理
应用提供如下信息:
用户名:username=user
密码:password=888888
盐值:salt=2gjokme8k5p0u3n8ca1n
客户端ID:client_id=test
客户端秘钥:client_secret=16air0bu4l0yjnfkkxfc
授权模式:grant_type=password
发送密码的规则为password=sha(md5(8888882gjokme8k5p0u3n8ca1n))=a43dd2bfc28bbaf137ab5a45d634f44eed06adcf
这里需要先将(密码+盐值)先进行md5,再进行sha才是要发送的最终参数,这里如果只测试一个用户时间,先通过其它程序取得再传入也是很方便,但如果需要做多个用户的测试就非常麻烦了,需要不停的去加工后才能在jmeter里更换,调试起来不方便,如果用参数+BeanShell 预处理程序就可以很方便处理了
下面来实际验证
验证请求
成功返回
下面用参数+BeanShell 预处理程序来实现
定义参数
如果换个用户,只需修改这里即可
HTTP请求里值用${xxxx}来定义变量参数,来接收定义的参数或BeanShell 预处理程序生成的变量,这里${passwordPar} 是BeanShell 预处理程序生成的
BeanShell预处理程序
处理程序
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public static String md5AndSha(String inputText)
{
return sha(md5(inputText));
}
public static String md5(String inputText) {
return encrypt(inputText, "md5");
}
public static String sha(String inputText) {
return encrypt(inputText, "sha-1");
}
public static String encrypt(String inputText, String algorithmName) {
if (inputText == null || "".equals(inputText.trim())) {
throw new IllegalArgumentException("请输入要加密的内容");
}
if (algorithmName == null || "".equals(algorithmName.trim())) {
algorithmName = "md5";
}
String encryptText = null;
try {
MessageDigest m = MessageDigest.getInstance(algorithmName);
m.update(inputText.getBytes("UTF8"));
byte[] s = m.digest();
return hex(s);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}return encryptText;
}
public static String hex(byte[] arr) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i keySet = data.keySet();
Set keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
if (k.equals("sign")) {
continue;
}
if (data.get(k).toString().trim().length() > 0) //为空,则不参与签名
sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
}
sb.append("key=").append(key);
System.out.println(sb);
if ("MD5".equals(signType)) {
return MD5(sb.toString()).toUpperCase();
}else {
throw new Exception(String.format("Invalid sign_type: %s", signType));
}
}
public void getPasswordPar(){
String clientId=vars.get("client_id");
String clientSecret=vars.get("client_secret");
String username=vars.get("username");
String password=vars.get("password");
String salt=vars.get("salt");
String grant_type=vars.get("grant_type");
String passwordPar=md5AndSha(password+salt);
vars.put("passwordPar",passwordPar);
log.info("加密passwordPar begin");
log.info(passwordPar);
log.info("加密passwordPar end");
}
log.info("BeanShell 预处理程序");
/*
* 获取加密参数passwordPar
*/
getPasswordPar();
当请求取得结果后,也可以用BeanShell 后置处理程序将请求返回做解析加工,取出想要的数据,然后存入变量供下一个请求来处理
BeanShell 后置处理程序
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
log.info("BeanShell 后置处理程序");
//取得请求返回结果
log.info("请求返回结果 begin");
String response = prev.getResponseDataAsString();
log.info(response);
log.info("请求返回结果 end");
JSONObject json= JSONObject.parseObject(response);
String myToken=json.getString("access_token");
//将access_token存入变量中
vars.put("myToken",myToken);
log.info("取得access_token为:"+myToken);
使用第三方库
这里后置处理程序用到fastjson库,记得下载放下JMeter库文件lib目录中
显示调试日志
在BeanShell 后置处理程序,还可以取得返回结果再存入变量中,如vars.put(“myToken”,myToken);即是将取得的access_token存入变量myToken
这里来验证
定义新一个变量myToken值默认设为myToken,看会不会有变化
添加HTTP请求2
路径改为/getName?token=${myToken},这里路径中的${myToken}用于接收参数
发起请求,查看HTTP请求2的返回结果,myToken确定改变了
c
服务器托管,北服务器托管网京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 基于ChatGPT函数调用来实现C#本地函数逻辑链式调用助力大模型落地
6 月 13 日 OpenAI 官网突然发布了重磅的 ChatGPT 更新,我相信大家都看到了 ,除了调用降本和增加更长的上下文版本外,开发者们最关心的应该还是新的函数调用能力。通过这项能力模型在需要的时候可以调用函数并生成对应的 JSON 对象作为输出。…