主要介紹使用postman進行web api接口主流程場景的回歸測試及測試過程中數(shù)據(jù)構(gòu)造;主要用到的是get/post請求;以及使用過程中常用的參數(shù)化,簡單的tests檢查點以及如何取登錄后的cookies
一、環(huán)境準備
1)在chrome中安裝插件postman interceptor,這個截圖是我已經(jīng)安裝好的

2)安裝postman app

二、使用postman攔截post/get請求
1)打開Request Capture開關(guān),并添加filter過濾你希望攔截的請求

2)啟動postman app

3)postman中的interceptor開關(guān)打開

4)在chrome瀏覽器操作,發(fā)現(xiàn)請求被攔截在postman的history下

5)在collection下新建一個collection

點擊切換到history下,點擊請求后面的+,直接把請求放到剛剛新建的collection中,方便后期調(diào)試

6)導(dǎo)出保存的請求文件


三、調(diào)試及參數(shù)化post/get請求
以上通過interceptor插件安裝的postman app是插件版本的,沒有控制臺窗口,不方便調(diào)試,此時可以在postman官網(wǎng)重新下載個非插件版的app,直接啟動這個app
1)導(dǎo)入之前保存的腳本

2)參數(shù)化可變的值,從environment文件讀取變量
PS:postman讀取環(huán)境變量常見的有4種,本篇介紹從environment文件中讀取
點擊manage environments->點擊add

然后編輯剛新建的環(huán)境變量文件,輸入需要引用的變量名和變量值,點擊update

在請求中引用環(huán)境變量,默認方式{{變量名}}

3)在Pre-request Script 和Tests編寫腳本
Pre-request Script 是在請求發(fā)送前執(zhí)行,Tests主要用于添加校驗點以及獲取response body中值作為下個請求中的參數(shù);
PS:postman常用的方法,可參看官方文檔
https://www.getpostman.com/docs/v6/postman/scripts/test_examples

4)調(diào)試打印變量,使用cosole.log(需要打印的內(nèi)容)
?首先在Tests中使用cosole.log()方法,比如

打開console

點擊send發(fā)送請求,發(fā)現(xiàn)控制臺會打印出值

四、runner 運行collection
點擊runner-->選擇需要執(zhí)行的collection-->選擇需要用到的環(huán)境變量文件-->設(shè)置運行參數(shù)

PS:常見4類變量作用域:
Global: 全局變量,postman中所有請求都可以訪問或者修改;
Environment: 構(gòu)造請求時可以選擇使用某個Environment,這樣就可以訪問或者修改該Environment下的所有變量;
Local: 腳本中定義的變量,只對腳本的當前作用域有用;
Data: 只有在使用?Collection Runner?的時候,可以通過導(dǎo)入 Data Files 來構(gòu)造當前測試集中用到的數(shù)據(jù)。
作用域:Global<Collection<environment<local
1)關(guān)于變量引用遇到的問題
如果environment設(shè)置的變量,collection運行結(jié)束后environment中值無法變更
參考:https://www.cnblogs.com/majunBK/articles/9447021.html
原因:runner運行設(shè)置前沒有勾選keep variable value,如果不勾選keep variable value,則運行Collection Runner中修改的任何變量都不會影響Postman主應(yīng)用中對應(yīng)的環(huán)境變量值,在Collection Runner運行完成后恢復(fù)environment原始的值
如果運行時勾選keep variable value,則Collection Runner運行完成后Postman主應(yīng)用中對應(yīng)的環(huán)境變量值變更,主要使用場景:比如第一個collection執(zhí)行結(jié)束后環(huán)境變量值需要變更作為第二個collection執(zhí)行環(huán)境變量值的輸入

2、遇到的問題
1)runner時報錯Data unavailable(Only data about the top 10 historical runs is stored)

詳細原因:http://www.itdecent.cn/p/b6e934e4601e
可能解決的辦法:
1)調(diào)整請求執(zhí)行順序
2)在容易出現(xiàn)這個錯請求的上一個請求tests中加等待時間
setTimeout(()=>console.log('等待'), 3000);
3、常用的方法總結(jié)
參考文檔https://www.getpostman.com/docs/v6/postman/scripts/test_examples
1)取cookies里面的token
? var token = postman.getResponseCookie("a9a68f4fefd3b693f10be4a89799dc48").value
? console.log('token123',token);
? pm.environment.set("token", token);

2)環(huán)境變量
//清楚上一次執(zhí)行保存的值
pm.globals.unset(onlineTradeNo);
//將訂單號傳入環(huán)境變量
pm.globals.set("onlineTradeNo",onlineTradeNo.data[0].tid);
//獲取環(huán)境變量
pm.globals.get("AdminIdOne");
3)返回狀態(tài)校驗200
//校驗response返回200
tests["Status code is 200"] = responseCode.code === 200;
4)獲取response里面的tid
//獲取response的body中生成的訂單號,如果不是數(shù)組的話可直接取
var onlineTradeNo = JSON.parse(responseBody);
console.log("onlineTradeNo",onlineTradeNo.data[0].tid);---數(shù)組寫法
console.log("onlineTradeNo", onlineTradeNo.data.tid);---非數(shù)組

5)從環(huán)境變量獲取數(shù)組中1個值
//取環(huán)境變量中待審核的訂單狀態(tài)
var array=pm.environment.get("data_entry");
var value=JSON.parse(array)[0];
// console.log("value is"+" "+value);
//校驗狀態(tài)是否是期望值是否=audit
pm.test("applyStatus is audit", function () {
? ? var jsonData = pm.response.json();
? ? // console.log(jsonData.data.applyStatus);
? ? pm.expect(jsonData.data.applyStatus).to.eql(value);
});
6)Tests中設(shè)置等待時間
setTimeout(()=>console.log('等待'), 3000);

setTimeout(function(){}, 3000)
7)在Tests中通過設(shè)置腳本控制API的執(zhí)行順序
參考文檔:http://www.itdecent.cn/p/a3b4794ab283
當前請求Tests中添加:postman.setNextRequest('下一個需要執(zhí)行請求名稱')
最后1個請求Tests中添加:postman.setNextRequest("null")
8)for循環(huán)的使用,比如根據(jù)一個出庫單可以查詢出2條庫存流水,需要把庫存流水值相加
//獲取出庫單(可能是多條)和出庫數(shù)量(相加)
var DN=pm.environment.get("deliveryOrder");
var number=parseFloat(pm.environment.get("delivery_num"));
var newstocks=0;
for(var i in jsonData.data.data){
? ? if(jsonData.data.data[i].relatedNo == DN){
? ? newstocks += jsonData.data.data[i].newChangeStocks;
? ?}
}
? pm.expect(newstocks).to.eql(number)