🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] <br> ### 本节目标 在日常测试中,我们经常会遇到一些接口中,需要传入一个经过`某种加密方式`的字段作为签名,来保证这个请求是合法的。 在本节知识点,一方面来巩固前面章节学习的知识;一方面掌握使用Postman内置的加密模块进行md5加密。真真正正的在实际工作中运用起来。 ### 需求说明 假设需要测试某接口,需要传入ip参数和签名sign参数,服务端根据ip返回对应的国家和城市信息。 **接口文档** 请求方法:GET 接口地址:http://xx.xx.xx.xx:8000/mock/location/ | 参数| 必须| 描述| |-----|-----|------| | ip | 是 | ip地址| | sign| 是 | 签名,签名规则:md5(key+ip),其中key=“Milton_PTQA”| 请求示例:http://xx.xx.xx.xx:8000/mock/location/?ip=171.96.0.127&sign=e23c21efbd7c388f62155b4aa09e1a75 **响应结果** 签名通过时,返回如下: ```python { "code": 1, "msg": "success", "data": { "country": "Thailand", "countryCode": "TH", "city": "Bankok", "ipaddress": "171.96.0.127" } } ``` 签名不通过时,返回如下: ```python { "code": 0, "msg": "sign error", "data": [] } ``` 要知道,我们对这个接口测试,不可能只用一个ip来测试,假如我们对ip参数化,当ip改变时,sign值必须要重新签名,否则会校验不通过。 本实例实现: - 在Pre-request Script 中通过js脚本自动重新签名 在实际自动化测试中,ip会进行参数化,这里就不参数化了,主要逻辑并不影响。 - 在Tests Script 中设置断言 ### 创建 Request Builder 在URL参数sign的值中,引用变量`{{sign}}`,这个变量会在下面的Pre-request 中赋值。 ![](https://box.kancloud.cn/4edfad69c0f8a46e2f171b2ac4235408_1081x200.jpg) 设置全局变量 key,这个key是约定好的签名秘钥,在签名时使用。 ![](https://box.kancloud.cn/fe868e496d6b39697e9d7c40b4f7efa7_711x259.jpg) ### 参数初始化 Pre-request Script 请求发送前,需获取请求中的ip,获取全局变量中的key,然后通过md5(key+ip)计算出签名,并将结果设置到全局变量中。这样,在发送请求时,即可替换掉对应的sign变量引用。 在Pre-request Script 标签Tab下,编写脚本如下: ```javascript // 获取GET参数对象object queryObj=pm.request.url.query; // 获取URL中的参数 var ip = queryObj.get("ip"); // 获取全局变量 var key = pm.globals.get("key"); // 根据加密规则,拼装加密前字符串 var str=key+ip; // 调用CryptoJS模块的MD5方法,对字符串进行md5加密 var sign = CryptoJS.MD5(str).toString(); // 将签名值添加到全局变量中,便于在参数中引用 pm.globals.set("sign",sign); ``` 这里有个新的知识点,引用了`CryptoJS`模块提供的MD5方法,进行md5加密。 在Postman 脚本中,有一些常用的库,可以帮助我们便捷实现某种功能。 例如这里的“CryptoJS”库,它提供了标准和安全的加密算法,支持的算法有:AES, DES, EvpKDF, HMAC-MD5, HMAC-SHA1/3/256/512, MD5, PBKDF2, Rabbit, SHA1/3/224/256/512, TripleDES 更多常用库知识,可以通过官方文档了解更多,这里就不详细介绍了。 [https://www.getpostman.com/docs/v6/postman/scripts/postman_sandbox](https://www.getpostman.com/docs/v6/postman/scripts/postman_sandbox) ### 断言 Tests Script 在Tests标签Tab下,编写脚本如下: ```javascript // 将响应内容JSON字符串转换成JSON对象 var respObj=JSON.parse(responseBody); // 从JSON对象中获取国家编号 var countryCode = respObj["data"]["countryCode"]; // 从JSON对象中获取城市名称 var city = respObj["data"]["city"]; // 开始断言.... //tests["响应码为200"]=responseCode.code===200; pm.test("响应码为200",function(){ pm.expect(responseCode.code).to.eql(200); }); tests["根据IP成功查询到国家:"+countryCode]=countryCode.length>0; tests["根据IP成功查询到城市:"+city]=city.length>0; ``` 这里没有新的知识点,只需回顾一下前面章节即可掌握。 ### 实验结果 ![](https://box.kancloud.cn/b9eb098e07a67618effa493cbd94af4e_1057x493.jpg) 根据本实例设置好后,我们可以任意修改ip的值,至于sign的值,我们就不需要去理会了,它总会生成正确的签名值。 <hr style="margin-top:100px"> :-: ![](https://box.kancloud.cn/331f659e8e6cddb0d9f182e00e32803f_258x258.jpg) ***微信扫一扫,关注“python测试开发圈”,获取更多测试开发分享!***