[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测试开发圈”,获取更多测试开发分享!***
- 前言
- 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