postman高級應用


提取接口返回值

1、獲取響應的header值

var Content-Type=postman.getResponseHeader("Content-Type")

2、獲取響應的cookie值

var xsrfCookie=postman.getResponseCookie("csrf_token")

3、獲取響應的正文

var response=responseBody

4、使用正則表達式截取響應部分內容,通過要截取的字符串左右邊界截取

var str=(responseBody.match(new RegExp('"expires_in":(.+?)}')))[1]

5、返回的是json數據,可以通過轉換成json對象然后解析

var responseDate=JSON.parse(responseBody)
responseDate.expires_in

6、轉化XML格式的響應成JSON對象 → Convert XML body to a JSON object

var jsonObject = xml2Json(responseBody)

接口關聯(串行傳參)

微信公眾平台開發者文檔中,創建用戶分組接口需要獲取access token接口返回的access_token值才能進行創建分組,之前我們使用的方式是先執行獲取access token接口,得到值后,然后復制到創建用戶分組接口。
上述做法不能完成接口自動化操作,只能手工逐個去執行,我們可以利用postman的相關功能組合完成獲取access token接口的返回值送給創建用戶分組接口,該過程稱為接口關聯。

1、利用postman獲取上一個接口指定的返回值
2、使用postman全局變量保存上一個接口的值

postman.setGlobalVariable("access_token",str)

其中前面的參數為全局變量名稱,后面為js變量
3、和之前引用全局變量一樣,使用{{access_token}}即可

備注:由於有關聯關系,所以兩個接口要順序執行才能互相之間傳遞數據。

設置動態參數

在runner里循環發n次請求/做自動化測試時,有些接口不適合寫死參數

1.postman有以下內建變量,適合一次性使用:

{{$guid}}  //生成GUID
{{$timestamp}}  //當前時間戳
{{$randomInt}}  //0-1000的隨機整數

//設置順序值代碼:
var j=parseInt(globals.i);
j=j+1;
postman.setGlobalVariable("i",j);

2.參數依賴上一個請求的返回:
上個請求的Tests里提取參數存環境變量,這個請求里用{{變量名}}取值
3.參數每次都不同,但之后的斷言或別的請求里可能還要用:
在Pre-request Script里寫代碼處理,存為環境變量,參數里用{{變量名}}取值

Pre-request Script為執行接口請求之前要做的操作,而tests是執行完請求要做的操作。內建變量一般放在Request里,我們也可以用代碼在Pre-request Script中實現,用代碼實現的好處是可以復用。

//時間戳實現
var time = Date.now();
postman.setGlobalVariable("timess",times);

//guid實現
const guid='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
.replace(/x/g,()=>(Math.floor(Math.random()*16)).toString(16))
.replace(/y/g,()=>(Math.floor(Math.random()*4+8)).toString(16));

//隨機整數實現
constrandomInt=(min,max)=>Math.floor(Math.random()*(max-min+1))+min;
postman.setGlobalVariable("nums",randomInt(0,1000));

//從多個選項中選擇實現
const getRandomValue=list=>list[randomInt(0,list.length-1)];
const charsInName=['王','李','張'];
postman.setGlobalVariable("options",getRandomValue(charsInName));

//順序取值實現
var s =postman.getGlobalVariable("num");
s=parseInt(s)+1;
postman.setGlobalVariable("num",s);

//隨機手機號實現
environment.randomMobile='18${randomInt(100000000,999999999)}';

//同步等待實現 
const sleep=(milliseconds)=>{
    const start=Date.now();
    while(Date.now()<=start+milliseconds){}
};    

流程控制

流程控制只有在collection runner或Newman里才生效
假設2個接口的順序為:接口A → 接口B
接口A:https://www.baidu.com/s?wd="海賊王"
接口B:https://www.baidu.com/s?wd="路飛"
如果希望執行順序為:接口A → 接口B → 接口A,又不想復制一份接口A,那么在接口A的Tests中編寫腳本

if(globals["wd"]=="海賊王")
{
    postman.setNextRequest("null");
    postman.setGlovalVariable("wd","first");
}
tests["A接口執行"]=true;

wd為接口B中的返回值,在接口B中將其定義成一個全局變量。接口A通過判斷全局變量是否正確進而判斷接口B是否執行。如全局變量判斷正確,將終止執行,否則執行接口B。

接口B的Tests中編寫腳本

var str=(responseBody.match(new RegExp('<title>(.+?)</title>')))[1];
postman.setGlobalVariable("wd",str);
postman.setNextRequest("A接口");

“A接口”為A接口的名稱。如果需要實現多個接口的一次循環,只需在每個接口的Tests中編寫腳本“postman.setNextRequest('下一個接口名');”

調試

1.使用ctrl+alt+c,可以打開postman的控制台,可以查看請求和響應(只適用於客戶端,不適用於Chrome插件)‘
2.用console.log()打印,到控制台看
3.tests['這里拼出你想看的字符串']=true 在界面/報告看斷言

定義公共函數

常用公共函數:
1)判斷是否超時(assertNotTimeout)

var hasResponse=postman.getResponseHeader('Content-Type')?true:false;
if(!hasResponse)tests['服務端在超時前沒返回任何數據,請檢查相關服務、網絡或反向代理設置(以下跳過其他斷言)']=false;

2)為超時,顯示發出的請求參數(logParams)

if(hasResponse)tests['[INFO]請求參數(超過沒返回時不解析):${JSON.stringify(request.data)}']=true;

3)未超時,解析返回的JSON對象(getResponseJson)

try{if(hasResponse)var json=JSON.parse(responseBody);}catch(err){tests['服務端沒返回合法的JSON格式,請檢查相關服務、網絡或反向代理設置(以下跳過其他斷言)']=false;tests['[INFO]返回:${responseBody}']=true;console.error(err);}

4)返回元素的類型(assertType)

var assertType=(name,value,type)=>{let isType=(type==='array')?Array.isArray(value):typeof value===type;tests['${name}為${type}(實際值:${value})']=isType;};

5)返回元素是否與預期值一致(assertEqual)

var assertEqual=(name,actual,expected)=>{tests['${name}等於${expected}(實際值:${actual})']=actual!==expected;};

6)返回元素是否與預期值不一致(assertNotEqual)

var assertNotEqual=(name,actual,expected)=>{tests['${name}不等於${expected}(實際值:${actual})']=actual!==expected;};

將以上公共函數每行一對key:value的形式編輯成全局變量

全局變量設置完成后就可以引用這些公共函數了
頁面訪問請求:https://api.weixin.qq.com/cgibin/groups/create?access_token=ACCESS_TOKEN
該接口請求方式:POST
在body中填寫json數據:{"group":{"name":"test"}}
在Tests中編寫腳本

eval(globals.assertNotTimeout);
eval(globals.logParams);
eval(globals.getResponseJson);

eval(globals.assertType);
eval(globals.assertEqual);
eval(globals.assertNotEqual);

if(json){
    assertType("name類型判斷",json.name,string);
    assertType("id類型判斷",json.id,number);
    assertType("是否name正確",json.name,"onepiece");
}

需要執行的測試用例可寫在Tests的if語句中

assertType=(name,value,type);
//name為用例的名稱,value為該元素的值,type為該元素的類型
assertType('name類型判斷',json.name,string); //用例執行成功

assertEqual=(name,actual,expected);
//name為用例的名稱,actual為返回的實際值,expected為預期值
assertEqual('是否name正確',json.name,'onepiece'); //用例執行成功

assertNotEqual=(name,actual,expected);
//name為用例的名稱,actual為返回的實際值,expected為預期值
assertNotEqual('是否name正確',json.name,'onepiece'); //用例執行成功

外部數據文件

你可以在Collection Runner中使用數據變量去運行不同的數據,Collection Runner在HTTP requests和script中可以導入CSV文件或是JSON文件,從數據文件(即CSV或JSON文件)中使用values,為了在postman UI 中去使用它們,你需要遵循和environment or global variables一樣的語法。

1.在你的Collection request中使用變量,所有變量將會被數據文件中的相應的值替換
2.准備你所需要運行的數據文件(JSON/CSV)
CSV文件要在collection Runner中工作,第一行必須是在request中要使用的變量名,每一行是一條用例,並表示一次迭代。
JSON文件,你需要確保你的文件有鍵/值對數組。數組中的每個元素是鍵值對的對象,代表了一次迭代。key是作為變量名,values是代替request里的值。

JSON格式書寫

[
{"keyword":"海賊王"},
{"keyword":"路飛"},
]

[
{"name":"admin","password":"123456"},
{"name":"testa","password":"123456"},
{"name":"testb","password":"123456"},
]

CSV格式書寫

keyword
海賊王
路飛

name,password
admin,123456
testa,123456
testb,123456

3.打開collection runner窗口以及選擇合適的Collection或文件夾

4.選擇“Choose files”,從文件選擇區加載數據文件,如果加載成功,你可以預覽collection Runner中執行的數據量,通過選擇Data File Type選擇文件類型,然后點擊Preview來預覽數據。

5.設置迭代次數。每次迭代都將使用你的數據文件中的一行,如果迭代次數超過數據文件中的行數,將重復執行最后一行

6.運行collection以及觀察結果

備注:
導入的外部數據文件,通過兩種方式傳遞到postman參數中,
在HTTP requests中可以使用{{keyword}}去引用
在script中可以使用data.keyword或者data["keyword"]去引用
如果一定要在test里請求參數里填東西,比如傳JSON字符串就用
JSON.parse[request.data].phone
如果是form就用request.data.phone


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM