企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
>[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测试开发圈”,获取更多测试开发分享!***