postman筆記

官方文檔: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)

發佈了92 篇原創文章 · 獲贊 2 · 訪問量 5697
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章