通常簡單的接口測試咱們能夠直接在瀏覽器裏面進行調試,可是涉及到一些權限設置就沒法操做了,所以咱們須要接口測試的相關工具:postman是一個接口測試和HTTP請求的工具。html
postman的優勢:java
Postman有Windows,Mac,Liunx以及Chrome插件版本。這裏主要介紹win平臺版本的使用。node
發送第一個請求:python
一、啓動軟件後在引導界面點擊Request,給Request命名,而後建立文件夾並把該Request歸屬到該文件夾。web
二、在地址欄輸入postman-echo.com/get而後點擊send按鈕,能夠看到返回值。算法
以下圖所示,當你在Postman中輸入請求並單擊Send按鈕時,服務器將接收請求並返回Postman在接口中顯示的響應npm
發送不一樣的HTTP請求編程
GET
json
HTTP GET請求用於從服務器檢索數據,數據由統一的URI(統一資源標識符)標識,GET請求可使用Query String Parameters 將參數傳遞給服務器。api
請求說明:
參數編輯:
響應數據:
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 數據類型數碼:
HTTP PUT請求主要是從客戶端向服務器傳送的數據取代指定的文檔的內容,PUT請求可使用Query String Parameters以及body請求體將參數傳遞給服務器。
發送PUT請求,並傳遞字符參數「hello postman」
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" }
請求頭-用來講明服務器要使用的附加信息,比較重要的信息由Cookie、Referer、User-Agent等,在postman中能夠在請求下方的Heafers欄目中設置,以下圖所示
響應頭-其中包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等,在postman主界面下方Heerders或者Postman Console界面均可以查看Response Heaader信息
Tips: 經過控制檯能夠看到每次請求的Request Header詳細信息
不少時候,出於安全考慮咱們的接口並不但願公開。這是就須要使用受權(Authorization)機制,受權過程驗證您是否具備訪問服務器所需數據的權限。當您發送請求是,您一般必須包含參數,以確保請求具備訪問和返回所需數據的權限。Postman提供受權類型,能夠輕鬆的在Postman本地程序中處理生髮驗證協議。
Postman支持的受權協議類型以下:
這裏主要介紹加粗的受權協議
基自己份驗證是一種比較簡單的受權類型,須要通過驗證的用戶名和密碼才能訪問數據資源。這就須要咱們輸入用戶名和應對 的密碼。
案例:請求URL以下,受權帳號爲:
用戶名:postman
密碼:password
受權協議爲:Basic auth
https://postman-echo.com/basic-auth
若是不輸入用戶名密碼,直接用GET請求,則返回提示:Unauthorized
若是輸入用戶密碼,選擇Basic 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是一個HTTP認證方案,使用MAC(message authentication code,消息認證算法),它提供了對請求進行部分加密的認證HTTP請求的方法。hawk方案要求提供一個共享對稱密匙在服務器與客戶端之間,一般這個共享的憑證在初試TLS(安全傳輸層協議)保護階段創建的,或者是從客戶端和服務器均可用的其餘一些共享機密信息中得到的。
案例
請求URL以下:
https://postman-echo.com/auth/hawk
密匙信息以下:
執行結果:
{ "message": "Hawk Authentication Successful" }
若是將Key改爲其餘任意的字符則返回以下結果:
{ "statusCode": 401, "error": "Unauthorized", "message": "Bad mac", "attributes": { "error": "Bad mac" } }
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是存儲在瀏覽器中的小片斷信息,沒次請求後都將其發送會服務器,以便在請求之間存儲有用的信息。好比不少網站登陸界面都有保留帳號密碼,以便下次登陸。
因爲HTTP是一種無狀態的協議,服務器從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證,沒人一個,不管誰訪問都必須攜帶本身通訊證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。
Cookie是有服務端生成,儲存在響應頭中,返回客戶端,客戶端會將cookie存儲下來,在客戶端發送請求時,user-agent會自動獲取本地存儲的cookie,將cookie信息存儲在請求頭重,併發送給客戶端。postman也能夠設置、獲取、刪除cookie。
在send按鈕下方點擊Cookies文字菜單,彈出以下界面,而後能夠設置Cookie。
請求URL以下:
http://www.baidu.com/
請求方式爲GET,添加Cookie值爲hobby:rubikcube
打開Console找到Request Header能夠看到自定義設置的Cookie內容
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種變量類型:
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。
案例
請求接口以下:
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); });
引用本地變量
斷言結果
當咱們想批量測試某個集合裏面的各個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時一款基於Node.js開發的能夠運行postman的工具,使用Newman能夠直接從命令行運行和測試postman集合。
環境準備
配置好環境後,執行以下命令安裝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
命令說明
更多方法請輸入newman -h 便可查看
報告查看
在測試文件pmtest裏面能夠看到自動生成的newman文件夾,打開就能夠看到生成的測試報告
Html報告樣式:newman-run-report
newman不只支持生成html報告,還支持其餘報告類型:
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裏面去執行,集成步驟也很簡單:
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 複製。