一、Postman功能簡介
Postman是由Postdot Technologies公司打造的一款功能強大的調試HTTP接口的工具。在做接口測試的時候,Postman相當於一個客戶端,它可以模擬用戶發起的各類HTTP請求,將請求數據發送至服務端,獲取對應的響應結果,從而驗證響應中的結果數據是否和預期值相匹配;並確保開發人員能夠及時處理接口中的bug,進而保證產品上線之后的穩定性和安全性。進入postman官網https://www.postman.com/downloads/
工作原理:
- 在Postman中輸入請求地址,並點擊
Send
按鈕后; - 對應的應用服務器接收到該請求,並且返回對應的響應報文;
- Postman接收到響應報文后,並通過友好的方式進行可視化的顯示在界面上。
二、常用接口測試工具以及返回數據
常用的接口測試工具有postman、jmeter
接口返回數據的格式一般有:json、html、xml
1)json格式
一般有三組數據:{"code":200,"message":"請求成功","dataMap":{"..."}}
code:返回的狀態碼
message:對返回信息或者狀態錯誤的解釋說明
dataMap:真正的返回數據
2)html格式
<html> <title></title> <body> <code>200</code> ...... </body> </html>
3)xml格式
<?xml?version="1.0"encoding="utf-8"> <code>200</code> ...... </xml>
三、接口測試協議
接口測試協議
1.webservice協議:
接口地址:http://......?wsdl
2.dubbo協議:
接口地址以dubbo://......
適用於少量數據的傳輸
3.http協議(90%):
接口地址:http://.....
http端口為: 80
https = http+ssl 安全傳輸協議 ,端口為443
市面上主要使用HTTP協議進行數據傳輸,所以我們主要學習這個協議。
什么是http協議?
http是超文本傳輸協議,主要用於瀏覽器和服務器之間傳輸數據,交互有兩個部分:請求和響應。
請求: get、post、put、delete
請求部分一般包含的內容:
1、請求行:請求方式、請求地址和協議版本
2、請求頭:HTTP協議使用HTTP頭來傳遞請求的元信息。HTTP頭是一個用冒號分隔的名稱/值對,冒號前面是HTTP頭發名稱,后面是HTTP的值,例如:
accept:application/json ---客戶端可以接收的數據格式
X-Requested-with:XMLHttpRequest --異步請求
user-agent: --客戶端的用戶
Host:--請求的主機地址
cookie:--cookie信息(請求的)
accept-encoding: gzip, deflate, br--壓縮方式
connection: keep-alive ---- 保持長鏈接
content-type: application/json;charset=UTF-8 --- 客戶端發送的數據格式
3、空行: 發送回車符和退行,通知服務器一下不再有請求頭;
4、消息體: HTTP請求中帶有查詢字符串時,如果是GET方法,查詢字符或表單數據附加值請求行中,則消息體中就沒有內容;如果是POST方法,查詢字符串或表單數據及添加在消息體中。
2xx:表示請求發送成功;
3xx:表示資源發生轉移,俗稱重定向;
4xx: 表示接口的路徑找不到,客戶端錯誤;
5xx:表示系統內部異常,一般存在接口缺陷或者請求內容不正確,服務器錯誤。
四、postman的頁面內容
主界面如下:
Params:用於在get請求傳參
Authorization:postman自帶的鑒權功能
Headers:請求頭
Body:post請求傳參
-- none:沒有參數
-- form-data:既有文件又有鍵值對
-- x-www-form-urlencoded:只傳輸鍵值對
-- raw:JSon、TXT、xml、HTML、javasripts
-- binary:把文件以二進制方式傳輸
Pre-request Script:接口請求之前的腳本,用js格式寫
Tests:斷言的代碼
響應的功能頁面:
Body:響應內容。
--Pretty 是json格式數據
--Raw 是文本格式
--Preview 是網頁格式
Cookies:響應的cookies信息
Headers:響應的頭部信息
TestResult:斷言的結果
五、發送請求與查看相應
1)GET請求
- 選擇請求方式為GET,填寫接口測試地址URL和輸入參數;
- 確認填寫無誤后,點擊Send按鈕發送請求,查看response內容;
2)POST請求
選擇請求方式為POST,采用以下幾種傳參方式進行接口測試;
(1)URI 傳參
(2)form-data 傳參
會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來說明文件類型;content-disposition,用來說明字段的一些信息
問題:
對接接口,發現對方的接口使用form-data進行數據提交,直接使用requests庫的data參數對接,會報參數錯誤:
params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } data = { 'name': name, 'phone': phone, 'idnum': idnum, 'products': [201,] } resp = requests.post(URL, data=data, params=params,verify=False, timeout=10)
執行結果:
解決方案
這一塊Requests包做的不是很好,做法具體如下:
一種是手動組建form-data並加上headers;
另一種是通過files參數傳遞form-datal;
# 方案一: params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"products\"\r\n\r\n {}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,]) headers = { "content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" } resp = requests.post(URL, data=payload, params=params, verify=False, timeout=10, headers=headers) # 方案二: import json params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } data = { 'name':(None, name), 'phone': (None, str(phone)), 'idnum': (None, idnum), 'products': (None, json.dumps([201,])) } resp = requests.post(URL, files=data, params=params, verify=False, timeout=10) print resp.status_code print resp.request.url print resp.request.body print resp.text
(3)x-www-form-urlencoded 傳參
會將表單內的數據轉換為鍵值對
(4)raw 傳參
可以上傳任意格式的文本,可以上傳text、json、xml、html等
提示:在編輯器中選擇文本並按CMD / CTRL + B可以自動美化XML / JSON內容。
(5)binary 傳參
只可以上傳二進制數據,通常用來上傳文件,由於沒有鍵值,所以,一次只能上傳一個文件。
multipart/form-data與x-www-form-urlencoded區別: multipart/form-data:既可以上傳文件等二進制數據,也可以上傳表單鍵值對,只是最后會轉化為一條信息; x-www-form-urlencoded:只能上傳鍵值對,並且鍵值對都是間隔分開的。
六、Cookies 和Code
Postman通過選項卡布局,用於在構建器中發送和管理API請求。上半部分是請求構建器,下半部分是響應查看器。
Cookies——管理cookie模式是通過點擊cookie鏈接訪問的。該特性允許你管理與請求相關的cookie。
Code——生成的代碼片段模式通過保存按鈕下面的最右邊的Code鏈接。該特性允許你生成與請求相關的代碼片段,該請求支持20多種語言(http、java、go等語言)
(一)cookie鑒權的原理:
當客戶端第一次訪問服務器時,服務器就會生成cookie,並且把生成的cookie信息放到響應頭的set-cookie字段里面,然后發送給客戶端,客戶端接收到cookie之后就會保存起來,然后在2-N次請求服務器的時候自動的帶上cookie信息實現鑒權。
(二)cookie分類
會話cookie:保存在內存中,當瀏覽器關閉之后會自動消失
持久化cookie:保存在硬盤中,瀏覽器關閉后不會消失只有當持久化的時間到期了才會消失。
name:cookie的名稱
value:cookie的值
domain:cookie作為的ip地址
path:cookie所在的服務器上面的項目路徑
exprise:失效時間
七、環境變量和全局變量
(1)環境變量和全局變量
在企業當中,一般有開發環境、測試環境和線上環境,有一些企業也會有預發布環境,我們在做接口測試的時候會發現,這些環境中接口的地址除了ip地址不一樣,其他的地方都是一樣的,我們在實際測試中,不可能每個環境都寫一套測試邏輯,這個時候就需要使用到環境變量,環境變量為全局變量。
注意:當全局變量和環境變量的名稱一致時,環境變量的權限比較大。
將接口地址中的IP地址參數化格式為{{ip}},試着運行一次
(2)postman動態參數
一)postman內置動態參數
{{}}中加"$"代表示動態參數,不加"$"表示是全局變量或者是環境變量
{{$timestamp}} 生成當前的時間戳
{{$randomint}} 生成0-1000的隨機數
{{$guid}} 生成隨機的guid的字符串
二)自定義動態參數
也可以在Pre-request Script(發送請求之前)里面定義動態參數
//請求之前 自定義一個時間戳 var now_time = Date.now(); pm.globals.set("now_time",now_time)
八、接口關聯
在實際工作中,有一些變量的值是動態變化的,並且下一個接口請求的時候需要傳入該參數的值,比如token。
我們需要先在上一個接口的響應中獲取token的值,並將該值設置為全局變量,再在下一個接口中使用參數化的形式將該值傳入,即可實現了接口的關聯。
1、接口關聯方法一:json提取器
//把responseBody轉為json字符串 var jsvalue = JSON.parse(responseBody); //將jsvalue的值打印到控制台上 console.log(jsvalue) // 提取token的值,並保存到全局變量 pm.globals.set("token", jsvalue.token); 復制代碼
2、接口關聯方法二:正則表達式提取器
{ "tag":{ "id":100, "name":"張三" } }
假如響應數據的內容如上,我們現在要提取100,則在Tests中使用正則表達式提取的規則為 responseBody.match(new RegExp('"id":(.+?),')),這個方法表示匹配"id":后面且,之前的內容,如果將該結果打印到控制台,為一個數組:[" "id":100,","100"],若只取到100,則需要再加上索引
//通過正則表達式提取 var value = responseBody.match(new RegExp('"timestamp":(.+?),'))[1]; console.log(value );
3、接口關聯方法二:cookie提取器
如下圖所示,我們需要提取響應結果Cookies中的值,並將結果打印到控制台上。
方法如下:
//提取Cookies中SERVERID中的Value值並保存在cookies_serverid變量中 var cookies_serverid = postman.getResponseCookie('SERVERID').value //將變量cookies_serverid中的值打印到控制台 console.log(cookies_serverid)
4、接口關聯方法三:hearder信息提取
//獲取響應headers的值,需要從響應頭取值 var Content_Type = postman.getResponseHeader('Content-Type'); console.log(Content_Type)
九、調試和日志
Postman控制台類似於瀏覽器的開發者控制台,不同之處在於它針對API開發進行了調整。如果API或API測試沒有按照我們期望的那樣進行,那么Postman控制台將是我們進行調試的得力工具。只要Postman控制台窗口處於打開狀態,所有的API活動都將記錄在此處,我們可以通過這里查看底層發生了什么。
Postman控制台會記錄以下信息:
- 發送的實際請求,包括所有底層請求頭和變量值等;
- 服務器返回的最原始的響應報文,這里輸出的響應報文是沒有被Postman處理的響應報文;
- 用於請求的代理配置和證書;
- 測試腳本或預先請求腳本的錯誤日志;
- 使用console.log()輸出的內容。
在腳本中使用consolle.info()或console.warn()將有助於確認執行的代碼行。這個使用方法和JavaScript中的console.log()類似
在應用程序菜單中前往View,然后單擊“Show Postman Console”或使用鍵盤快捷鍵(CMD / CTRL + ALT + C)。每個調用及其標頭和有效負載都將記錄到Postman控制台。
十、斷言
要想完整的實現接口測試,自然是少不了斷言的,在postman中,斷言的內容寫在Tests中,
關於postman語法https://www.cnblogs.com/ldzcy/articles/15736974.html
系統提供了八種斷言方式:
八種斷言方式:
//1、返回的狀態碼為200 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); //2、返回的結果中包含一個指定的字符串 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); //3、對返回結果做json字段檢查 pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); //4、斷言返回的結果等於一個字符串 pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); //5、斷言響應頭中包含有指定的響應頭 pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); //6、斷言接口請求的時間少於200ms pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); //7、斷言一個post請求返回的狀態碼是否在指定的范圍之間 pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201, 202]); }); //8、斷言返回的狀態碼信息中包含指定的字符串 pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); });
十一、導入和導出
1)Colltions測試數據包導出導入
- 導出
選擇要導出的數據包,點擊Export;
- 導入
點擊Import按鈕,選擇要導入的文件;
2)工作環境
選擇Settings->data,在Export data下點擊Download導出工作環境,在Import data下點擊選擇文件導入工作環境
十二、批量執行測試用例
1)在進行批量運行的時候 ,使用的數據驅動為csv或者是json csv文件的編碼必須是utf-8
2)在請求參數里面取數據和取全局變量的方法一直({{變量名稱}}),在斷言里面取數據文件的值使用:data["變量名稱"]
參考: