Postman簡介
一般簡單的接口測試我們可以直接在瀏覽器里面進行調試,但是涉及到一些權限設置就無法操作了,因此我們需要接口測試的相關工具:postman是一個接口測試和HTTP請求的工具。
postman的優點:
- 支持各種請求類型:get、post、put、patch、delete等
- 支持在線存儲數據,通過賬號就可以進行遷移數據
- 很方便的支持請求header和請求參數的設置
- 支持不同的認證機制,包括 Basic Auth、 Digest Auyh 、 OAuth1.0、 OAuth2.0等
- 響應數據時自動按照語法格式高亮的, 包括HTML、 JSON 和 XML
下載安裝
Postman有Windows,Mac,Liunx以及Chrome插件版本。這里主要介紹win平台版本的使用。
- 官網地址:https://www.getpostman.com/
- 下載地址:https://www.getpostman.com/apps
- 官方文檔:https://www.getpostman.com/docs/v6/
- postman Api 文檔:https://docs.postman-echo.com
Postman入門
發送第一個請求:
1、啟動軟件后在引導界面點擊Request,給Request命名,然后創建文件夾並把該Request歸屬到該文件夾。
2、在地址欄輸入postman-echo.com/get然后點擊send按鈕,可以看到返回值。
Postman工作原理
如下圖所示,當你在Postman中輸入請求並單擊Send按鈕時,服務器將接收請求並返回Postman在接口中顯示的響應
發送不同的HTTP請求
GET
HTTP GET請求用於從服務器檢索數據,數據由統一的URI(統一資源標識符)標識,GET請求可以使用Query String Parameters 將參數傳遞給服務器。
請求說明:
- Params下的Query Params是以鍵值對方式發送參數,
- 在URL后面加 ?可以添加發送參數,& 可以連接多個參數
- 例如:https://postman-echo.com/get?name=leesin&skill=qq2wrd
參數編輯:
- 點擊params按鈕,postman可以自動辦公們解析出對應的參數
- 如果暫時不傳參數,可以方便的通過不勾選方式去實現
- 如果想要批量編輯參數,可以點擊右上角的Bulk Edit,實現批量編輯
響應數據:
- 在主頁下方一欄菜單為響應菜單欄,可以查看響應內容,Cookie、Headers、響應狀態碼等信息
POST
HTTP POST請求是將數據傳輸到服務器,返回 的數據取決於服務器的實現。
POST請求可以使用query String Parameters以及body將參數傳遞給服務器。
案例1:
在下面的請求中,使用Query String Parameters傳遞參數。
https://postman-echo.com/post?param=test
返回值
{ "args": { "param": "test" }, "data": {}, "files": {}, "form": {}, "headers": { "x-forwarded-proto": "https", "host": "postman-echo.com", "content-length": "0", "accept": "*/*", "accept-encoding": "gzip, deflate", "cache-control": "no-cache", "cookie": "sails.sid=s%3A57aLbjtudZ0eAUQPTGkyqZR-k148qAzN.tS52N8wbompQ8tzqpFZnu%2Bq4x5KLy1tR9g%2FhIn9Ss7s", "postman-token": "be4d5653-949f-4ea1-b63a-8572d1a8ffb5", "user-agent": "PostmanRuntime/7.13.0", "x-forwarded-port": "443" }, "json": null, "url": "https://postman-echo.com/post?param=test" }
案例2:
發送一個Request,其中body為application/x-www-form-urlencoded類型,參數分別為param1=zed和param2=jiawen,請求URL如下:
https://postman-echo.com/post
Postmam Body 數據類型數碼:
- form-data multipart/form-data是Web表單用於出書數據的默認編碼。這模擬了在網站上填寫表單並提交它,表單數據編輯器允許我們為數據設置鍵-值對。我們也可以為文件設置一個鍵,文件本身作為值進行設置。
- x-www-form-urlencoded該編碼與URL參數中使用的編碼相同。我們只需輸入鍵-值對,postman會正確編碼鍵和值,請注意,我們無法通過次編碼模式上傳文件。表單數據和urlencoded之間可能存在一些差異,因此請務必檢查Api的編碼實現,確認是否可以使用這種方式發送請求。
- raw請求可以包含任何內容,除了替換環境變量之外,Postman不觸碰在編輯器中輸入的字符串。無論你在編輯區輸入什么內容,都會隨請求一起發送到服務器。編輯器允許我們設置格式類型,以及使用原始主體發送的正確請求頭。我們也可以手動設置Content-Type標題,這將覆蓋Postman定義的設置
- binary二進制數據可以讓我們發送Postman我i發輸入的內容,例如圖像,音頻或視頻文件
PUT
HTTP PUT請求主要是從客戶端向服務器傳送的數據取代指定的文檔的內容,PUT請求可以使用Query String Parameters以及body請求體將參數傳遞給服務器。
發送PUT請求,並傳遞字符參數“hello postman”
DELETE
HTTP DELETE方法用於刪除服務器上的資源,DELETE請求可以使用Query string parameters以及body請求體將參數傳遞給服務器
DELETE請求
https://postman-echo.com/delete
返回值
{ "args": {}, "data": {}, "files": {}, "form": {}, "headers": { "x-forwarded-proto": "https", "host": "postman-echo.com", "accept": "*/*", "accept-encoding": "gzip, deflate", "cache-control": "no-cache", "cookie": "sails.sid=s%3A-PlKnJ5cqYk6Uqz9tVwj-4o1lr5LZWrg.NRSWI4CcrBfKDAGgoUszOojVC%2F5v%2FY0YqZPFrRxaavg", "postman-token": "e8737025-ca4c-4b2c-91ef-338de8fd1f09", "user-agent": "PostmanRuntime/7.13.0", "x-forwarded-port": "443" }, "json": null, "url": "https://postman-echo.com/delete" }
Request Header
請求頭-用來說明服務器要使用的附加信息,比較重要的信息由Cookie、Referer、User-Agent等,在postman中可以在請求下方的Heafers欄目中設置,如下圖所示
Response Header
響應頭-其中包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等,在postman主界面下方Heerders或者Postman Console界面都可以查看Response Heaader信息
Tips: 通過控制台可以看到每次請求的Request Header詳細信息
授權設置
很多時候,出於安全考慮我們的接口並不希望公開。這是就需要使用授權(Authorization)機制,授權過程驗證您是否具有訪問服務器所需數據的權限。當您發送請求是,您通常必須包含參數,以確保請求具有訪問和返回所需數據的權限。Postman提供授權類型,可以輕松的在Postman本地程序中處理生發驗證協議。
Postman支持的授權協議類型如下:
- No Auth
- Bearer Token
- Basic auth
- Digest Auth
- OAuth 1.0
- OAuth 2.0
- Hawk Authentication
- AWS Signature
- NTLM Authentication [Beta]
這里主要介紹加粗的授權協議
Basic auth
基本身份驗證是一種比較簡單的授權類型,需要經過驗證的用戶名和密碼才能訪問數據資源。這就需要我們輸入用戶名和應對 的密碼。
案例:請求URL如下,授權賬號為:
用戶名:postman
密碼:password
授權協議為:Basic auth
https://postman-echo.com/basic-auth
如果不輸入用戶名密碼,直接用GET請求,則返回提示:Unauthorized
如果輸入用戶密碼,選擇Basic auth授權類型,則返回如下結果
Digest Auth
Digest Auth是一個簡單的認證機制,最初是為HTTP協議開發的,因此也常叫做HTTP摘要。其身份驗證機制非常簡單,它采用哈希加密方法,以避免銘文傳輸用戶的口令。摘要認證就是要合適參與通信的兩方都知道雙方共享的口令。
當server想要查證用戶的省份,它產生體個摘要盤問(Digest challenge),並發送給用戶。典型的摘盤問用例如以下:
Digest realm = “iptel.org”, qop="auth,auth-int", nonce="dcd98b7102dd3f0e8b11d0f600bfb0c093",opaque=""
,algorithm=MD5
這里包含了一組參數,也要發送給用戶。用戶使用這些參數,來產生正確的摘要回答,並發送給server。再要盤問中的各個參數,其意義如下:
realm(領域):領域參數是強制的,在全部的盤問中都不許。它的目的是鑒別SIP消息中的機密。在SIP實際引應用中,它通常設置為SIP代理所負責的域名。
nonce(現時):這是由server規定的數據字符串,在server每次產生一個斬妖盤問時,這個參數都是不一樣的(與前面所產生的不會雷同)。“現時”一般是由一些數據通過MD5雜湊運算構造的。這種數據通常包含時間標識和server的機密短語。這確保每一個“現時”都有一個有限的生命期(也就是過了一段時間會失效,並且以后不會使用),並且時獨一無二的(即不論什么其他的server都不能產生一個同樣的“現時”)。
algorithm(算法):這是用來計算的算法。當前僅僅支持MD5算法。
qop(保護的質量):這個參數規定server支持那種保護方案。client能夠從列表中選擇一個。值auth表示僅僅進行身份查驗,auth-int表示進行查驗外,另一些完整性保護。
案例
請求URL如下
https://postman-echo.com/digest-auth
摘牌配置信息如下:用戶密碼和basic auth一樣
Digest username=“postman”, realm=“Users”, nince=“ni1LiL0037PRRhofwdCLmwFsnEtH1lew”,uri=“?digest-auth”, opaque=“”
執行結果如下
{ "authenticated": true }
Hawk Auth
Hawk Auth是一個HTTP認證方案,使用MAC(message authentication code,消息認證算法),它提供了對請求進行部分加密的認證HTTP請求的方法。hawk方案要求提供一個共享對稱密匙在服務器與客戶端之間,通常這個共享的憑證在初試TLS(安全傳輸層協議)保護階段建立的,或者是從客戶端和服務器都可用的其他一些共享機密信息中獲得的。
案例
請求URL如下:
https://postman-echo.com/auth/hawk
密匙信息如下:
- Hawk Auth ID:dh37fgj492je
- Hawk Auth Key:werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn
- Algorithm:sha256
執行結果:
{ "message": "Hawk Authentication Successful" }
如果將Key改成其他任意的字符則返回如下結果:
{ "statusCode": 401, "error": "Unauthorized", "message": "Bad mac", "attributes": { "error": "Bad mac" } }
OAuth 1.0
OAuth(開放授權)是一個開放標准,允許客戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯系人列表),而無需將用戶名和密碼提供給第三方應用。
案例
請求URL如下:
https://postman-echo.com/oauth1
請求方式為GET,Add authorization data to 設置為:Request Headers
參數配置為:
Consumer Key:RKCGzna7bv9YD57c
Consumer Sceret:D+EdQ-gs$-%@2Nu7
發送請求結果如下:
{ "status": "pass", "message": "OAuth-1.0a signature verification was successful" }
如果Consumer Secret錯誤則返回如下結果:
{ "status": "fail", "message": "HMAC-SHA1 verification failed", "base_uri": "https://postman-echo.com/oauth1", "normalized_param_string": "oauth_consumer_key=RKCGzna7bv9YD57c&oauth_nonce=lBeuZSBkUw1&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1558957675&oauth_version=1.0", "base_string": "GET&https%3A%2F%2Fpostman-echo.com%2Foauth1&oauth_consumer_key%3DRKCGzna7bv9YD57c%26oauth_nonce%3DlBeuZSBkUw1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1558957675%26oauth_version%3D1.0", "signing_key": "D%2BEdQ-gs%24-%25%402Nu7&" }
擴展資料:各個授權協議文檔
Cookie設置
Cookie是存儲在瀏覽器中的小片段信息,沒次請求后都將其發送會服務器,以便在請求之間存儲有用的信息。比如很多網站登錄界面都有保留賬號密碼,以便下次登錄。
由於HTTP是一種無狀態的協議,服務器從網絡連接上無從知道客戶身份。怎么辦呢?就給客戶端們頒發一個通行證,沒人一個,無論誰訪問都必須攜帶自己通信證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie是有服務端生成,儲存在響應頭中,返回客戶端,客戶端會將cookie存儲下來,在客戶端發送請求時,user-agent會自動獲取本地存儲的cookie,將cookie信息存儲在請求頭重,並發送給客戶端。postman也可以設置、獲取、刪除cookie。
Set Cookies
在send按鈕下方點擊Cookies文字菜單,彈出如下界面,然后可以設置Cookie。
請求URL如下:
http://www.baidu.com/
請求方式為GET,添加Cookie值為hobby:rubikcube
打開Console找到Request Header可以看到自定義設置的Cookie內容
Get Cookies
Cookie獲取比較簡單,直接獲取Response Headers里面的 set-cookie值即可,或者在主界面下方Cookie菜單欄里面也可以查看。
Delete Cookies
點擊Cookies文字菜單,然后可以根據需求去清除對應的Cookie。
變量
我們在開發不同階段可能存在不同的環境,比如測試環境和是生產環境。
測試環境API如下( 不是真實,用來玩的):
https://dev.postman.com/get https://dev.postman.com/post https://dev.postman.com/put
生產環境如下:
https://postman-echo.com/get https://postman-echo.com/post https://postman-echo.com/put
在這種情況下,按照常規思路要么維護兩套環境的API,要么每次手動一個個去修改URL,兩種方法都低效且麻煩,設置變量就可以很好的解決這個問題。
Postman變量類型
通過比較我們可以發現,以上兩組API除了host不同之外其他都一樣,其實吧host用變量替代,這樣就可以靈活切換環境。
Postman提供了變量設置,有4種變量類型:
- 本地變量(Local Variable)
- 全局變量(Global Variable)
- 環境變量(Enviroment Variable)
- 數據變量(Data Variable)
Tips:數據變量結合Collection介紹,不在此處介紹
環境變量
環境變量指在不同環境,同一個變量值隨着環境不同而變化,比如我們上面舉例場景就可以使用環境變量,當在測試環境時,host值為:dev.postman.com,當切換到生產環境時,host值變為:postman-echo.com。
環境變量設置:在postman界面點擊右上角眼睛圖標,即可開始設置環境變量和全局變量。環境變量設置過程如下圖所示:可以設置兩種環境dev和release,dev是開發測試環境;release是正式生產的生產環境。host環境變量,根據不同的環境值而改變。
引用變量格式為{{varname}},如下圖所示:
本地變量
本地變量主要是針對單個URL請求設置的變量,作用域只局限在請求范圍內。如請求URL:https://postman-echo.com/post,設置兩個本地變量(user,passwd)作為參數。請求方式為post。
設置本地變量:
pm.variables.set("user","yi"); pm.variables.set("passwd","aeaqaaa");
引用本地變量格式:{{variable_name}}
全局變量
全局變量是指在所有環境里面,變量值都是一樣的,全局變量的作用域是所有請求。
全局變量設置有兩種方式:
- 頁面設置
- 腳本設置
頁面設置
點擊右上角設置變量的圖標,在Global選項菜單點擊Edit菜單即可設置全局變量,如下圖所示。全局變量的引用方式和環境變量一樣。
注意:當環境變量和全局變量名稱一樣,切換到某個環境時,環境變量會覆蓋全局變量。
腳本設置
在 Pre-request Script 編寫如下代碼可以設置全局變量:
pm.globals.set("variable_key","variable_value");
variable_key表示變量名稱,variable_value代表變量值。
案例實踐
在實際接口測試中,接口經常會有關聯。比如需要取上一個接口的某個返回值,然后作為參數傳遞到下一個接口作為參數。假設現在要獲取A接口返回的userid值作為B接口的請求參數。
A、B接口請求URL如下:
A:https://postman-echo.com/post
B:https://postman-echo.com/get
斷言
一般來說執行完測試,我們需要對測試結果來進行校驗,判斷結果是否符合我們的預期,也就是斷言。在街口測試中一般會根據響應狀態碼或者返回的數據來進行斷言。
postman提供一個測試沙盒(postman sandbox)測試沙盒是一個JavaScript執行環境,可以通過JS腳本來編寫pre-request Script 和 test Script。
- pre-request Script(預置腳本)可以用來修改一些默認參數,在青丘發送之前執行。有點類似unittest框架中的seUP()方法。
- test Script(測試腳本)當接收到響應之后,在執行測試腳本。
案例
請求接口如下:
postman-echo.com/post
斷言規則:
響應狀態碼:200
斷言內容:返回的user參數值與定義的一致
響應時間:小於0.5s
測試腳本:
在pre-request Script定義變量user
pm.variables.set("user","zed");
在Test編寫斷言腳本
//判斷響應狀態碼 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); //獲取發送的參數值 username = pm.variables.get("user"); console.log(username) //校驗響應內容是否和請求一致 pm.test("Check username", function () { var jsonData = pm.response.json(); pm.expect(jsonData.json['user']).to.eql(username); }); //檢測響應時間是否小於0.5s pm.test("Response time is less than 500ms", function () { pm.expect(pm.response.responseTime).to.be.below(500); });
引用本地變量
斷言結果
批量執行
Collection
當我們想批量測試某個集合里面的各個API時,可以試用Collection Runner 來批量運行API,同時可以進行環境變量,迭代執行冊數,延遲時間設置。
Collection入口
Collection執行前選項
執行結果
數據驅動
有時我們針對一個接口需要測試很多不同的參數,如果每次一個個去修改參數值來進行測試這樣效率肯定比較低下。因此需要每次迭代執行傳入不同的參數進行測試,那么需要導入外部數據文件進行參數化,也就是數據驅動。
數據導入(此鏈接跳轉Newman命令說明)
如下圖所示,data選擇json數據文件:data.json,文件類型選擇application/json Json數據內容如下:
[{ "username":"Jack", "passwd":"6666" },{ "username":"Bob", "passwd":"5555" },{ "username":"Marry", "passwd":"8888" }]
執行結果
構建工作流
再使用"Collection Runner"的時候,集合中的請求執行順序就是在請求Collection中的顯示排列順序。但是,有的時候我們不希望按照這樣的方式去執行,可能是執行完第個請求,再去執行第五個請求,然后再去執行第二個請求這樣的順序;那么在"Collection Runner"中如何去構建不同的執行順序呢?
設置方法
最直接的方法就是在集合中拖動順序,但是每次去拖動比較麻煩,特別是當請求比較多的時候。這時最高效的方法就是通過腳本設置。首先下載官方提供的案例文件:collection.json導入到postman,運行Collection結果如圖所示:
接下看要調整執行順序圍為:Request1->Request3->Request2->Request4
首先在第一個請求Request1中Test代碼欄中編輯如下代碼,表示下一個請求為Request3
postman.setNextRequest('Request 3')
然后在Request3中Test代碼欄中編輯如下代碼,表示下一個請求為Request2
postman.setNextRequest('Request 2')
然后在Request2中Test代碼欄中編輯如下代碼,表示下一個請求為Request4
postman.setNextRequest('Request 4')
注意:首個執行的請求要排在第一位
執行結果
相關資料:collection runs 官方文檔
命令執行
在之前我們都是在postman圖形界面工具里面進行測試,但是有時候需要把測試腳本集成到CI平台,或者在非圖形界面的系統環境下測試,此時就需要用到Newman。
Newman簡介
Newman時一款基於Node.js開發的可以運行postman的工具,使用Newman可以直接從命令行運行和測試postman集合。
環境准備
- Node.js
- cnpm或者npm
配置好環境后,執行如下命令安裝newman
cnpm install newman -- global
輸入如下命令檢測安裝是否成功
C:\Users\ccl>newman -v 4.4.1
執行測試
首先將postman的集合導出到桌面新建文件夾pmtest,如下圖所示:
打開cmd進入pmtest目錄,輸入如下命令:
newman run setNextRequest.postman_collection.json -d data.json -r html
命令說明
- run 代表要執行的postman腳本,即為導出的集合。
- -d 表示要執行的數據,也就是執行 Collection數據驅動的data.json 的數據
- -r 生成測試報告類型,這里生成html格式報告
更多方法請輸入newman -h 即可查看
報告查看
在測試文件pmtest里面可以看到自動生成的newman文件夾,打開就可以看到生成的測試報告
Html報告樣式:newman-run-report
newman不僅支持生成html報告,還支持其他報告類型:
- JSON reporter
- JUNT/XML repoter
- Client report
- Html report
集成Jenkins
Jenkins介紹
jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重復的工作,旨在一共一個開放易用的軟件平台,使軟件的持續集成變成可能。
下載與安裝
下載地址:https://jenkins.io/download/
下載后安裝到指定的路徑即可,默認啟動也買你為localhost:8080,如果8080端口被占用無法打開,可以進入到jenkins安裝目錄,找到jenkins.xml配置文件,修改如下代碼的端口號即可。
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>
集成步驟
集成到jenkins的思路其實很簡單,就把之前執行測試的cmd命令放到jenkins里面去執行,集成步驟也很簡單:
- 首先新建一個項目:postman_api_test
- 然后再構建欄目下拉菜單選擇 執行批處理命令(Execute Windows batch command)
cd C:\Users\ccl\Desktop\postman_api_test
newman run setNextRequest.postman_collection.json -d data.json -r html
Tips:我的文件夾中的文件與Newman應用的文件時一樣的
如此保存后再jenkins主頁進行構建任務即可,其他的設置如:定時執行,發送郵件報告等功能后期再Jenkin使用手冊中詳細介紹。
導出不同腳本語言
雖然Postman功能比較強大,但畢竟時一款商業工具,多少會有些限制。比如只支持JS腳本運行,如果享用自己熟悉的編程語言(如:python,java等)來做接口自動化測試就需要導出對應的語言腳本了。
操作步驟
Postman支持導出不同語言版本的腳本,到一個接口調試好之后,點擊右側的code字樣即彈出圖下界面可以選擇語言。最后你需要選擇語言版本即可生成對應的代碼。
生成的代碼片段可以點擊Copy to Clipboard 復制。