Postman測試沙箱其實是結合JS指令碼和內建斷言函式,來完成測試中的斷言功能,在請求發起前後實現部分測試操作。
常用功能:
- 請求前指令碼(pre-request scripts)設定請求前置操作如設定變吊等。
- 請求後指令碼(tests)對狀態碼、響應頭、響應正文等資訊進行斷言操作。
1、Pre-request Script介紹
Pre-request Script
是請求傳送之前需要執行的程式碼片段。
提示:在一個請求或者一個集合都可以定義
Pre-request Script
,在集合中定義Pre-request Script
,表示集合中的每一個請求傳送前,都需要執行Pre-request Script
中的js指令碼。
作用或者需求:準備資料。
- 請求引數中包含一個隨機數。
- 請求header中包括一個時間戳。
- 請求引數需要加密。
等等。
點選請求中的Pre-request Script
標籤項,如下圖:
我們可以在上圖看到,在Pre-request Script
標籤頁的右側邊欄中,Postman為我們提供了一些常用的程式碼模版。
提示我們:
Pre-request scripts are written in JavaScript.
and are run before the request is sent.
請求前指令碼是用JavaScript編寫的。
並在傳送請求之前執行。
Learn more about pre-request scripts。
點選這裡,可以學習更多關於pre-request scripts的資料。
學習關於
pre-request scripts
的更多用法,點選下面連結:https://learning.postman.com/docs/postman/scripts/pre_request_scripts/
2、常用SNIPPETS(片段)說明
(1)獲取變數指令碼:
Get an environment variable
// 獲取一個環境變數 // 1.pm表示postman // 2.environment表示環境變數 // 3.get表示獲取 pm.environment.get("variable_key");
Get a global variable
// 獲取一個全域性變數 pm.globals.get("variable_key");
Get a variable
// 獲取一個變數(本地) pm.variables.get("variable_key");
- 獲取集合變數的指令碼
var collectionVariable = pm.collectionVariables.get("variable_key");
- 獲取資料變數的指令碼
var iterationData = pm.iterationData.get("variable_key");
(2)設定變數指令碼:
Set an environment variable
// 設定一個環境變數 // 1.pm表示postman // 2.environment表示環境變數 // 3.set表示設定 pm.environment.set("variable_key", "variable_value");
Set a global variable
// 設定一個全域性變數 pm.globals.set("variable_key", "variable_value");
- 設定一個變數(本地)
pm.variables.set("variable_key", "variable_value");
- 設定一個集合變數
pm.collectionVariables.set("variable_key", "variable_value");
- 設定一個資料變數
pm.iterationData.set("variable_key", "variable_value");
(3)清空變數指令碼:
Clear an environment variable
// 清空一個環境變數 // 1.pm表示postman // 2.environment表示環境變數 // 3.unset表示清空 pm.environment.unset("variable_key");
Clear a global variable
// 清空一個全域性變數 pm.globals.unset("variable_key");
- 其他的變數同理。
(4)Send a request程式碼片段
Postman提供了一個“Send a request”程式碼段,他是已經封裝好的傳送請求的方法
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
// 其中,https://postman-echo.com/get表示要傳送的請求。
// function中的err表示請求返回的錯誤資訊,response表示響應內容。
// console.log()是postman封裝的檢視日誌的方法,可以調出postman的console控制檯來檢視程式碼執行情況,方便除錯。
注意:該程式碼段預設只能傳送get請求,且這樣直接使用的話無法指定請求頭等資訊,當然大部分情況下我們不需要單獨指定一些請求資訊,Postman可以自動幫我們完成準備工作。
示例:在Pre-request Script
中自定義傳送一個Post請求
// Pre-request Script 中的js程式碼
// 定義請求資料體
var data = {
"userName":"admin",
"password":"123456"
}
// 從環境變數中獲取token請求服務地址
var ip = pm.environment.get("ip");
var port = pm.environment.get("port");
// 定義請求
const loginRequest = {
//url: 'http://'+ ip+':'+ port +'/login',
url: 'http://httpbin.org/post',
method: 'POST',
header: ['Content-Type:application/json', 'token:123456'],
body: {
mode: 'raw',
raw: JSON.stringify(data)
}
};
// 傳送請求
pm.sendRequest(loginRequest, function (err, response) {
console.log(response.json());
});
程式碼說明:
const
:是js中用來定義變數的關鍵字,由const定義的變數不可以修改,而且必須初始化。url
:表示要傳送的請求url。method
:指定請求方法。header
:定製請求頭資訊(很重要,因為你要傳json格式的資料的話,需要在這裡定義請求頭為Content-Type:application/json
)。body
:表示請求body中攜帶的引數。JSON.stringify()
方法是將一個JavaScript值(物件或者陣列)轉換為一個JSON字串。- 定義好
const
變數後再由sendRequest()
來傳送請求即可。 - header的寫法可以是:
// 一條頭資訊 header: 'Content-Type:application/json', // 多條頭資訊 // 形式一 header:[ {"key1":"XXX","value1":"XXX"}, {"key2":"XXX","value2":"XXX"} ] // 形式二 header:[ 'key1:XXX', 'key2:XXX' ]
(5)總結:
對於Postman中的變數管理,我們最好手動管理,也就是自己手動設定環境變數和全域性變數,最好不用指令碼來管理Postman中的變數。
3、示例1
我們以“新增學院”介面為例,如下圖:
我們可以在Pre-request Script
進行提交資料的準備。
編寫如下JavaScript程式碼:
// 隨機生成一個3位數字的id
var dep_id = Math.floor(Math.random()*1000);
pm.environment.set("depid" , dep_id); //設定到環境變數中
// 隨機生成學院名稱dep_name
// 隨機生成一個10位的字串
var data = Math.random().toString(36).slice(-10) ;
var dep_name = data+"學院";
pm.environment.set("dep_name" , dep_name);//設定到環境變數中
// 隨機生成院長的名字
var first_name = ["趙","錢","孫","李","劉"];
var last_name = ["子鼠","丑牛","寅虎","牟兔","辰龍","巳蛇"];
var master_name = first_name[Math.floor(Math.random() * (first_name.length))] +last_name[Math.floor(Math.random() * (last_name.length))];
pm.environment.set("master_name" , master_name);//設定到環境變數中
// 隨機生成口號
var slogan_str = ["吃飯","睡覺","打豆豆"];
var slogan = slogan_str[Math.floor(Math.random() * (slogan_str.length))];
pm.environment.set("slogan" , slogan);//設定到環境變數中
//程式碼很low,就是演示。
然後填寫Post請求,以Json格式資料為例,引數中引用Pre-request Script
指令碼中新增到環境變數中的變數。
這樣就能夠完成自動生成資料,來完成介面的測試。
提示:
我們在實際工作中,不用這種方式準備資料,上面的例子只是說明Pre-request Script
的作用。
在實際工作中,我們使用引數化來批量準備資料。
在介面測試中,有些引數是需要自動生成的,且這些引數並不參與邏輯關係。
比如說時間戳,並不會參與介面中的邏輯關係,只起到校驗的作用。我們提交的時間戳引數,要和伺服器的時間戳進行對比,比如我們上傳的時間戳和伺服器的時間戳不能超過5秒鐘,如果超過5秒則不能請求成功。
所以我們需要在Pre-request Script
中把時間戳生成,然後儲存到環境變數中,最後再提交的引數中獲取到環境變數中的剛剛儲存的時間戳資料。(就如同上面步驟)
// js獲取當前時間戳
// 第一種方法:(這種方法只精確到秒)
var timestamp = Date.parse(new Date()); //1613702922000
// 第二種方法:
var timestamp = (new Date()).valueOf(); //1613702956959
// 第三種方法:(推薦)
var timestamp = new Date().getTime(); //1613703043378
pm.environment.set("timestamp" , timestamp);//設定到環境變數中
請求頭中所需要的資料也是一樣的操作。
還有一點要提示的,如果在傳送請求之後,提示js程式碼有錯誤,可以點選Postman下邊框的
Console
控制檯,來檢視錯誤的詳細資訊。
4、示例2
同理,我們也可以在Body中使用其他的資料提交格式,來接收使用Pre-request Script
定義在環境變數中的資料。
如下圖: