API自動化測試利器——Postman

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

API自動化測試利器——Postman

作者: fengchang 
時間: September 26, 2015 
分類: 工具

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

一、基本功能

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

Collections:在Postman中,Collection類似資料夾,可以把同一個專案的請求放在一個Collection裡方便管理和分享,Collection裡面也可以再建資料夾。如果做API文件的話,可以每個API對應一條請求,如果要把各種輸入都測到的話,就需要每條測試一條請求了。這裡我新建了一個example用於介紹整個流程,五個API對應五條請求。這個Collection可以通過https://www.getpostman.com/collections/c8f98a1120357e0d4a5a

其他用法還包括在發起請求之前獲取當前的時間戳放在引數裡:

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的)

三、示例

最後完整的看一下我用的例程。這個例子是一個非常簡單的小系統,使用者可以註冊並登入,然後在系統裡新建充值卡,並給這張卡充值。整個流程如下:

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看效果了。


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}

伺服器 最新文章