[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 中賦值。

設置全局變量 key,這個key是約定好的簽名秘鑰,在簽名時使用。

### 參數初始化 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;
```
這里沒有新的知識點,只需回顧一下前面章節即可掌握。
### 實驗結果

根據本實例設置好后,我們可以任意修改ip的值,至于sign的值,我們就不需要去理會了,它總會生成正確的簽名值。
<hr style="margin-top:100px">
:-: 
***微信掃一掃,關注“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