>[info] 功能描述:使用BeanShell,对入参进行md5签名;使用BeanShell ,进行断言
[TOC]
### 测试环境准备
- 服务器IP:10.1.102.75
- 端口号:8000
- 测试接口:/mock/location
- 入参:
ip:IP地址
sign:签名,签名规则是md5(key + ip)
- 访问方法:GET
- 接口功能:如果sign签名验证通过,返回规定的模拟响应
- 返回格式:
```
{
code: 1,
msg: "success",
data: {
country: "Thailand",
countryCode: "TH",
city: "Bankok",
ipaddress: "171.96.0.127"
}
}
```
*服务端接口参考代码(本实例使用django编写)
功能描述:根据入参ip,安装约定好的签名方式重签名,然后与入参sign对比,如果签名匹配,则返回规定的模拟响应。*
```python
def location(request):
import hashlib
ip = request.GET.get("ip")
sign = request.GET.get("sign")
key = "Milton_PTQA"
m = hashlib.md5(str(key + ip).encode())
re_sign = m.hexdigest()
if sign == re_sign:
ret = {
"code": 1,
"msg": "success",
"data": {
"country": "Thailand",
"countryCode": "TH",
"city": "Bankok",
"ipaddress": ip
}
}
else:
ret = {
"code": 0,
"msg": "sign error",
"data": []
}
return JsonResponse(ret)
```
### 一、导入包含签名方法的jar包
![](https://box.kancloud.cn/3e576a20e85fc5df8974cdb89f58e62e_1004x550.jpg)
其中的md5.jar 是自行编写的java类,然后导出的jar包,再在jmeter中导入进行使用
md5.java 代码参考如下:
```java
package com.ssjj.ptqa;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class md5 {
public static String toMD5(String plainText) {
try {
// 生成实现指定摘要算法的 MessageDigest 对象。
MessageDigest md = MessageDigest.getInstance("MD5");
// 使用指定的字节数组更新摘要。
md.update(plainText.getBytes());
// 通过执行诸如填充之类的最终操作完成哈希计算。
byte b[] = md.digest();
// 生成具体的md5密码到buf数组
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
// 32位加密
return buf.toString();
// System.out.println("32位: " + buf.toString());// 32位的加密
// 16位的加密
// return buf.toString().substring(8, 24);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static void main(String agrs[]) {
String sign = new md5().toMD5("b68f05cd86e6633e9e012663ef4727e3203.151.232.104");// 加密LXD
System.out.println(sign);
}
}
```
### 二、定义Jmeter变量
key:Milton_PTQA
ip:171.96.0.127 (随意填IP即可)
![](https://box.kancloud.cn/459e8c940ad1340e33313a79a3a752c3_962x245.jpg)
### 三、使用前置BeanShell处理器,进行签名,并将签名值赋予变量${sign}
![](https://box.kancloud.cn/4fc71d642f1e3d0d5b255a8c857084d5_943x468.jpg)
*代码参考*
```java
import com.ssjj.ptqa.md5;
String ip = vars.get("ip");
String key = vars.get("key");
String pass = new md5().toMD5(key+ip);
//log.info("pass="+ip);
vars.put("sign",pass);
```
### 四、发送HTTP Sampler,引用前置处理器中的变量 ${sign}
![](https://box.kancloud.cn/24ca0b7a119ea67a4990618e60115d17_956x660.jpg)
### 五、BeanShell 断言
![](https://box.kancloud.cn/b65e4f274c22b35cfdf312769e953e7d_606x710.jpg)
*参考代码*
```java
import org.json.*;
//测试国家
String test_area = "Thailand";
String country = "";
String city="";
Boolean result = false;
// 获取变量值
String ip = vars.get("ip");
// 获取返回字符串
String jsonString = prev.getResponseDataAsString();
// 将返回字符串构造为Json对象
JSONObject responseJson = new JSONObject(jsonString);
// 获取json对象中的值
try{
int code = responseJson.getInt("code");
country = responseJson.get("data").get("country").toString();
city = responseJson.get("data").get("city").toString();
}catch(Exception e){
result = true;
}
if(result){
log.error("jsonString--------->:"+jsonString);
}
// 断言
if(!country.equals(test_area) || result || city.length()==0 ){
Failure=true;
FailureMessage="Error Response:"+jsonString;
}
```
### 六、查看结果树
![](https://box.kancloud.cn/06492ce6d1018f6952f952ad6c982836_680x540.jpg)
<hr style="margin-top:100px">
:-: ![](https://box.kancloud.cn/331f659e8e6cddb0d9f182e00e32803f_258x258.jpg)
***微信扫一扫,关注“python测试开发圈”,获取更多测试开发分享!***
- 前言
- Fiddler01-抓包原理介绍与配置
- Fiddler02-菜单功能介绍
- Fiddler03-轻松玩转Fiddler
- Fiddler04-进阶使用FiddlerScript
- Fiddler05-使用FiddlerScript对微信文章互动量进行监控
- Postman01-介绍与安装
- Postman02-HTTP请求与响应
- Postman03-Collection管理与运行
- Postman04 -变量详解
- Postman05-初级脚本使用
- Postman06-实例小结篇
- JMeter01-JMeter就是这么简单
- JMeter02-一个完整实战包你学会使用JMeter
- JMeter03-在JMeter中使用BeanShell编程
- JMeter04-图形化和非图形化运行JMeter
- JMeter05-生成美观的HTML测试报告
- JMeter06-JMeter+Jenkins实战
- JMeter07-解析session与cookie