官方文檔:https://learning.getpostman.com/docs/postman/launching-postman/introduction/
視頻教程傳送門:https://ke.qq.com/course/229839?taid=1419108734435791
https://www.bilibili.com/video/av63081648?from=search&seid=17654691201901411917
chrome app與native app的區別
Cookies
native版本可以直接操作cookie,而chrome版本需要安裝擴展
Built-in proxy
native版本自帶proxy,可以用來抓包
Restricted headers
有一些headers在chrome上是受限的,比如Origin and User-Agent
Don’t follow redirects option
native版本纔有這個選項
Postman console
native版本自帶
postman的更新
File -> Settings -> Update 中設置是否自動更新
HTTP 的響應和請求
參考:HTTP消息 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages
(圖片來自developer.mozilla.org)
起始行和 HTTP 消息中的HTTP 頭統稱爲請求頭,而其有效負載被稱爲消息正文。
請求 | 響應 |
起始行(start line): 一個 HTTP 方法 + 請求目標 (URL、協議、端口和域名的絕對路徑) + HTTP 版本,定義了剩餘報文的結構,作爲對期望的響應版本的指示符 |
狀態行(status line): HTTP版本 + 狀態碼 (status code) + 狀態文本 (status text) |
HTTP Headers 不區分大小寫的字符串,緊跟着的冒號 (':') 和一個結構取決於 header 類型的值 |
HTTP Headers 不區分大小寫的字符串,緊跟着的冒號 (':') 和一個結構取決於 header 類型的值 |
空行(指示所有關於請求的元數據已經發送完畢) | 空行 |
Body 不是所有的請求都有一個 body:例如獲取資源的請求,GET,HEAD,DELETE 和 OPTIONS,通常它們不需要 body。 有些請求將數據發送到服務器以便更新數據:常見的的情況是 POST 請求(包含 HTML 表單數據)。 |
Body 不是所有的響應都有 body:具有狀態碼 (如 201 或 204) 的響應,通常不會有 body |
增加斷言
斷言:預期與實際結果的判斷
預期==實際 -> 用例通過
預期!==實際 -> 用例失敗
3A原則
ARRANGE 分配測試數據/初始化測試對象
ACT 通過不同參數調用接口
ASSERT 判斷實際結果和預期,eg:響應中斷言(狀態碼、body)
-----------------------------------------------------------------------------------------
測試對象:v2ex的api
文檔: https://www.v2ex.com/api/p/7v9TEc53 (404: Not Found。。)
api地址:https://www.v2ex.com/api/topics/hot.json
相當於首頁右側的每天10大內容
Method: GET
Authentication: None
增加斷言:
返回的狀態碼必須是200
返回10條內容
postman的Test功能
設置全局變量
設置環境變量
拿到並處理請求的響應
定義測試檢查點和斷言,eg:
tests["Body is correct"] = responseBody === "response_body_string";
tests["Response time is less than 200ms"] = responseTime < 200;
test功能可以理解爲一個js的sandbox
[例]
tests["狀態碼必須是200"] = responseCode.code === 200;
var res = JSON.parse(responseBody);
console.log(res.length)
tests["返回的數據必須是10條"] = res.length === 10;
postman的sandbox
在postman中運行一些JS代碼的地方
公共庫
環境變量與全局變量
動態變量
操作cookie
獲取和查看請求及響應
讀取數據文件
sandbox公共庫 https://learning.getpostman.com/docs/postman/scripts/postman-sandbox/
例如:
迭代器可以使用Lodash
解析HTML可以使用cheerio
加密解密可以用CryptoJS
chai提供可讀性更強的寫斷言的方式
Postman Sandbox API -> https://learning.getpostman.com/docs/postman/scripts/postman-sandbox-api-reference/
pm.test
pm.test(testName:String, specFunction:Function):Function
說明:
冒號後代表數據類型, pm.test(testName,specFunction)是一個函數,傳入兩個參數--測試名稱字符串和一個函數
pm.expect
pm.expect(assertion:*):Function → Assertion
說明:
冒號後代表數據類型, pm.expect(assertion)是一個函數,傳入參數爲一個斷言
該函數的斷言常用來處理response和variables中的數據
參考:
postman斷言舉例 -> https://learning.getpostman.com/docs/postman/scripts/test-examples/#assertion-library-examples
Chai Assertion Library -> https://www.chaijs.com/api/bdd/
狀態碼斷言:
pm.response.to.have.status(code:Number)
pm.response.to.have.status(reason:String)
pm.response.to.be.info -> Checks 1XX status code
pm.response.to.be.success -> Checks 2XX status code
pm.response.to.be.redirection -> Checks 3XX status code
pm.response.to.be.clientError -> Checks 4XX status code
pm.response.to.be.serverError -> Checks 5XX
pm.response.to.be.error -> Checks 4XX or 5XX
pm.response.to.be.ok -> Status code must be 200
pm.response.to.be.accepted -> Status code must be 202
pm.response.to.be.badRequest -> Status code must be 400
pm.response.to.be.unauthorized -> Status code must be 401
pm.response.to.be.forbidden -> Status code 403
pm.response.to.be.notFound -> Status code of response is checked to be 404
pm.response.to.be.rateLimited -> Checks whether response status code is 429
[例] 使用上述方法改寫檢查返回狀態的用例
pm.test('狀態碼必須是200', function () {
pm.expect(pm.response.code).to.equal(200);
});
pm.test('狀態碼必須是200', function () {
pm.expect(pm.response).to.have.status(200);
});
pm.test('狀態文本必須是OK', function () {
pm.expect(pm.response).to.have.status('OK');
});
pm.test('狀態文本必須是OK', function () {
pm.expect(pm.response).to.be.ok;
});
postman做UI測試(靜態檢查)
思路:
發請求拿到網站的響應 -> html
解析html標籤,判斷一些元素是否顯示
用到的庫:
cheerio(和 jQuery類似)
[例] 檢查 http://www.itest.info/courses 包含4個課程 -> 檢查特定class的div標籤數
var cheerio = require('cherrio');
$ = cheerio.load(responseBody);
pm.test("必須包含4門課程",function(){
pm.response.to.be.success;
pm.expect($('.service-block-in').length === 4);
})
侷限性:
交互能力一般
無法處理ajax請求
sandbox中無法使用更多的JS庫
設置請求方法
常見的請求方法
GET
POST
PUT
DELETE
PATCH
postman的echo接口
https://postman-echo.com/get?test=123
https://postman-echo.com/post
Headers -> Content-Type:application/json
Body -> raw
如果是模擬表單提交
Headers的Content-Type填 application/x-www-form-urlencoded
Body選 x-www-form-urlencoded ,也有可能是 form-data
Cookie
postman中可以 添加cookie、查看響應中的cookie
cookie最終是保存在客戶端的
[例]
https://postman-echo.com/cookies/set?foo1=bar1&foo2=bar2
tests["foo1 cookie is set"] = _.get(postman.getResponseCookie('foo1'),'value') === 'bar1';
tests["foo2 cookie is set"] = _.get(postman.getResponseCookie('foo2'),'value') === 'bar2';
tests["foo3 cookie is set"] = _.get(postman.getResponseCookie('foo3'),'value') === 'bar3';
tests["foo3 cookie is set as default"] = _.get(postman.getResponseCookie('foo3'),'value','default') === 'default';
使用到的庫: lodash,參考 https://lodash.com/
說明:_.get(object,key,defaultValue) 第一個參數是一個對象,第二個參數是一個key,第三個參數默認值可選
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// => 3
_.get(object, ['a', '0', 'b', 'c']);
// => 3
_.get(object, 'a.b.c', 'default');
// => 'default'
postman的調試和打印
View -> Show Postman Console
[例]
console.log(pm.cookies.get('foo1'))
鑑權
https://postman-echo.com/basic-auth
Basic Auth 發送明文
Digest Auth 加密
OAuth2.0 可以用作第三方登錄
獲取Token:發一個請求到後臺,後臺返回一個Token
設置Headers:在後面所有的請求中,把這個Token放在Headers裏 -> Authorization:Token值(是加密的)
Collection
Collection的作用
組織業務邏輯
導入導出
其它功能,比如監控和mock server
可以在Pre-request Scripts中做初始化工作:定義全局變量、環境變量
變量
爲什麼使用變量?
假設我們需要測試n個API,domain都是相同的,就可以設置一個變量,domain隨環境變化之後修改也很方便
用"{{}}"取變量的值
postman變量作用域
Clobal:全局變量,比如可以將錯誤信息設置爲全局變量
Environment:環境變量,比如可以將測試domain設置爲環境變量
Local:本地變量,一般可以在sandbox中定義
Data:測試數據中導入的變量,也就是所謂的參數化
管理環境變量和全局變量
https://www.v2ex.com/api/nodes/show.json?name=python
name= 後的內容換成一個變量
node_name:php / python
1.點擊右上角的"眼睛"按鈕設置環境變量或者全局變量
2.填寫url時,用"{{}}"把變量括起來
3.使用環境變量要選擇具體的環境變量集合,全局變量可以保持No Env,如果二者都有某個變量,環境變量會覆蓋全局變量
運行collection
var jsonData = JSON.parse(responseBody);
var node_name = pm.environment.get("node_name");
console.log(node_name);
tests["返回值的name必須和參數中的name相等"] = jsonData.name == node_name;
點擊Save -> 添加到指定測試集(沒有則新建) -> 保存 (**加粗**是Markdown語法)
以上是從環境變量中取數據,真實場景更多的是測試 node_name 取不同值,可以把 node_name 的不同取值寫到文件裏,支持json,csv。以json爲例,
(1)編輯 test_data.json內容:
[{"node_name":"java"},{"node_name":"python"},{"node_name":"php"}]
注:可以在Chorme的Console中把object轉化爲json字符串,JSON.stringify(obj);
(2)測試用例中node_name 改成從文件裏取,即data.node_name,保存測試用例。
tests["Status code is 200"] = responseCode.code === 200;
var jsonData = JSON.parse(responseBody);
tests["返回值的name必須和參數中的name相等"] = jsonData.name === data.node_name;
console.log(data.node_name,jsonData.name)
參考:官方幫助文檔 Collection Runs -> Working with data files
https://learning.getpostman.com/docs/postman/collection-runs/working-with-data-files/
(3)選擇測試集,點擊 Run
(4)進入Collection Runner頁面
說明:
1.環境變量選擇與否都可以,即使選擇了,文件中的數據也會將其覆蓋
2.迭代次數和上傳文件中的記錄數一致(其實上傳了文件這個數會自動填上)
3.延遲有必要則設置,有時候API訪問有頻次限制。
例如跑Case失敗,提示查DevTools, View -> Developer -> Show DevTools,發現如下報錯,這時就需要把延遲調高一些
4.選擇data file後可以點擊Preview預覽
(5)設置完成後點擊最下面的 Run按鈕,執行結果如下
說明:如果有報錯可以加一些log查看Console、可以根據提示查看DevTools
從命令行運行postman腳本
可以在無UI界面的服務器上運行
可以在CI持續集成系統上運行
運行準備:
導出collection
安裝nodejs和npm(或cnpm) --> eg: 淘寶npm鏡像源 http://npm.taobao.org/
安裝newman(nodejs的一個庫)
newman(命令行的Test Runner)支持四種格式的報告:
CLI report
JSON report(可以直接導入MongoDB)
HTML report
JUnit report(適合CI,Jenkins調用放到Build)
安裝newman
點擊Collection Runner 界面右上角的 "Run In Command Line" ,或者直接打開 https://www.npmjs.com/package/newman
Windows環境使用cmd或者cmder執行命令:
cnpm install newman --global #安裝,國內用不了npm就用cnpm
newman -h #裝好後試試幫助
cmder參考:https://www.jianshu.com/p/5b7c985240a7
導出測試集(Export -> 選擇版本)
命令行測試
newman run V2EX.postman_collection.json -d test_data.json -r html,cli,json,junit
說明:
run 後跟着的json文件是剛纔導出的數據集
-d 後跟着的json文件是要測試的變量值
-r 是生成測試報告的格式
導出python腳本
爲什麼要導出?
導出成多語言腳本,方便二次開發
使用其它語言的test runner
使用自己最熟悉的語言做接口測試
導出成python腳本
導出成python的request腳本
使用unittest進行接口自動化測試
前提:安裝了python,安裝request庫,pip install requests --> 如果很慢可以試試豆瓣源
(1)postman頁面 Code -> Python -> Requests(支持 python2、3)
(顯示有點毛病,子菜單看不見要把滾動往右拖一點。。)
(2)複製生成的代碼
(3)編輯文件 v2ex_api_test_case.py
import requests
import unittest
class V2exAPITestCase(unittest.TestCase):
#注意方法名必須以test開頭
def test_node_api(self):
url = "https://www.v2ex.com/api/nodes/show.json"
querystring = {"name":"python"}
#.json()把返回的json字符串轉成python字典
response = requests.request("GET", url, params=querystring).json()
self.assertEqual(response['name'],querystring['name'])
if __name__ == '__main__':
unittest.main()
執行結果:
C:\pytest>python v2ex_api_test_case.py
.
----------------------------------------------------------------------
Ran 1 test in 45.640s
OK
C:\pytest>
上述腳本沒有使用數據驅動,現在修改爲如下
import requests
import unittest
class V2exAPITestCase(unittest.TestCase):
def test_node_api(self):
url = "https://www.v2ex.com/api/nodes/show.json"
#querystring = {"name":"python"}
#改用一個for循環
for node_name in ['java','python','php']:
response = requests.request("GET", url, params={"name":node_name}).json()
self.assertEqual(response['name'],node_name)
if __name__ == '__main__':
unittest.main()
執行結果:
C:\pytest>python v2ex_api_test_case.py
.
----------------------------------------------------------------------
Ran 1 test in 143.456s
OK
C:\pytest>
(End)