PostMan介面測試(很全面的介面測試教程)
一:理論部分
1. 前言
在前後端分離開發時,後端工作人員完成系統介面開發後,需要與前端人員對接,測試調試介面,驗證介面的正確性可用性。而這要求前端開發進度和後端進度保持基本一致,任何一方的進度跟不上,都無法及時完成功能模組的測試。
做為後端開發人員,要求獨立開發完成某個介面後,開發人員自己需要先測試通過後再提交給測試人員進行測試,否則會出現到測試人員哪裡業務流程根本就走不通,或者BUG會過多的情況等。
市場上有很多優秀的,完善的介面測試工具,比如SoapUI,Postman,JMeter、yapi等,能夠高效的幫助後端開發人員獨立進行介面測試。這裡使用Postman介面測試工具,分別介紹如何對GET請求和POST請求進行介面測試。
2. Postman簡介
Postman是一個介面測試工具,在做介面測試的時候,Postman相當於一個客戶端,它可以模擬用戶發起的各類HTTP請求,將請求數據發送至服務端,獲取對應的響應結果,
從而驗證響應中的結果數據是否和預期值相匹配;並確保開發人員能夠及時處理介面中的bug,進而保證產品上線之後的穩定性和安全性。
它主要是用來模擬各種HTTP請求的(如:get/post/delete/put..等等),Postman與瀏覽器的區別在於有的瀏覽器不能輸出Json格式,而Postman更直觀介面返回的結果。
3.Postman介面圖
各個功能區的使用如下:
l 快捷區: 快捷區提供常用的操作入口,包括運行收藏夾的一組測試數據,導入別人共享的收藏夾測試數據(Import from file, Import from folder, Import from link等),或新建請求、收藏夾、環境變數等。
l 側邊欄: 包括搜索欄, Request 請求的歷史記錄和收藏夾管理。
l 功能區: Request 請求設置,查看 Response 響應結果和測試結果,可以將請求保存到收藏夾。
l 設置區:設置和管理環境變數和全局變數。
二:工具應用
1. 新建介面
1.1 創建Collection集合
在剛開始一個項目時,為了後續便於組織和管理,把同屬該項目的多個 API,放在一組裡。所以要先去新建一個 Collection: New -> Collection
1.2 創建請求
1.3 設置HTTP請求
設置 HTTP 的 Method 方法和輸入 api 的地址以及請求參數或請求體
以下為獲取微信公眾號為案例所設計的HTTP請求
GET是請求方法,請求方法是HTTP請求的必要要素,常見的請求方法有GET和POST兩種。API地址一般為URL地址。如果是請求URL中的入參,會在Params列出參數名稱及參數取值,方便我們輕鬆的修改各入參的值。如有需要,還應該設置HTTP請求Headers部分。
如果是POST請求,需要將請求方法設置為POST,一般說來POST請求是有請求體的,固需要在Body部分中編寫正確的請求body內容和Content-Type的值(在Headers中進行設置)
1.3.1 GET和POST的區別
l GET 使用URL 或Cookie 傳參,而POST將數據放在Body 中。
l GET的URL 在長度上會有限制,而POST沒有。
l POST比GET相對安全,因為在地址欄不可見。
l 一般POST請求用來獲取數據,POST請求用來發送數據。
對於上面的區別,其實第一點POST也可以將數據放在URL里,GET請求其實也沒有長度限制,POST請求看起來是隱式的,但是可以通過抓包拿到參數。
1.4 發送HTTP請求
點擊上圖中藍色Send圖標即可發送請求,驗證請求結果是否正確。下圖是對應的響應結果,包含Body和Headers兩個部分,Body即響應體正文,Headers即為響應頭資訊,響應頭不包含響應狀態碼和狀態資訊部分。
響應體包含三種查看模式,分別為:Pretty默認模式、Raw原始數據格式,Preview預覽模式(此模式針對HTML頁面效果很好)。
1.5 關聯技術
關鍵技術是將前一個請求的響應結果保存到變數中,再將此變數在後續請求中進行引用。
1.5.1 保存前一個請求的響應數據
因為Tests模組是後置模式,可對響應進行處理。我們可以通過賦值方式把響應結果保存到變數中,參考程式碼如下:
1.5.2 對後一個請求進行參數化
因前面將access_token的值保存到了環境變數中,所以在該請求中,只需要進行參數引用即可。
1.5.3 關聯的高級操作
利用Send a request實現前置步驟,例如:客服發消息模組,前置步驟是獲取access_token,我們可在Pre-request Script前置步驟中發送請求,將該請求的結果保存到環境變數accesstoken中,然後在主請求中引用該環境變數即可。
1.5.4 附:前置步驟中發送POST請求
POST請求相比GET請求要複雜一點,因為其需要加入請求Header和請求Body,以下是Pre-request Script在發送POST請求的案例:
- 構造一個登錄請求
const loginRequest = {
url: '//115.28.108.130:5000/api/user/login/',
method: "POST",
body: {
mode: 'urlencoded', // 模式為表單url編碼模式
urlencoded: 'name=張三&password=123456'
}
};
- 發送請求
pm.sendRequest(loginRequest, function (err, res) {
console.log(err ? err : res.text());
});
發送JSON格式請求與發送POST請求類似,以下採用了raw模式發送請求體。
- 構造一個註冊請求
const regRequest = {
url: '//115.28.108.130:5000/api/user/reg/',
method: 'POST',
header: 'Content-Type: application/json', //注意要在Header中聲明內容使用的類型
body: {
mode: 'raw', // 使用raw(原始)格式
raw: JSON.stringify({ name: '小小', password: '123456' }) //要將JSON對象轉為文本發送
}
};
- 發送請求
pm.sendRequest(regRequest, function (err, res) {
console.log(err ? err : res.json()); // 響應為JSON格式可以使用res.json()獲取到JSON對象
});
因為HTTP請求都支援raw格式,我們只要能夠獲取請求的raw格式,便可採用raw模式發送任意類型的請求體了。
2.介面數據用例
2.1 數據用例設計
Postman支援的是csv文件作為數據用例,數據用例包含三大部分,分別為:用例標題(title),入參(grant_type,appid,secret),期望結果(expected)
title | grant_type | appid | secret | expected |
---|---|---|---|---|
正確的用例 | client_credential | wx508a5cacbbfc1141 | fa4fc7f17ddead12d7cdcd994e7d2543 | 7200 |
grant_type錯誤 | client_credentia | wx508a5cacbbfc1141 | fa4fc7f17ddead12d7cdcd994e7d2543 | 40002 |
appid錯誤 | client_credential | wx508a5cacbbfc114 | fa4fc7f17ddead12d7cdcd994e7d2543 | 40013 |
secret錯誤h | client_credential | wx508a5cacbbfc1141 | fa4fc7f17ddead12d7cdcd994e7d254 | 40001 |
我們可以根據黑盒用例設計方法如等價類、邊界值、判定表、正交實驗法對入參進行用例設計,得到各種不同的測試場景(取值組合)
2.2 數據用例參數化
前面我們在csv文件中編寫好了數據用例,且保證第一行為參數的名稱。將請求中入參值依次進行替換,在Postman中參數的編寫規格為兩個花括弧,如:{{appid}}
2.3 設置迭代器
要讀取所有的測試用例,需要設置迭代器讓其循環讀取那些測試數據。Postman中設置迭代器需在Run中完成,請看【4.Runner執行測試】
3.結果檢查(斷言)
Postman的斷言功能在Test模組中,比如要測試返回結果是否含有某一字元串,就需要在Test中編寫相應的程式碼,Test中的程式碼使用的是JavaScript語法。
3.1 Postman自帶Tests函數
Postman提供了參考程式碼供我們選擇即可,主要斷言程式碼有如下幾種:
# 斷言狀態碼是否為200,在斷言中此種斷言價值不高
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
# 斷言響應文本中是否包含某個數據串,常用
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
# 使用JsonPath斷言
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
# 檢查響應正文中是否包含某個子串
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
# 響應資訊包含列表中其中某一個
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
# 將xml響應轉為json
var jsonObject = xml2Json(responseBody);
3.2 手工tests函數
也可以使用斷言並賦值的形式,相對而言,以下方式會更為簡潔實用。
常見的斷言程式碼有:
# 檢查response的body中是否包含字元串
tests["Body matches string"] = responseBody.has("string_you_want_to_search");
# 檢查JSON節點的值和節點元素的個數為5
var data = JSON.parse(responseBody).city; //把JSON字元串轉化為對象
tests["Your test name"] = data.value===100;
tests["program's lenght"] = data.programs.length===5;
# 驗證Response time是否小於某個值
tests["Response time is less than 200ms"] = responseTime < 200;
3.3 tests高級操作
我們可以引用數據用例csv文檔中的預期結果進行斷言。
var jsonData = JSON.parse(responseBody) ;
# data.expected 為csv數據文件中的預期結
tests["測試結果通過"] = jsonData.expires_in===data.expected ;
在tests還可以使用判斷語句進行斷言,如下:
在Postman中斷言的操作非常靈活,需要同學們多進行練習。
pm.test("預期結果包含:長沙,實際結果為:"+result, function () {
if(JSON.parse(responseBody).city==="長沙"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("長沙");
}else if(JSON.parse(responseBody).city==="Changsha"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("Changsha");
}else if(JSON.parse(responseBody).city==="長沙"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("長沙");
}
});
4.Runner執行測試
4.1 設置迭代器
4.2 查看運行結果
三:其他事項
1.保存介面配置
待整個介面都調試完畢後,記得點擊 Save 去保存介面資訊:
去保存當前 API 介面,然後需要填寫相關的介面資訊:
l Request Name: 請求的名字
我一般習慣用保存為 介面的最後的欄位名,比如
l Request Description: 介面的描述
最好寫上該介面的要實現的基本功能和相關注意事項
支援 Markdown 語法
Select a collection or folder to save: 選擇要保存到哪個分組(或文件夾)
往往保存到某個 API 介面到所屬的該項目名的分組
2. Postman的參數
2.1 自動解析多個參數Param
比如,對於一個 GET 的請求的 url 是: //api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx508a5cacbbfc1141&secret=fa4fc7f17ddead12d7cdcd994e7d2543
對應著其實是?key=value形式中包含多個 Http 的 GET 的 query string=query parameters
Postman 可以自動幫我們解析出對應參數:
2.2 臨時禁用參數
在不刪除某參數的情況下,如果想要暫時不傳參數,可以方便的通過不勾選的方式去實現
2.3 批量編輯多個參數
如果想要批量的編輯參數,可以點擊右上角的Bulk Edit,去實現批量編輯。
3. Postman發送POST請求詳講
POST 請求不能像GET一樣直接在瀏覽器輸入就可以請求,需要藉助工具來完成。
3.1.1 發送key-value 的請求:
以login 介面為例,在Body 中選取“form-data” 格式,輸入所需的key-value, 選取對應的環境變數。
3.1.2 發送json格式的請求:
以add user 介面為例,在Body 中選取“raw” 格式,根據介面文檔輸入json 數據, 有需要應用環境變數的選取環境變數。
3.1.3 發送文件的請求
以file upload 介面為例,在Body 中選取“form-data” 格式,在key 里輸入”file”,在右邊的下拉里選取類型為”File”,點擊”Choose Files” 就可以上傳本地文件了。
4. 環境變數設置
4.1 設置環境變數的意義
在測試 API 期間,往往存在多種環境,對應 IP 地址(或域名也不同)。比如:
Dev://192.168.1.21/oa/index.jsp
l 用於開發期間的線上的 Development 的測試環境
LocalTest://192.168.1.42/oa/index.jsp
l 用於開發期間配合後台開發人員的本地區域網內的本地環境,用於聯合調試 API 介面
Product://www.example.com/oa/index.jsp
l 用於開發完成發布到生產環境
在測試API期間,往往需要修改API地址,這樣效率會比較低且更換後的地址沒法保存。
4.2 環境變數設置
在Postman的設置區有Environment 和 Global Variable,用於解決這個問題,實現不同環境的管理:
很明顯,就可以用來實現不用手動修改 url 中的伺服器地址,從而動態的實現,支援不同伺服器環境:
l Production 生產環境
l Development 開發環境
l Local 本地區域網環境
環境變數可以使用在以下地方:
l URL
l URL params
l Header values
l form-data/url-encoded values
l Raw body content
注意:在你要使用的變數名上附上雙花括弧,一個請求只能應用一個環境變數。
4.3 使用程式碼設置環境變數
我們可以在Pre-request Script和Test模組中進行環境變數設置。
–1.設置環境變數
postman.setEnvironmentVariable("key", "value");
–2.獲取環境變數
pm.environment.get("variable_key");
4.4 全局變數
全局變數(Global Variable)顧名思義是針對於所有腳本和所有環境將生效的變數,它的作用域大於環境變數。設置全局變數的方法與環境變數相似:
–1.設置全局變數
pm.globals.set("variable_key", "variable_value");
–2.獲取全局變數
pm.globals.get("variable_key");