學(xué)習(xí)目錄:(主要講解發(fā)送json請求)
1.postman簡介
2.postman安裝
3.頁面介紹
4.舉例湾宙,做一個簡單的API(post/get)請求
5.response響應(yīng)
6.斷言設(shè)置
7.變量設(shè)置
8.獲取cookies并應(yīng)用
9.鑒權(quán)(獲取token并應(yīng)用)
10.Pre-request Script 詳解
11.collection運行(參數(shù)化)
12.在命令行運行postman腳本
一:postman簡介
Postman可以發(fā)送幾乎所有類型的HTTP請求。適用于不同的操作系統(tǒng)冈绊,Mac侠鳄、WindowsX32、Windows X64死宣、Linux系統(tǒng)等伟恶。可以進行接口自動化測試毅该,可用postman代替人工接口測試博秫,面向所有測試從業(yè)人員潦牛。
使用場景:
(1)開發(fā)接口時快速調(diào)用接口,調(diào)試接口
(2)測試時方便調(diào)用接口挡育,通過不同參數(shù)測試接口輸出
(3)接口可保存下來且反復(fù)運行
(4)支持斷言
postman相關(guān)資料:
(1)官網(wǎng)及下載地址:https://www.getpostman.com/
(2)官方文檔:https://www.getpostman.com/docs/
二:postman安裝
Postman最早是作用在Chrome瀏覽器插件存在的巴碗,可以到Chrome商店搜索下載安裝,也可以找別人共享的Postman插件文件進行安裝即寒,2018年初Chrome停止了對Postman應(yīng)用程序的支持橡淆。目前Chrome應(yīng)用商店能使用的就是Chrome擴展程序和主題背景。
目前Postman提供了獨立安裝包蒿叠,可以不再依賴于Chrome瀏覽器明垢,推薦使用這種方式安裝。本地安裝下載地址:https://www.getpostman.com/apps市咽,下載后直接點擊下一步進行安裝痊银。
三:頁面介紹
postman界面分為左右兩部分,左側(cè)為接口集施绎,右側(cè)為請求和響應(yīng)溯革。
http請求包括4部分:url,method,headers,body
(1)method:get/post....
(2)RequestBody:根據(jù)body類型有不同的控制
——form-data:是表單用來傳遞的默認格式谷醉,可以模擬填寫表單并提交表單致稀。既可以填寫key-value健值,也可以上傳file作為key的value傳遞俱尼,但是file不會被保存
——x-www-form-urlencoded:會將表單內(nèi)的數(shù)據(jù)轉(zhuǎn)換為健值
——raw:可上傳任意格式的文本抖单,包括:text、json遇八、xml矛绘、html等
——binary:只上傳二進制數(shù)據(jù),一次只能上傳一個文件且不能保存歷史
(3)headers:Content-Type的值根據(jù)body類型有不同的控制
——如果發(fā)送表單請求刃永,則Content-Type=application/x-www-form-urlencoded
——如果發(fā)送json請求货矮,則Content-Type=application/json
——如果發(fā)送二進制請求:則Content-Type=application/octet-stream
四:舉例,做一個簡單的API(post/get)請求
我們以v2ex的api地址為例:https://www.v2ex.com/api/topics/hot.json斯够,選擇method為get囚玫,點send,顯示返回結(jié)果及相應(yīng)狀態(tài)读规。
響應(yīng)結(jié)果可以以多種類型展示抓督,如:json、xml束亏、html铃在、text等,查看展現(xiàn)方式可以在headers中Content-Type查看
send請求后枪汪,可在左側(cè)History中查看涌穆,方便再次調(diào)試
以下是http狀態(tài)碼以及對應(yīng)的含義,可以作為測試過程中的參考:
status總結(jié):相應(yīng)status為2xx雀久、3xx開頭表示ok宿稀,4xx表示沒有鑒權(quán)或參數(shù)錯誤,5xx表示bug赖捌。
body總結(jié):一般get請求沒有body祝沸,post請求才有body;而響應(yīng)的結(jié)果不一定有body(一般201和204響應(yīng)不會有body)越庇。
五:response響應(yīng)
http://www.manongjc.com/detail/8-latesalslqgqsey.html
responseHeaders {Object}:獲取response的頭部信息罩锐,使用postman.getResponseHeader(key) 或?responseHeaders[key]獲取對應(yīng)key的value值;
responseCookies {Array}:返回一個數(shù)組卤唉,可以通過postman.getResponseCookie(cookieName)?獲取cookie信息涩惑;
responseBody {string}:返回響應(yīng)正文文本的字符串,可以用JSON.parse()轉(zhuǎn)成數(shù)組桑驱;
responseTime {number}:返回響應(yīng)時間,單位ms;
responseCode[String] {Object}:返回的狀態(tài)碼拔第,不帶參數(shù)會返回4個屬性拌喉。 常用的屬性是 code 就是狀態(tài)碼;
六:斷言設(shè)置
斷言就是實際結(jié)果和預(yù)期對比押框,如果一致岔绸,則用例通過,如果不一致橡伞,斷言失敗盒揉,用例失敗。斷言在Tests中編寫骑歹,用到postman tests 這個模塊预烙。
// 檢查響應(yīng)body是否包含字符串
pm.test("Body matches string",?function?() {
????pm.expect(pm.response.text()).to.include("string");
});
// 檢查響應(yīng)body是否等于一個字符串
pm.test("Body is correct",?function?() {
????pm.response.to.have.body("response_body_string");
});
// 檢查響應(yīng)body中某個字段值
pm.test("Your test name",?function?() {
????var?res= pm.response.json();
????pm.expect(res.key).to.eql(value);? ? ? // res.key根據(jù)實際情況獲取
});
// 檢查headers中某個key存在
pm.test("XXX is present", function(){
? ? pm.response.to.have.header("Content-Type");
});
// 檢查響應(yīng)時間<200ms
pm.test("Response time is less than 200ms", function(){
? ? pm.expect(pm.response.responseTime).to.be.below(200);
});
// 檢查狀態(tài)碼status=200(三種方法)
pm.test("Status code is 200",function(){
? ? pm.response.to.have.status(200);
? ? pm.expect(pm.response).to.have.status(200);
? ? pm.expect(pm.response).to.be.success;
????pm.expect(pm.response.code).to.be.eql(200);
});
// 成功的post請求狀態(tài)碼
pm.test("Successful POST request", function()}{
????pm.expect(pm.response.code).to.be.oneOf([200,202]);
});
七:變量設(shè)置?
為什么在代碼中會使用變量呢?
原因:變量允許我們在多個地方重復(fù)使用道媚,以便保持代碼的可讀性扁掸、可維護性等。另外最域,如果想改變這個值谴分,我們只需要改變變量的值即可,其它引用該變量的地方會自動變動镀脂,減少了代碼修改牺蹄。
Global全局變量,Environment環(huán)境變量(可設(shè)置多個)
變量的引用:{{ 變量名 }}
變量優(yōu)先級:數(shù)據(jù)變量 > 環(huán)境變量 > 全局變量
在postman右上角點擊小眼睛薄翅,里面可設(shè)置全部變量和環(huán)境變量
我們將鼠標移到變量上沙兰,會顯示變量的值
設(shè)置變量(在Tests中編寫腳本)
設(shè)置環(huán)境變量:pm.environment.set("key","value");? ?// 執(zhí)行后在當前環(huán)境變量中保存
設(shè)置全局變量:pm.globals.set("key","value");? ?//?執(zhí)行后在全部變量中保存
獲取變量
獲取環(huán)境變量:pm.environment.get("key");? ?或 postman.getEnvironmentVariable("key");
獲取全局變量:pm.globals.get("key"); ? ?或 postman.getGlobalVariable("key");
從環(huán)境變量和全局變量中搜索變量,優(yōu)先從環(huán)境變量中搜索獲取變量: pm.variables.get("key");
清除變量
清除環(huán)境變量:pm.environment.unset("key");
清除全局變量:pm.globals.unset("key");
驗證responseBody中某key—>value與環(huán)境變量一致鼎天,var res = JSON.parse(responseBody) = {"name":"yanan"}
舉例1:設(shè)置了環(huán)境變量為 namecode=yanan
var value = postman.getEnvironmentVariable("namecode");? ? ? // value===yanan
tests["響應(yīng)結(jié)果的值正確"]=res.name===value;
舉例2:未設(shè)置環(huán)境變量舀奶,從文件中取值。文件名:test.json斋射,文件內(nèi)容:["namecode":"yanan","namecode":"gansu","namecode":"chifeng"]
tests["響應(yīng)結(jié)果的值正確"]=res.name===data.namecode;? ? // 注意:讀取json文件中的值用data.key
八:獲取cookies并應(yīng)用
一般登錄API執(zhí)行后育勺,postman會自動保存cookies。點擊下圖Cookies罗岖,查看測試環(huán)境下的cookie
在下一個API運行時涧至,postman可自動拿到cookie的值,并在requestHeaders中傳遞桑包。
調(diào)試cookies南蓬,腳本代碼實現(xiàn):
(1)如果響應(yīng)的headers中有set-cookie,則使用:
console.log(responseHeaders);? ? // 打印響應(yīng)的Headers
?//打印響應(yīng)的Headers中的set-cookie值
console.log(responseHeaders["set-cookie"]);
console.log(postman.getResponseHeader("set-cookie"));
(2)如果響應(yīng)的cookie在Cookies里顯示哑了,則獲取腳本:
var coo = postman.getResponseCookie("JSESSIONID");?
或?? var coo =?pm.cookies.get("JSESSIONID") ;? ? ? ?// JSESSIONID 為cookie的key
console.log(coo["value"]);
九:鑒權(quán)(獲取token并應(yīng)用)
postman的鑒權(quán)蓖康,就是鑒定你有沒有訪問權(quán)限。一般測到需要登錄的接口垒手,如果沒有保持登錄狀態(tài)就沒法訪問蒜焊。
方法一:在Authorization下選擇“Basic Auth”,填寫Username和Password就可以啦
這種方法的優(yōu)缺點:
——優(yōu)點:操作方便科贬,只要輸入一次賬號密碼泳梆,postman會自動記住它;
——缺點:如果登錄用戶名變了榜掌,該方法就不適用了优妙;
方法二:保存登錄接口返回的token值,在requestHeaders中添加參數(shù)憎账,key=‘Authorization’套硼,value=‘TOKEN’+空格+‘token值’
這種方法的缺點是:每個接口都需要在Headers下添加key 和 values值
方法三:保存登錄接口返回的token值,并添加到環(huán)境變量中胞皱,請求時作為參數(shù)傳遞
這種方法適用于token加在url后面的情況邪意,且隨著登錄用戶不同,參數(shù)隨之變化
十:Pre-request Script 詳解
Pre-request Script是集合中請求發(fā)送之前需要執(zhí)行的代碼片段反砌。如:請求參數(shù)中包含一個隨機數(shù)雾鬼,或者請求header中包括一個時間戳,或者你的請求參數(shù)需要加密時宴树,可以在Pre-request Script中處理代碼策菜。
(1)請求參數(shù)為隨機數(shù),使用Math.floor(Math.random()*3)獲取一個0-3之間的隨機數(shù),并將該值加入環(huán)境變量中
pm.environment.set("tmp_relationDictId", Math.floor(Math.random()*3));
(2)根據(jù)身份證號判斷性別又憨,將性別值加入環(huán)境變量中
var idNo='230700199412209188';
var sexInt='';
if (parseInt(idNo.substr(16, 1)) % 2 == 1) {
? ? sexInt=1;
? ? } else {
? ? sexInt=0;
}
pm.environment.set("tem_sexInt",sexInt);
根據(jù)具體情況具體實現(xiàn)腳本代碼翠霍,且右側(cè)有提供一些常用代碼可作為參考
十一:collection運行(參數(shù)化)
collections是多個測試用例的集合,我們可以將一個項目創(chuàng)建一個集合蠢莺,也可以一個功能一個集合壶运,根據(jù)實際情況確定。將request請求放在Collection中浪秘,把測試用例進行工程化管理,則運行collection時會一次性運行collection中的所有用例埠况。點擊下圖的“Run”耸携,打開“Collection Runner”
參數(shù)化
postman提供了非常便利的數(shù)據(jù)驅(qū)動測試,支持用data File導(dǎo)入數(shù)據(jù)辕翰。在Iterations重復(fù)運行時夺衍,如果每個用例需要每次運行時使用不同的數(shù)據(jù),應(yīng)滿足以下兩個條件:
(1)腳本中要用到數(shù)據(jù)的地方參數(shù)化喜命,即用一個變量來代替沟沙,每次運行時,重新獲取當前的運行數(shù)據(jù)壁榕;
(2)需要有一個數(shù)據(jù)池矛紫,這個數(shù)據(jù)池里的數(shù)據(jù)條數(shù),要與重復(fù)運行的次數(shù)相同牌里;
例如:我們要對test02用例做數(shù)據(jù)驅(qū)動測試颊咬,涉及參數(shù):{{name_code}},則我們首先要構(gòu)造一個data file牡辽,定義為test.json
在collection Runner中設(shè)置No Environment喳篇,Iterations=3(與數(shù)據(jù)池中的數(shù)據(jù)條數(shù)相同),data選擇test.json文件态辛,然后選擇Data File Type麸澜,支持json和csv格式(csv相當于Excel),這里我們選擇json格式奏黑。
設(shè)置完運行項后炊邦,我們可以點擊‘Preview’預(yù)覽,查看preview中的數(shù)據(jù)循環(huán)次數(shù)與設(shè)置的Iterations相同
這時我們運行用例熟史,運行結(jié)果如下
我們看到responseCode=200運行成功铣耘,但是有一個斷言運行失敗,我們查看Tests斷言以故,發(fā)現(xiàn)變量值是從環(huán)境變量中取的蜗细,而運行的用例中使用的是data file中的變量
修改方法:從data file中取值
// 從test_data文件中獲取值,用data.key值
tests["返回值中的name必須與斷言中的name相等"] = res.name === data.name_code;
十二: 在命令行運行postman腳本
有時我們的程序可能需要在無UI界面的服務(wù)器運行(如:linux或mac)或在CI持續(xù)集成上運行,這就需要使用命令行運行腳本啦炉媒。運行腳本需要安裝:nodejs踪区、cnpm、newman
(1)安裝cnpm(需要依賴npm)
cmd中運行:npm install -g cnpm -registry=https://registry.npm.taobao.org 安裝cnpm吊骤,再用cnpm -v命令查看是否安裝成功缎岗。
(2)安裝Newman(依賴nodejs)
Newman是命令行的postman接口集運行器,它允許你通過命令行的方式去運行一個用例集白粉,它的構(gòu)建具有可擴展性传泊,因此可以輕松將其與持續(xù)集成服務(wù)器集成并構(gòu)建系統(tǒng)。Newman保持了與Postman相同的功能鸭巴。
在安裝Newman之前需要先安裝nodejs眷细,這里不介紹nodejs的安裝,可自行通過node官網(wǎng)(https://nodejs.org/en/)下載需要的安裝包(https://nodejs.org/download/)進行安裝即可鹃祖。
Nodejs安裝成功以后溪椎,打開cmd命令行,輸入npm install –g newman? 或者??cnpm install newman --global?回車即可自動安裝恬口,如果遇到錯誤校读,可以嘗試使用npm --registry https://registry.npm.taobao.org install –gnewman,安裝完成后祖能,輸入newman即可看到命令選項歉秫,如下圖:
(3)導(dǎo)出collection
將collection集導(dǎo)出為json格式,與之前構(gòu)造的data file文件test.json放在同一目錄下养铸。
(4)執(zhí)行腳本
cmd進入文件所在目錄下
運行命令:newman run v2ex.postman_collection.json -d test.json -r html,cli,json,junit
獲取的cli格式報告如下:
其他格式的報告在哪呢端考?? 運行完成后揭厚,當前目錄下會生成一個newman文件夾却特,json、html筛圆、xml等報告在這里顯示
(5)導(dǎo)出為其他腳本運行(如:python裂明、java等)
postman右側(cè)點擊‘Code’,選擇腳本語言太援,我們這里選擇python-Requests闽晦,copy to clipboard,復(fù)制到在.py文件中
修改代碼:刪除headers提岔,用for..in..循環(huán)做數(shù)據(jù)驅(qū)動仙蛉,導(dǎo)入unittest做自動化測試,將response.json()轉(zhuǎn)換為json格式碱蒙,并添加斷言
運行python腳本荠瘪,在python項目編輯器中右鍵->Run夯巷,或者在命令行中執(zhí)行python test.py