API自動化測試利器——Postman

API自動化測試利器——Postman

自從開始作API開發以後,我就在尋找合適的API測試工具。一開始不是很想用Chrome擴展,用的WizTools的工具,後來試過一次Postman以後就停不下來了,還買了付費的Jetpacks。推出Team Sync Beta以後我又把這個工具推廣給團隊,做爲API文檔使用。看到中文網絡上關於這個工具的文章並很少,因而決定寫一篇小文介紹一下。php

1、基本功能

Postman的功能在文檔中有介紹。不過文檔略囉嗦,這裏簡單介紹一下主界面,入門功能就都提到了。
postman_mark.pnghtml

  1. Collections:在Postman中,Collection相似文件夾,能夠把同一個項目的請求放在一個Collection裏方便管理和分享,Collection裏面也能夠再建文件夾。若是作API文檔的話,能夠每一個API對應一條請求,若是要把各類輸入都測到的話,就須要每條測試一條請求了。這裏我新建了一個example用於介紹整個流程,五個API對應五條請求。這個Collection能夠經過https://www.getpostman.com/collections/c8f98a1120357e0d4a5a導入你本身的Postman中。web

  2. 上面的黑字註冊是請求的名字,若是有Request description的話會顯示在這下面。下面的藍字是保存起來的請求結果,點擊能夠載入某次請求的參數和返回值。我會用這個功能給作客戶端的同事展現不一樣狀況下的各類返回值。保存請求的按鈕在15.chrome

  3. 選擇HTTP Method的地方,各類常見的不常見的很是全。api

  4. 請求URL,兩層大括號表示這是一個環境變量,能夠在16的位置選擇當前的environment,環境變量就會被替換成該environment裏variable的值。服務器

  5. 點擊能夠設置URL參數的key和value網絡

  6. 點擊發送請求app

  7. 點擊保存請求到Collection,若是要另存爲的話,能夠點擊右邊的下箭頭dom

  8. 設置鑑權參數,能夠用OAuth之類的函數

  9. 自定義HTTP Header,有些由於Chrome願意不能自定義的須要另外裝一個插件Interceptor,在16上面一行的衛星那裏

  10. 設置Request body,13那裏顯示的就是body的內容

  11. 在發起請求以前執行的腳本,例如request body裏的那兩個random變量,就是每次請求以前臨時生成的。

  12. 在收到response以後執行的測試,測試的結果會顯示在17的位置

  13. 有四種形式能夠選擇,form-data主要用於上傳文件。x-www-form-urlencoded是表單經常使用的格式。raw能夠用來上傳JSON數據

  14. 返回數據的格式,Pretty能夠看到格式化後的JSON,Raw就是未經處理的數據,Preview能夠預覽HTML頁面

  15. 點擊這裏把請求保存到2的位置

  16. 設置environment variables和global variables,點擊右邊的x能夠快速查看當前的變量。

  17. 測試執行的結果,一共幾個測試,經過幾個。

這個界面就是免費版的主要內容,和其餘API測試工具相比,已經足夠好用。若是要使用自動化測試,須要購買9.99美金的Jetpacks,暫時不想購買的話能夠試一下Team版Postman。如今是能夠免費試用的,不但擁有Jetpacks的功能,還能與其餘帳戶同步Collection。

2、測試工具

測試工具主要包括三部分,在發起請求以前運行的Pre-request,在收到應答以後運行的Test,和一次運行全部請求的Collection Runner

1. Pre-request

Pre-request的編寫界面以下:

pre.png

Pre-request和Test用的語言都是JavaScript,Postman在一個沙盒裏執行代碼,提供給用戶的庫和函數能夠在這裏查看。而經常使用的功能均可以經過右邊的Code Snippets實現,點擊就能夠插入到代碼區域。

能夠看到Pre-request裏經常使用的功能就兩種,設置環境變量和設置全局變量。這條請求的pre-request就是在註冊以前生成一個字符串做爲隨機用戶名。

postman.setEnvironmentVariable("random_username", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

其餘用法還包括在發起請求以前獲取當前的時間戳放在參數裏:

postman.setEnvironmentVariable("unixtime_now", Math.round(new Date().getTime()/1000));

固然也能夠用來生成校驗串。總之,在發請求以前須要手動修改的東西,均可以考慮用腳本自動實現。

2. Test

Test的編寫界面以下:

test.png

和Pre-request相比,Test的Snippets就豐富多了,例如檢查狀態碼、檢查響應串、驗證JSON、檢查header、限制應答時間。

若是須要將服務器響應的數據保存下來,用在後面的請求裏,也須要在這一步作。

在圖中的Test裏,我首先檢查了狀態碼爲200,而後解析返回的JSON,把環境變量裏的token設爲JSON裏的token。

3. Collection Runner

當編寫了不少測試以後,就可使用Collection Runner來自動運行整個Collection了,入口就在主界面最上面一行的Runner。選好Collection、Environment,若是有須要還能夠載入JSON和CSV做爲數據源。點擊Start Test Run,就能夠看到結果了。

runner.png

這裏能夠看到一共發起了5次請求,每一個請求各有一個Test,所有Pass。(雖然最後一個請求的返回是403,可是這個請求的指望返回值就是403,因此也是Pass的)

3、示例

最後完整的看一下我用的例程。這個例子是一個很是簡單的小系統,用戶能夠註冊並登陸,而後在系統裏新建充值卡,並給這張卡充值。整個流程以下:

1. 註冊

生成一個隨機字符串做爲用戶名和暱稱

postman.setEnvironmentVariable("random_username", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

發起請求

POST /index.php/users HTTP/1.1
Host: postmanexample.sinaapp.com
Cache-Control: no-cache
Postman-Token: 76791813-aac2-71fb-cad4-3e737f37c4d0
Content-Type: application/x-www-form-urlencoded

username=2mjk&password=123456&nickname=2mjk

運行測試、檢查結果

tests["Status code is 201"] = responseCode.code === 201;

2. 登陸

直接用剛纔生成的環境變量發起請求

POST /index.php/authentication HTTP/1.1
Host: postmanexample.sinaapp.com
Cache-Control: no-cache
Postman-Token: aac7d0ac-e0e3-ecf2-39da-b8dca672e3d7
Content-Type: application/x-www-form-urlencoded

username=2mjk&password=123456

運行測試、檢查結果,並將返回的token記錄下來

tests["Status code is 200"] = responseCode.code === 200;

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("token", data.token);

3. 添加一張卡

先生成一個卡號和卡名

postman.setEnvironmentVariable("random_cardno", Math.round(Math.random()*9999999));

postman.setEnvironmentVariable("random_cardname", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

而後發起請求,這裏調用了剛纔獲取到的Token,放在header的自定義字段裏做爲鑑權(SAE不能用Authorization這個字段,不清楚緣由)

POST /index.php/cards HTTP/1.1
Host: postmanexample.sinaapp.com
X-Authorization: d4c4a0b7b36c73e7a13b7e24a596093b
Cache-Control: no-cache
Postman-Token: d44d573f-f17a-366c-2cd7-1d5b8b709233
Content-Type: application/x-www-form-urlencoded

cardno=1385526&desc=2mo8

運行測試

tests["Status code is 200"] = responseCode.code === 200;

4. 查詢剛纔生成的卡

發起請求,調用了剛纔生成的卡號

GET /index.php/cards/1385526 HTTP/1.1
Host: postmanexample.sinaapp.com
Cache-Control: no-cache
Postman-Token: 1e5aca57-c3bb-7404-2791-c639cd60b5c8

運行驗證,和剛纔生成的卡名對比,並記錄新卡的ID

var data = JSON.parse(responseBody);
tests["check cardname"] = data.desc === environment.random_cardname;

postman.setEnvironmentVariable("new_card_id", data.id);

5. 充值

發起請求,使用了剛纔得到的新卡ID

POST /index.php/deposit HTTP/1.1
Host: postmanexample.sinaapp.com
X-Authorization: d4c4a0b7b36c73e7a13b7e24a596093b
Cache-Control: no-cache
Postman-Token: 388c95e0-b5ce-9bbf-5816-084db7523384
Content-Type: application/x-www-form-urlencoded

cardid=1&amount=10

運行驗證(因爲是新建的用戶,沒有餘額,沒法給卡片充值,故返回403 Forbidden)

tests["Status code is 403"] = responseCode.code === 403;

P.S.postmanexample.sinaapp.com這個網站是真實存在的,能夠Import我上傳的Collection(https://www.getpostman.com/collections/96b64a7c604072e1e4ee)到你本身的Postman中,並設置環境變量urlhttp://postmanexample.sinaapp.com/index.php,就能運行這個Collection看效果了。

相關文章
相關標籤/搜索