[TOC]
<br>
### Scripts 腳本介紹
在Postman中,有個叫“Sandbox”的運行環境,是一個JavaScript執行環境,所以我們可以編寫javaScript腳本來擴展我們的業務需求行為。最常用的實現包括但不限于:
- 構造動態參數
- 請求間數據傳遞
- 斷言
在Postman接口測試過程中,有兩個位置我們可以添加自己的腳本,分別是
- pre-request script
作用于請求之前,一般用于數據初始化
- test script
作用于獲得響應之后,主要用于斷言(解析響應內容,與預期值進行對比)

*注意:Collection、Folder、Request 這三個組件中都可以添加pre-request script 和 test script,只是他們的作用范圍和順序稍有不同而已*

### 通過控制臺調試腳本
這里用一個簡單的日志打印腳本語句`console.log()`,分別在Pre-request Script 和 Tests 兩個Tab下打印一句話,然后在控制臺中查看打印結果


打開控制臺

點擊"Send"發送請求后,即可在控制臺中顯示打印結果

### Script 代碼片段介紹
#### 變量操作
##### 環境變量
```javascript
// 設置環境變量
pm.environment.set("timestampsParam",new Date());
// 獲取環境變量
pm.environment.get("timestampsParam");
// 刪除環境變量
pm.environment.unset("timestampsParam");
```
##### 全局變量
```javascript
// 設置全局變量
pm.globals.set("variable_key", "variable_value");
// 獲取全局變量
pm.globals.get("variable_key");
// 刪除全局變量
pm.globals.unset("variable_key");
```
##### 變量
```javascript
// 在全局變量和活動環境中搜索變量。
pm.variables.get("variable_key");
```
##### Data 變量
Data變量,只有在Collection運行中使用,所有的Data變量會存儲在`data`對象內,假如存在變量value,則data.value可獲得當前迭代時的value變量值。
```javascript
var jsonData = JSON.parse(responseBody);
tests['Response has data value'] = jsonData.form.foo === data.value
```
#### JSON對象與字符串轉換
##### 將JSON對象(對象或數組)轉JSON字符串
```javascript
var array = [1, 2, 3, 4];
var jsonString = JSON.stringify(array)
```
##### 將JSON字符串轉JSON對象Object
```javascript
var array = "[1, 2, 3, 4]";
var jsonObject = JSON.parse(array);
```
##### XML字符串轉JSON對象Object
```javascript
var jsonObject = xml2Json(XMLString);
```
#### 請求/響應相關屬性
##### 請求屬性
**request:** 對象類型, *只讀*
```javascript
console.log("request中的form-data對象:",request.data);
console.log("request中的headers對象:",request.headers);
console.log("request中的meth字符串:",request.method);
console.log("request中的url字符串:",request.url);
```

##### 響應屬性
響應屬性,只能在Tests Script中使用
**responseBody:** 響應body的原始字符串
**responseTime:** 響應時間,毫秒
**responseCode:** 響應碼對象類型
**tests:** 檢查點對象類型,需要我們自動填充檢查點
```javascript
console.log("body字符串:",responseBody);
console.log("響應時間:",responseTime);
console.log("響應碼對象:",responseCode);
tests["響應時間小于1000毫秒"]=responseTime<1000;
console.log("檢查點對象:",tests)
```
檢查點運行結果顯示如下:

控制臺信息輸出如下:

#### 響應結果解析
Postman的請求響應信息,會保存在`pm.response`對象中。
##### 將響應內容轉成JSON對象
```javascript
pm.response.json()
```
##### 將響應內容轉成text字符串
```javascript
pm.response.text()
```
#### 發送異步HTTP請求
```javascript
pm.sendRequest("http://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
```
### 斷言
斷言(檢查點)的寫法有多種,但是實質上都是往一個叫`tests`的字典對象中填充內容,包含“檢查點名稱”與“檢查點結果”,檢查點名稱是一個描述字符串,而檢查點結果則是一個布爾值(表達式),
#### 斷言的兩種原生寫法
**方法一:**
```javascript
tests["響應時間小于1000毫秒"]=responseTime<1000; // 檢查點結果是一個表達式
```
運行后,檢查點結果在“Test Results”中顯示如下

**方法二:**
```javascript
pm.test("檢查點名稱",function(){ // 檢查點結果是一個回調函數(這個回調函數的返回值也將會是一個布爾值)
pm.expect(...);
});
```
#### 響應Body為字符串時,斷言包含特定字符串
```javascript
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
```
#### 響應Body為字符串時,斷言完全匹配特定字符串
```javascript
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
```
#### 響應Body為JSON格式時,斷言具體值
```javascript
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
```
#### 斷言響應時間
```javascript
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
```
#### 斷言響應碼
```javascript
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
```
### 全局函數 pm.* 詳解
pm對象,包含正在執行的腳本的所有信息。
- 異步發送HTTP/HTTPS請求。
pm.sendRequest:Function
```javascript
// 發送一個GET請求
pm.sendRequest('https://postman-echo.com/get?foo1=bar1&foo2=bar2', function (err, res) {
if (err) {
console.log(err);
} else {
console.log(res.text());
}
});;
// 發送一個帶參數的POST請求
const echoPostRequest = {
url: 'https://postman-echo.com/post',
method: 'POST',
header: 'headername1:value1',
body: {
mode: 'raw',
raw: JSON.stringify({ key: 'this is json' })
}
};
pm.sendRequest(echoPostRequest, function (err, res) {
console.log(err ? err : res.json());
});
```
- 判斷全局變量是否存在
pm.globals.has(variableName:String):function → Boolean
- 獲取全局變量
pm.globals.get(variableName:String):function → *
- 設置全局變量
pm.globals.set(variableName:String, variableValue:String):function
- 刪除某個全局變量
pm.globals.unset(variableName:String):function
- 清空所有全局變量
pm.globals.clear():function
- 判斷環境變量是否存在
pm.environment.has(variableName:String):function → Boolean
- 獲取環境變量
pm.environment.get(variableName:String):function → *
- 設置環境變量
pm.environment.set(variableName:String, variableValue:String):function
- 刪除某環境變量
pm.environment.unset(variableName:String):function
- 清空環境變量
pm.environment.clear():function
- 獲取某變量
pm.variables.get(variableName:String):function → *
- 返回請求url
pm.request.url:Url
- 返回請求header 列表
pm.request.headers:HeaderList
- 返回響應碼,如 200
pm.response.code:Number
- 返回響應消息,如“OK”
pm.response.reason():Function → String
- 返回響應頭headers列表
pm.response.headers:HeaderList
- 返回響應時間,毫秒
pm.response.responseTime:Number
- 返回響應Body字符串
pm.response.text():Function → String
- 返回響應Body json對象
pm.response.json():Function → Object
- 判斷是否存在某cookie
pm.cookies.has(cookieName:String):Function → Boolean
- 獲取某cookie
pm.cookies.get(cookieName:String):Function → String
- 編寫斷言
pm.test(testName:String, specFunction:Function):Function
```javascript
pm.test("response should be okay to process", function () {
pm.response.to.not.be.error;
pm.response.to.have.jsonBody('');
pm.response.to.not.have.jsonBody('error');
});
```
- 通用的斷言函數
pm.expect(assertion:*):Function → Assertion
<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