postman–接口測試工具
postman是一款支持http協議的接口調試與測試工具,其主要特點就是功能強大,使用簡單且易用性好 。
無論是開發人員進行接口調試,還是測試人員做接口測試,postman都是我們的首選工具之一 。
下面先通過一張圖來直觀的來看下postman中所包含的功能 。
?當然,以上功能也只是展示了postman的一部分功能,為了能更加全面的體現這款工具的特點,我將從以下三個維度來加以說明。它們分別是:
基礎功能:1.常見類型的接口請求 2.接口響應數據的解析 3.接口管理(Collection) 4.批量執行接口請求 5.日志調試6.斷言7.變量8.請求前置腳本9、接口關聯10.常見的返回值獲取
便捷功能快:1、速填寫查詢參數2、快速填寫請求頭信息3、快速實現添加一個請求4、如何繼承集合認證5、批量斷言6、快速查詢和替換
高級功能:1、讀取文件進行參數化2、生成測試報告3、代碼中發送請求4、編寫接口文檔5、mock服務監控6、使用工作空間7、代碼同步與分支管理8、連接數據庫9、apis
一、postman安裝說明:
1、下載與安裝
postman安裝步驟:
1.訪問postman官方網站,下載最新版本
訪問地址: https://www.getpostman.com/
2.進入到下載頁面,根據自己電腦下載對應的版本
3.雙擊下載的安裝包,進入到安裝界面,直到用戶登錄和注冊界面。
若個人使用,選擇跳過即可,這時會進入到postman主界面,至此postman安裝成功(下圖)。
若團隊使用,可以進行注冊,注冊后使用賬號可以加入團隊工作區
2 界面導航說明
?初次使用postman的朋友可能對界面上的一些元素不太熟悉,下面就通過一張圖來說明這些元素的含義。
3、發送第一個請求
?如果你是第一次使用postman發送請求,下面這個例子可以作為一個最基本的入門,可以幫我們建立一個初始印象。
1.打開postman,點擊+加號打開一個新的請求頁。
2.在請求的URL中輸入請求地址:
http://www.weather.com.cn/data/sk/101010100.html
3.點擊Send按鈕,這時就可以在下部的窗格中看到來自服務器的json響應數據。
這里補充:2023.10月安裝!!!
1 打開官網下載:Postman API Platform
2 下載
3 打開安裝包進行安裝
1、下載到電腦之后直接雙擊安裝軟件,postman會自動安裝
?
2、第一次打開會要求登錄賬號密碼,如果沒有,直接關閉,重新打開會自動進入下圖這樣子無需賬號密碼登錄的界面。
此時自動啟動postman,并在桌面創建快捷方式?
postman賬號可以通過輸入電子郵件、用戶名和密碼或使用Google賬戶進行注冊;
postman登錄賬號后,會自動同步和備份軟件數據,可以從不同的設備上訪問同一個賬號的數據,還可以在同一個項目上與其他人協作。?
登錄成功界面如下:
?二.postman?修改文件安裝路徑
1 找到Postman的安裝文件
桌面右鍵單擊postman快捷方式——屬性——打開文件所在位置
在Postman的安裝過程中是不可以修改安裝路徑的,其默認安裝路徑是:C:\Users\admin\AppData\Local
2.更改Postman的文件路徑
Postman安裝時,無法修改/自定義安裝路徑,但安裝好后,可手動將其安裝文件移–>到您想放置的盤中。
方法如下:
Postman默認安裝路徑:C:\Users\smxsh\AppData\Local\Postman)
將其文件夾直接剪切到合適的位置既可。這里我復制到:D:\Software? ? 再刪除原來的快捷方式
3.快捷方式修改
?
?三.postman基礎功能
1.常見類型的接口請求
常見的接口有如下四種類型,分別是含有查詢參數的接口,表單類型的接口,json類型的接口以及含有上傳文件的接口,以下就對這四種類型接口及如何在postman中請求進行說明。
1.1 .查詢參數的接口請求
什么是查詢參數?
所謂的查詢參數,其實就是URL地址中問號(?)后面的部分就叫查詢參數
比如: http: //cx.shouji.360.cn/phonearea.php?number=13012345678。在這個接口中,查詢參數就是:number=13012345678。
而這―部分是由有鍵值對組成,格式為∶key1=value1&key2=value2,如果有多組鍵值對,要用&隔開
postman如何請求
在postman中實現對這類接口請求非常簡單,一般就需要明確兩個參數即可,一個是請求方法,一個請求地址。
針對上面的那個接口,地址已經給出,而它的請求方法是get 。那么在postman中只需要把這倆個參數填寫上即可請求。
具體實現步驟︰
1.打開postman,新建一個請求。
2.在請求方法中選擇請求方法:GET,因為在postman中默認的請求方法就是GET,所以這一步可以忽略
3.接口URL中輸入地址,點擊Send按鈕就可以發送請求了。
說明:查詢參數的URL一般直接拷貝到輸入的URL地址欄中就可以了,當然也可以把查詢參數在Params中輸入,兩者的效果是一樣的。
1.2 表單類型的接口請求
什么是表單?
我們都知道,在發送HTTP請求的時候,一個請求中一般包含三個部分,分別是請求行,請求頭,請求體。
不同的接口,請求體的數據類型是不一樣的,比較常見的一種就是表單類型,那么什么是表單類型呢?簡單理解就是在請求頭中查看Conte nt-Type
它的值如果是:a pplication/x- www-formurlencoded.
那么就說明客戶端提交的數據是以表單形式提交的。見下圖:
postman中如何請求?
如果在postman請求上圖的接口,我們只需要填寫四個參數,分別是(可以參考上圖):
- 請求方法:POST
- 請求URL: http://localhost/index.php?m=Home&c=User&a=do_login&t=0.21942974229794432
- 請求頭:Content-Type: application/x-www-form-urlencode
- 請求體:username=13088888888&password=123456&verify_code=8888
實現步驟:
1.打開postman,新建一個請求。
2.在請求中設置以上四個參數,點擊Send按鈕。在postman中設置請求體類型為,需要選擇body-> x-www-form-urlencoded
3.查看響應數據。
?1.3上傳文件的表單請求
在做接口測試時,我們經常會遇到需要上傳文件的接口,比如微信的更新頭像。這就需要用到: multipart/form-data。它也屬于一種表單,但它既支持表單請求,也支持文件上傳。它的請求報文中數據往往是下面這樣的。
- POST http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html HTTP/1.1
- Content-Type: multipart/form-data
-
- file=a1.jpg
這種類型的接口,在postman中該如何請求呢 ?我們先分析需要填寫的參數 。
-
請求方法:POST
-
請求URL:http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html
-
請求類型:multipart/form-data
-
請求體:file=a1.jpg
實現步驟:
-
打開postman,新建一個請求 。
-
在請求中設置以上四個參數,點擊Send按鈕。注意:在postman中設置請求體類型,需要選擇body-> form-data 。file中要選擇File類型,然后上傳本地的文件 。
-
查看響應數據。
1.4 json類型的接口請求
這應該是接口測試中最常見的一種情況了,也就是請求體類型為json,我們來看下這個請求報文。
- POST http://xxx/api/sys/login HTTP/1.1
- Content-Type: application/json;charset=UTF-8
-
- {"account":"root","password":"123456"}
根據以上報文,我們可以分析出,我們在postman只需要填寫四個參數即可,具體如下:
-
請求方法:POST
-
請求地址:http://xxx/api/sys/login
-
請求體類型:json
-
請求體數據:{"account":"root","password":"123456"}
實現步驟:
-
打開postman,新建一個請求 。
-
在請求中設置以上四個參數,點擊Send按鈕。注意:在postman中設置請求體類型,需要選擇body-> raw -JSON
-
查看響應數據。
2.接口響應數據解析
響應數據是發送請求后經過服務器處理后返回的結果,響應由三部分組成,分別是狀態行、響應頭、響應體。我們來看下postman的響應數據展示。
?在postman中的響應數據展示:
-
狀態行:Status:200 OK
-
響應頭:Headers + Cookies,需要注意的是Cookies是包含在響應頭中的,但是為了明顯,工具會分開顯示
-
響應體:Body
那么這些數據對我們做接口測試有什么作用呢 ?
-
Body和Status是我們做接口測試的重點,一般來說我們都會驗證響應體中的數據和響應狀態碼
-
Test Results 是我們編寫斷言后,可以查看斷言的執行結果 ,所以這個對我們也很有用 。
-
Time 和Size 是我們做性能測試時,可以根據這兩個參數來對所測接口的性能做一個簡單的判斷。
接下來我們再來關注下Body中的幾個顯示主題,分別是:Pretty,Raw,Preview .
Pretty:翻譯成中文就是漂亮 , 也就是說返回的Body數據在這個標簽中查看 ,都是經過格式化的,格式化后的數據看起來更加直觀,所以postman默認展示的也是這個選項。比如返回html頁面,它會經過格式化成HTML格式后展示,比如返回json,那么也會格式化成json格式展示 。
Raw:翻譯成中文未經過加工的,也就是原始數據 ,原始數據一般都是本文格式的,未經過格式化處理的,一般在抓包工具中都有這個選項 。
Preview:翻譯成中文就是預覽,這個選項一般對返回HTML的頁面效果特別明顯,如請求百度后返回結果,點擊這個選項后就直接能查看到的頁面 ,如下圖 。同時這個選項和瀏覽器抓包中的Preview也是一樣的 。
3. 接口管理(Collection)
當我們對一個或多個系統中的很多用例進行維護時,首先想到的就是對用例進行分類管理,同時還希望對這批用例做回歸測試 。在postman也提供了這樣一個功能,就是Collection 。通過這個Collection就可以滿足我們的上面說的需求。
先對Collection功能的使用場景做個簡單總結 。
-
用例分類管理,方便后期維護
-
可以進行批量用例回歸測試 。
那么Collection是如何去管理用例的呢 ?先想象我們要測試一個系統,系統下有多個模塊,每個模塊下有很多的被測接口用例 。那么基于這個場景,我們來通過Collection來進行實現:
1. 點擊Collection,點擊+New Collection,在彈出的輸入框中輸入Collection名稱(這個就可以理解為所測試的系統)
2. 選中新建的Collection右鍵,點擊Add Folder ,在彈出對話框中輸入文件夾名稱(這個就可以理解為系統中的模塊)
3. 選中新建的Folder,點擊Add Request ,在彈出的對話框中輸入請求名稱,這個就是我們所測試的接口,也可以理解為測試用例 。
那么通過以上三個步驟,達到的效果就是如圖所示:
總結,通過上面的操作,我們實現了一個最簡單的demo模型。但實際上,有了這個功能才是postman學習的開始,因為很多功能都是基礎這個功能的基礎上進行的,比如用例的批量執行,Mock ,接口文檔等功能 。
4. 批量執行接口請求
當我們在一個Collection中編寫了很多的接口測試用例,想一起執行這批用例,在postman中是如何操作呢 ?
實現步驟:
1. 選中一個Collection,點擊右三角,在彈出的界面點擊RUN
2. 這是會彈出一個叫Collection Runner的界面,默認會把Collection中的所有用例選中 。
3. 點擊界面下方的RUN Collection,就會對Collection中選中的所有測試用例運行 。
對上面的幾個紅框內的功能進行簡單說明:
-
斷言統計:左上角的兩個0是統計當前Collection中斷言成功的執行數和失敗的執行數,如果沒有編寫斷言默認都為0 。
-
Run Summary: 運行結果總覽,點擊它可以看到每個請求中具體的測試斷言詳細信息 。Export Result:導出運行結果,默認導出的結果json文件 。
-
Retry: 重新運行,點擊它會把該Collection重新運行一遍
-
New:返回到Runner,可以重新選擇用例的組合 。
總體來說,這個功能主要是用于對一個Collection中的所有用例或部分用例進行批量運行,已達到手工回歸測試的目的。
5.日志調試
在做接口測試時,經常會因為代碼寫的有問題導致報錯,這時通過查看日志就顯得非常重要了,postman也提供了這樣的功能,它允許我們在腳本中編寫打印語句,查看打印的結果 ; 同時也可以查看每個請求的日志信息 。
在postman中編寫日志打印語句使用的是JavaScript,編寫的位置可以是Pre-request Script 或Tests標簽中。編寫打印語句如:console.log("我是一條日志")
那么打印的日如何看呢 ?在postman中有倆個入口,第一個入口就是:view-show postman console 。
第二個入口就是左下角第三個圖標 。
打開的日志界面:
這里面有幾個比較實用的功能:
-
搜索日志:輸入URL或者打印的日志就能直接搜索出我們想要的請求和日志,這對我們在眾多日志中查找某一條日志是非常方便的 。
-
按級別搜索:可以查詢log,info,warning,error級別的日志 ,有助于我們更快定位到錯誤 。
-
查看原始報文(Show raw log):如果習慣看原始請求報文的話,這個功能可能更方便些 。
-
隱藏請求(Hide network):把請求都隱藏掉,只查看輸出日志 。
總之,通過這個功能,我們在請求接口報錯時,通過打印響應的日志,就能很輕松的找到問題原因了 。
6.斷言
如果沒有斷言,我們只能做接口的功能測試,但有了斷言后,就為我們做自動化提供了條件,并且在postman中的斷言是非常方便和強大的 。
我們先來了解下postman斷言的一些特點 ,具體如下
-
斷言編寫位置:Tests標簽
-
斷言所用語言:JavaScript
-
斷言執行順序:在響應體數據返回后執行 。
-
斷言執行結果查看:Test Results
在上面我們介紹到,編寫的斷言代碼是JavaScript,那如果不會寫怎么辦 ?不用擔心,因為postman已經給我們內置了一些常用的斷言 。用的時候,只需從右側點擊其中一個斷言,就會在文本框中自動生成對應斷言代碼塊 。
接下來就讓我們了解一些常用斷言,還是按響應的組成來劃分,分別是狀態行,響應頭,響應體。
狀態行中又包括狀態碼,狀態消息 。在postman也可以對這兩個進行斷言
狀態行中的斷言:?
-
斷言狀態碼:Status code: code is 200
- pm.test("Status code is 200", function () {
- pm.response.to.have.status(200); //這里填寫的200是預期結果,實際結果是請求返回結果
- });
-
斷言狀態消息:Status code:code name has string
- pm.test("Status?code?name?has?string",?function?()?{??
- pm.response.to.have.status("OK");?//斷言響應狀態消息包含OK??
- });
響應頭中的斷言
-
斷言響應頭中包含:Response headers:Content-Type header check
- pm.test("Content-Type?is?present",?function?()?{??
- pm.response.to.have.header("Content-Type");?//斷言響應頭存在"Content-Type"??
- });
斷言響應體(重點)
-
斷言響應體中包含XXX字符串:Response body:Contains string
- pm.test("Body?matches?string",?function?()?{??
- pm.expect(pm.response.text()).to.include("string_you_want_to_search");??
- });??
- //注解??
- pm.expect(pm.response.text()).to.include("string")?獲取響應文本中包含string
-
斷言響應體等于XXX字符串:Response body : is equal to a string
- pm.test("Body?is?correct",?function?()?{??
- pm.response.to.have.body("response_body_string");??
- });??
- //注解??
- pm.response.to.have.body("response_body_string");?獲取響應體等于response_body_string
-
斷言響應體(json)中某個鍵名對應的值:Response body : JSON value check
- pm.test("Your?test?name",?function?()?{??
- var?jsonData?=?pm.response.json();??
- pm.expect(jsonData.value).to.eql(100);??
- });??
- //注解??
- var?jsonData = pm.response.json()?獲取響應體,以json顯示,賦值給jsonData .注意:該響應體必須返會是的json,否則會報錯??
- pm.expect(jsonData.value).to.eql(100)?獲取jsonData中鍵名為value的值,然后和100進行比較
響應時間(一般用于性能測試)
-
斷言響應時間:Response time is less than 200ms
- pm.test("Response?time?is?less?than?200ms",?function?()?{??
- pm.expect(pm.response.responseTime).to.be.below(200);?//斷言響應時間<200ms??
- });
案例說明:
針對以下接口返回的數據進行斷言:
- {??
- "cityid":?"101120101",??
- "city":?"濟南",??
- "update_time":?"2020-04-17?10:50",??
- "wea":?"晴",??
- "wea_img":?"qing",??
- "tem":?"16",??
- "tem_day":?"20",??
- "tem_night":?"9",??
- "win":?"東北風",??
- "win_speed":?"3級",??
- "win_meter":?"小于12km/h",??
- "air":?"113"??
- }
-
斷言響應狀態碼為200
-
斷言city等于濟南
-
斷言update_time包含2020-04-17
總結,整體來說,如果用postman做接口測試,這個斷言功能必不可少,其中我們常斷言的響應體包含和JSON這倆個斷言又是重重之重。
7. 變量(全局/集合/環境)
變量可以使我們在請求或腳本中存儲和重復使用其值,通過將值保存在變量中,可以在集合,環境或請求中引用。
對我們做接口測試來說,又是一個非常重要的功能 。
在postman常用的三種變量分別是全局變量,環境變量,集合變量 。
-
全局變量:一旦申明了全局變量,全局有效,也就是說postman中的任何集合,任何請求中都可以使用這個變量。它的作用域是最大的 。
-
環境變量:要申明環境變量,首先的創建環境,然后在環境中才能創建變量 。如果要想使用環境變量,必須先選擇(導入)這個環境,這樣就可以使用這個環境下的變量了 。需要說明的是環境也可以創建多個 。每個環境下又可以有多個變量 。
-
集合變量:集合變量是針對集合的,也就是說申明的變量必須基于某個集合,它的使用范圍也只是針對這個集合有效 。
其中,他們的作用域范圍依次從大到小:全局變量>集合變量>環境變量 。當在幾個不同的范圍內都申明了相同的變量時,則會優先使用范圍最小的變量使。
想要使用變量中的值只需倆個步驟,分別是定義變量和獲取變量 。
-
定義變量(設置變量)
-
獲取變量(訪問變量)
定義變量
定義全局變量和環境變量,點擊右上角的小齒輪,彈出如下界面,就可以根據需求定義全局變量或者環境變量了。
已經定義的全局變量和環境變量,可以進行快速查看:
定義集合變量
選擇一個集合,打開查看更多動作(...)菜單,然后點擊編輯 。選擇“變量”選項卡以編輯或添加到集合變量。
定義變量除了以上方式,還有另外一種方式 。但是這種方式在不同的位置定義,編寫不一樣。
在URL,Params , Authorization , Headers , Body中定義:
1. 手工方式創建一個空的變量名
2. 在以上的位置把想要的值選中右擊,選中Set:環境|全局 ,選中一個變量名,點擊后就會保存到這個變量中
在Tests,Pre-requests Script:
-
定義全局變量:pm.collectionVariables.set("變量名",變量值)
-
定義環境變量:pm.environment.set("變量名",變量值)
-
定義集合變量:pm.variables.set("變量名",變量值)
獲取變量
定義好變量,接下來就可以使用變量了 。需要注意的是,在不同的位置獲取變量,編寫的規則也是不一樣的 。
如果在請求參數中獲取變量,無論是獲取全局變量,還是環境變量,還是集合變量,獲取的方式都是一樣的編寫規則:{{變量名}} 。
-
請求參數指的是:URL,Params , Authorization , Headers , Body
如果是在編寫代碼的位置(Tests,Pre-requests Script)獲取變量,獲取不同類型的變量,編寫的代碼都不相同,具體如下:
-
獲取環境變量:pm.environment.get(‘變量名’)
-
獲取全局變量:pm.globals.get('變量名')
-
獲取集合變量:pm.pm.collectionVariables.get.get('變量名')
變量的使用場景非常廣泛,比如我們后面要提到的接口關聯,請求前置腳本都會使用到變量 。
8. 請求前置腳本
前置腳本其實就是在Pre-requests Script中編寫的JavaScript腳本,想要了解這個功能,需要先了解它的執行順序。那么下面就來看下它的執行順序 。
可以看出,一個請求在發送之前,會先去執行Pre Request Script(前置腳本)中的代碼 。那么這個功能在實際工作中有什么作用呢 ?
主要場景:一般情況下,在發送請求前需要對接口的數據做進一步處理,就都可以使用這個功能,比如說,登錄接口的密碼,在發送前需要做加密處理,那么就可以在前置腳本中做加密處理,再比如說,有的接口的輸入參數有一些隨機數,每請求一次接口參數值都會發送變化,就可以在前置腳本中編寫生成隨機數的代碼 。
總體來說,就是在請求接口之前對我們的請求數據進行進一步加工處理的都可以使用前置腳本這個功能。
接下來通過一個案例來看下該功能是如何使用 ?
案例:
-
請求的登錄接口URL,參數t的值要求的規則是每次請求都必須是一個隨機數。
-
接口地址:http://localhost/index.php?m=Home&c=User&a=do_login&t=0.7102045930338428
實現步驟:
-
在前置腳本中編寫生成隨機數
-
將這個值保存成環境變量
-
將參數t的值替換成環境變量的值 。
總之,這個前置腳本對我們做接口測試也非常有用,對一些復雜的場景,都可以使用前置腳本進行處理后再請求接口 。
9. 接口關聯
在我們測試的接口中,經常出現這種情況 。上一個接口的返回數據是下一個接口的輸入參數 ,那么這倆個接口就產生了關聯。這種關聯在做接口測試時非常常見,那么在postman中,如何實現這種關聯關系呢 ?
實現思路:
-
提取上一個接口的返回數據值,
-
將這個數據值保存到環境變量或全局變量中
-
在下一個接口獲取環境變量或全局變量
案例:
-
用戶上傳頭像功能,需要用戶先上傳一張圖片,然后會自動預覽 。那么在這個過程中,會調用到倆個接口 ,第一個上傳頭像接口,第二個預覽圖像接口 。
-
其中調用上傳頭像接口成功后會返回如下信息:
- {??
- "url":?"/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg",??
- "title":?"banner",??
- "original":?"",??
- "state":?"SUCCESS",??
- "path":?"images"??
- }
而圖像預覽接口URL為:
http://localhost/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg 。可以看出這個接口的URL后半部分其實是上一個接口返回的url的值 。那么這倆個接口就產生了關聯。那么在postman 可以通過以下三步完成這倆個接口的關聯實現 。
實現步驟:
-
獲取上傳頭像接口返回url的值
-
將這個值保存成全局變量(環境變量也可以)
-
在圖像預覽中使用全局變量
可以看出,接口的關聯的解決方案都是用的是變量中的知識,也就是說只要你明確了要提取的值,后面就是保存該值,然后在其他接口使用該值就可以了。
10.常見返回值獲取
在做接口測試時,請求接口返回的數據都是很復雜的json數據,有著多層嵌套,這樣的數據層級在postman怎么獲取呢 ?
案例1:多層json嵌套, 獲取user_id的值
- {??
- "code":?0,??
- "message":?"請求成功!",??
- "data":?{??
- "user_id":?"1252163151781167104"??
- }??
- }
- //獲取json體數據??
- var?jsonData?=?pm.response.json()??
- //?獲取user_id的值,通過.獲取??
- var?user_id?=?jsonData.data.user_id
案例2:json中存在列表,獲取points中的第二個元素
- {??
- "code":?0,??
- "message":?"請求成功!",??
- "data":?{??
- "roles":?{??
- "api":?[??
- "API-USER-DELETE"??
- ],??
- "points":?[??
- "point-user-delete",??
- "POINT-USER-UPDATE",??
- "POINT-USER-ADD"??
- ]??
- },??
- "authCache":?null??
- }??
- }
- //獲取json體數據??
- var?jsonData?=?pm.response.json()??
- //?獲取user_id的值,通過下標獲取列表中某個元素??
- var?user_id?=?jsonData.data.roles.points[1]
案例3:列表中取最后一個元素
- {??
- "code":?0,??
- "message":?"請求成功!",??
- "data":?{??
- "total":?24,??
- "rows":?[??
- {??
- "id":?"1066370498633486336",??
- "mobile":?"15812340003",??
- "username":?"zbz"??
- },??
- {??
- "id":?"1071632760222810112",??
- "mobile":?"16612094236",??
- "username":?"llx"??
- },??
- ...??
- {??
- "id":?"1075383133106425856",??
- "mobile":?"13523679872",??
- "username":?"test001",??
- },
- //獲取json體數據??
- var?jsonData?=?pm.response.json()??
- //?獲取id的值,通過slice(-1)獲取列表中最后一個元素。??
- var?id?=?jsonData.data.rows.slice(-1)[0]