使用postman進行接口自動化測試
我們先思考一下,如果需要達到自動化接口測試的效果,那麼我們在基本的模擬請求上還需要做哪些呢?
以下我粗略概括為 3 個問題(歡迎更多補充與建議):
- 如何判斷接口是否請求成功
- 如何進行接口批量、定期測試
- 如何處理依賴接口問題(比如商品下單的接口必須要求先登錄)
所以,接下來就主要分為 3 個部分進行介紹,以分別解決這 3 個問題。
一、接口結果判斷
首先,既然是自動化測試,那麼我們肯定需要工具 (Postman) 或者代碼能幫我們直接判斷結果是否符合預期。那麼在接口測試上,大體就兩個思路:
- 判斷請求返回的 code 是否符合預期
- 判斷請求返回的內容中是否包含預期的內容(關鍵字)
接下來我們看看如何利用 Postman 來解決上述的問題:
1、功能區
在 Postman 中相關的功能在非常顯眼的地方,Tests 功能的使用需要我們有一定的編程語言基礎,目前支持的腳本語言即為 JavaScript 。
Postman 還為我們提供瞭一些常用的代碼模板,在 Tests 面板右邊的 SNIPPETS 功能區中。
2、腳本相關
先看上圖的代碼部分,我們可以發現 responseCode 、 responseBody 和 tests 三個變量(可直接使用) :
- pm.response.code:包含請求的返回的狀態信息(如:code)
- pm.response.text(): 為接口請求返回的數據內容(類型為字符串)
- pm.test: 為鍵值對形式,用於表示我們的測試結果成功與否,最終展示在 Test Results 中。
- key :(如:code 200)我們可以用來當做結果的一個描述
- value:其值為佈爾型,ture 表示測試通過, false 表示測試失敗。
所以上述代碼應該不難理解瞭,而有瞭返回結果的數據以及表示結果成功與否的方式,那麼我們“接口結果判斷”的問題也就基本解決瞭。
另外還有幾個比較常用的:
- 請求所耗時長 :pm.response.responseTime :
- 獲取返回數據的頭部信息:pm.response.to.have.header("”)
- 設置全局變量:pm.globals.set("variable_key", "variable_value");
- 獲取環境變量:pm.environment.get("variable_key");
3、代碼模板
Postman
在 SNIPPETS
功能區中為我們提供的代碼模板已經能解決大部分情況瞭,以下先挑幾個跟結果判斷相關的進行講解:
Status code : Code is 200
pm.test("響應狀態代碼為200", function () { pm.response.to.have.status(200); });
Response body: Contains string
pm.test("響應主體包含正確的字符串", function () { pm.expect(pm.response.text()).to.include("有我在的話"); });
Response body: is equal to string
pm.test("響應主體內容完全符合", function () { pm.response.to.have.body("主體內容"); });
Response body: JSON value check
pm.test("響應主體內容數值正確", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); });
響應頭Content-Type 時候存在
pm.test("響應頭Content-Type是存在的", function () { pm.response.to.have.header("Content-Type"); });
Response time is less than 200ms
pm.test("響應時間小於200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); });
為JSON數據使用TinyValidator
var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; });
解碼base64編碼數據
var intermediate, base64Content, // assume this has a base64 encoded value rawContent = base64Content.slice('data:application/octet-stream;base64,'.length); intermediate = CryptoJS.enc.Base64.parse(base64content); // CryptoJS is an inbuilt object, documented here: https://www.npmjs.com/package/crypto-js pm.test('Contents are valid', function() { pm.expect(CryptoJS.enc.Utf8.stringify(intermediate)).to.be.true; // a check for non-emptiness });
發送異步請求(此函數可作為預請求和測試腳本使用)
pm.sendRequest("https://postman-echo.com/get", function (err, response) { console.log(response.json()); });
將XML主體轉換為JSON對象
var jsonObject = xml2Json(responseBody);
以上介紹的這些基本已經足夠完成對單一接口的測試瞭,但我們知道如果沒有批量、定時任務, 那麼這些都將毫無意義,繼續…
二、集合(批量)測試
想要進行接口的批量測試、管理,那麼我們需要將待測試的接口全部都保存到同一個集合(Collections)
中,你可以認為就是保存到同一個文件夾中。先看看 Postman
中的操作步驟:
通過以上步驟,我們得到一個待測的接口集合,為瞭簡化情況,我這邊每個接口成功與否的條件都是用 code
是否為 200 來判斷:
pm.test("響應狀態代碼為200", function () { pm.response.to.have.status(200); });
1、批量執行
以上準備就緒後,我們就可以開始批量運行接口進行測試瞭:
點擊Run
後,會新打開一個頁面:
- Environment :用於切換接口運行的環境。
- Iteration :用於設置接口一共要運行的次數。
- Delay : 設置每次運行接口之間的時間間隔,單位為毫秒。
- Data File : 上傳測試數據文件。
2、變化的參數數據
我們已經瞭解瞭,如何讓多個接口循環運行多次,但是現在有個問題,按目前這個步驟,每次運行時接口的參數都是一樣的,那麼就算我們運行個100次、1000次意義也不大。
1、使用變量
如下圖:
引用一個變量的語法:{{變量名}}, 圖中可以看到,我們密碼字段的參數值都設置為變量{{pw}}
。修改完直接點擊運行 Send
當然是不行的,因為目前這個變量還未被賦值,不過我們可以在 Pre-request Script
面板中進行賦值操作。
2、Pre-request Script
Pre-request Script
與 Tests
類似,區別在於:Pre-request Script
中的腳本是在執行請求之前運行,而Tests
中的腳本則是在請求完成之後執行。
所以,我們可以在 Pre-request Script
功能區中用腳本先個上面兩個變量進行賦值,如:
//設置全局變量 postman.setGlobalVariable("pw", “123456”.toString(CryptoJS.enc.Hex).toUpperCase());
但是用 Pre-request Script
進行賦值操作仍然不能解決我們的問題,因為按照這種寫法,不論運行多少次其實都還是用固定(寫死)的數據進行測試。
3、測試數據集
接下來我們講講 “Data File”
, 在運行集合前的這個選項就是用來上傳測試數據(文件)以賦值給相應變量的。我們先以 CSV
格式的測試數據為例:
pw 123456 222222 123456 444444
數據格式類似表格,第一行表示對應的變量名,下面 4 行表示 4 組賬號密碼數據(其中兩組為正確數據) ,我們保存一份內容為上述示例數據後綴名為.csv
的文件後,再次開始測試看看效果,我們選擇運行次數為 4 (對應 4 組測試數據)、選擇對應的 CSV
文件運行後,可以看到我們的結果確實如我們的預期。接口 Request
運行的結果為兩次成功兩次失敗,也就是每一次運行都賦值瞭不同的賬號密碼的測試數據 (在最新的桌面客戶端版本中可以看到每次具體的請求情況,這邊就不再細說瞭)。
如果使用 Json
文件的話,那麼格式如下:
[ { "pw": "123456" }, { "pw": "222222" }, { "pw": "123456" }, { "pw": "444444" } ]
3、定期任務
Postman
提供瞭一個 Monitors
(監視器)功能,支持我們提交一個測試任務,按照設置的定時器進行運行,如每小時測試一次,具體操作如下:
三、請求依賴問題
講完接口結果判斷和集合批量測試後,我們再來看看比較復雜的情況,即依賴請求問題,比如我們的購物下訂單接口要求必須先登錄後才可訪問。但大部分依賴問題其實本質上就是一個接口間數據傳遞的問題,比如調用登錄接口後返回一個標識,假設為 token
,那麼我們請求下訂單接口時隻要一起攜帶 token
參數進行請求即可。所以,問題變為:
- 保證接口調用順序
- 將接口A返回的數據傳遞給後續的接口B、C、D
1、接口執行順序
首先,說明一下,接下來說的接口都是默認屬於同一個集合 (Collections)
中的。
還是以我們上文中創建好接口集合為例,如果你有註意我們執行批量測試的結果,就會發現接口的執行順序其實就是按照這邊目錄中的順序(從上到下),即:
Request1 -> Request2 -> Request3
。
所以有瞭這個默認的執行順序後,那麼我們便可以把需要優先執行的接口放前面即可,比如把“登錄接口”放在第一個。也可以在測試時拖動接口順序,調整接口執行順序。
2、數據傳遞
在講數據傳遞前,先聊聊 Postman
中全局變量、環境切換的使用。
1、全局變量
全局變量的概念其實我們在上文中講 Pre-request Script
時有簡單提到,也就是說我們可以通過腳本代碼來設置全局變量,我們可以看看運行上文的腳本後的效果:
我們可以看到運行後, pw
兩個變量已經被成功保存下來,那麼我們在任意接口中便都可以通過變量引用的語法如:{{pw}}
來使用它們。
另外,Postman
不僅支持代碼設置全局變量的方式,它還支持可視化操作:
進入對應界面後,便可直接進行管理:
2、多環境區分與切換
通常情況下,我們的接口都會分為測試版本和線上版本(或者更多),而他們的區別可能僅是 ULR
不同,那麼全局變量便不大合適解決這個問題。
3、變量的創建
可能你已經註意到,上圖中我已經建有幾個不同環境的變量“集合”瞭,再看一下:
我在每個環境中都創建瞭一個 host
變量,如:
當然,我們的環境參數也可以通過腳本的方式來進行設置,函數為:
//註意,該參數隻添加到你當前選擇的環境的“參數集”中 postman.setEnvironmentVariable("variable_key", "variable_value");
4、使用與切換
環境“參數集” 中的參數使用方式和全局變量一致,如圖中 {{host}}
,不同環境的切換見下圖:
3、解決依賴問題
掌握以上的預備知識後,我們開始看看如何用 Postman
解決存在依賴關系的接口測試。
1、假設場景
我們的接口 Request1
為登錄接口,登錄成功將會返回一個 access_token
字段作為標識(已實現)。那麼假設接口 Request3
為一個下訂單的接口,需要攜帶登錄返回的 access_token
才能正常訪問。
2、思路
- 保證
Request1
在Request3
之前被運行 - 將
Request1
返回的access_token
的值添加到環境變量"參數集"中。 Request3
在請求時引用access_token
的值
將返回值存在 “全局變量” 或者 “環境變量” 中,視具體業務情況而定,該例中
access_token
的值是與環境有關的,所以這裡選擇使用環境變量集存儲。
3、Postman 中的操作
我們目錄中已保證 Request1
接口優先執行,
Request1
中 Tests
的代碼情況
if(responseCode.code === 200 && responseBody.has("access_token")){ //如果 code 為 200, 並且返回的數據中存在 access_token 關鍵字,則認為登錄成功 tests["login"] = true; //將返回的內容轉為 json 格式,並且取到 access_token 內容,添加到環境變量中 var jsonData = JSON.parse(responseBody); //access_token的取值方式視具體的 json 數據結構而定 postman.setEnvironmentVariable("token",jsonData.result.access_token); //跳轉到 Request3 接口 postman.setNextRequest("Request3") }else{ tests["login"] = false; //登錄失敗,可以選擇跳轉到對應失敗後的處理接口進行測試 //postman.setNextRequest("Other Request") }
在接口Request3
中使用變量 token
:
我這邊是將 token
放在頭部信息中, 具體使用方式時接口參數規則而定。
4、運行並查看結果
運行集合測試,可以看到我們結果符合我們的預期,Request1
和 Request3
通過測試,Request2
被跳過,Request4
仍被執行。
到此這篇關於使用postman進行接口自動化測試的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- postman接口做關聯測試的方法步驟
- Postman自動化接口測試實戰
- Python實現老照片修復之上色小技巧
- Python OpenCV實現人物動漫化效果
- python調用文字識別OCR輕松搞定驗證碼