接口測試工具postman


一、Postman功能簡介

Postman是由Postdot Technologies公司打造的一款功能強大的調試HTTP接口的工具。在做接口測試的時候,Postman相當於一個客戶端,它可以模擬用戶發起的各類HTTP請求,將請求數據發送至服務端,獲取對應的響應結果,從而驗證響應中的結果數據是否和預期值相匹配;並確保開發人員能夠及時處理接口中的bug,進而保證產品上線之后的穩定性和安全性。進入postman官網https://www.postman.com/downloads/

工作原理:

  1. 在Postman中輸入請求地址,並點擊Send按鈕后;
  2. 對應的應用服務器接收到該請求,並且返回對應的響應報文;
  3. Postman接收到響應報文后,並通過友好的方式進行可視化的顯示在界面上。

二、常用接口測試工具以及返回數據

常用的接口測試工具有postman、jmeter

接口返回數據的格式一般有:json、html、xml

  1)json格式

一般有三組數據:{"code":200,"message":"請求成功","dataMap":{"..."}}

code:返回的狀態碼

message:對返回信息或者狀態錯誤的解釋說明

dataMap:真正的返回數據

  2)html格式

<html>
    <title></title>
    <body>
        <code>200</code>
        ......
    </body>
</html>

  3)xml格式

<?xml?version="1.0"encoding="utf-8">
      <code>200</code>
        ......
</xml>

三、接口測試協議

接口測試協議
1.webservice協議:

接口地址:http://......?wsdl

2.dubbo協議:

接口地址以dubbo://......

適用於少量數據的傳輸

3.http協議(90%):

接口地址:http://.....

http端口為: 80

https = http+ssl 安全傳輸協議 ,端口為443

市面上主要使用HTTP協議進行數據傳輸,所以我們主要學習這個協議。

什么是http協議?

http是超文本傳輸協議,主要用於瀏覽器和服務器之間傳輸數據,交互有兩個部分:請求和響應。

請求: get、post、put、delete

請求部分一般包含的內容:

1、請求行:請求方式、請求地址和協議版本

2、請求頭:HTTP協議使用HTTP頭來傳遞請求的元信息。HTTP頭是一個用冒號分隔的名稱/值對,冒號前面是HTTP頭發名稱,后面是HTTP的值,例如:

accept:application/json ---客戶端可以接收的數據格式

X-Requested-with:XMLHttpRequest --異步請求

user-agent: --客戶端的用戶

Host:--請求的主機地址

cookie:--cookie信息(請求的)

accept-encoding: gzip, deflate, br--壓縮方式

connection: keep-alive  ---- 保持長鏈接

content-type: application/json;charset=UTF-8  --- 客戶端發送的數據格式

3、空行: 發送回車符和退行,通知服務器一下不再有請求頭;

4、消息體: HTTP請求中帶有查詢字符串時,如果是GET方法,查詢字符或表單數據附加值請求行中,則消息體中就沒有內容;如果是POST方法,查詢字符串或表單數據及添加在消息體中。

2xx:表示請求發送成功;

3xx:表示資源發生轉移,俗稱重定向;

4xx: 表示接口的路徑找不到,客戶端錯誤;

5xx:表示系統內部異常,一般存在接口缺陷或者請求內容不正確,服務器錯誤。

四、postman的頁面內容

主界面如下:

Params:用於在get請求傳參

Authorization:postman自帶的鑒權功能

Headers:請求頭

Body:post請求傳參

  -- none:沒有參數

  -- form-data:既有文件又有鍵值對

  -- x-www-form-urlencoded:只傳輸鍵值對

  -- raw:JSon、TXT、xml、HTML、javasripts

  -- binary:把文件以二進制方式傳輸

Pre-request Script:接口請求之前的腳本,用js格式寫

Tests:斷言的代碼

響應的功能頁面:

Body:響應內容。

  --Pretty  是json格式數據

  --Raw   是文本格式

  --Preview 是網頁格式

Cookies:響應的cookies信息

Headers:響應的頭部信息

TestResult:斷言的結果

五、發送請求與查看相應

  1)GET請求

  • 選擇請求方式為GET,填寫接口測試地址URL和輸入參數;
  • 確認填寫無誤后,點擊Send按鈕發送請求,查看response內容;

  2)POST請求

選擇請求方式為POST,采用以下幾種傳參方式進行接口測試;

  (1)URI 傳參

  (2)form-data 傳參 

會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來說明文件類型;content-disposition,用來說明字段的一些信息

問題:
對接接口,發現對方的接口使用form-data進行數據提交,直接使用requests庫的data參數對接,會報參數錯誤: 
params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
}
data = {
    'name': name,
    'phone': phone,
    'idnum': idnum,
    'products': [201,]
}
resp = requests.post(URL, data=data, params=params,verify=False, timeout=10)                   

執行結果:

解決方案

這一塊Requests包做的不是很好,做法具體如下:
一種是手動組建form-data並加上headers;
另一種是通過files參數傳遞form-datal;

# 方案一:
params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
}
payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
    name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; 
    name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
    name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; 
    name=\"products\"\r\n\r\n {}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,])
headers = {
    "content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
resp = requests.post(URL, data=payload, params=params,
                     verify=False, timeout=10, headers=headers)

# 方案二:
import json
params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
}
data = {
    'name':(None, name),
    'phone': (None, str(phone)),
    'idnum': (None, idnum),
    'products': (None, json.dumps([201,]))
}
resp = requests.post(URL, files=data, params=params,
                     verify=False, timeout=10)
print resp.status_code
print resp.request.url
print resp.request.body
print resp.text                     
  (3)x-www-form-urlencoded 傳參

會將表單內的數據轉換為鍵值對

  (4)raw 傳參

可以上傳任意格式的文本,可以上傳text、json、xml、html等 

提示:在編輯器中選擇文本並按CMD / CTRL + B可以自動美化XML / JSON內容。

  (5)binary 傳參

只可以上傳二進制數據,通常用來上傳文件,由於沒有鍵值,所以,一次只能上傳一個文件。

multipart/form-data與x-www-form-urlencoded區別:
    multipart/form-data:既可以上傳文件等二進制數據,也可以上傳表單鍵值對,只是最后會轉化為一條信息;
     x-www-form-urlencoded:只能上傳鍵值對,並且鍵值對都是間隔分開的。

六、Cookies 和Code

Postman通過選項卡布局,用於在構建器中發送和管理API請求。上半部分是請求構建器,下半部分是響應查看器。

  Cookies——管理cookie模式是通過點擊cookie鏈接訪問的。該特性允許你管理與請求相關的cookie。
  Code——生成的代碼片段模式通過保存按鈕下面的最右邊的Code鏈接。該特性允許你生成與請求相關的代碼片段,該請求支持20多種語言(http、java、go等語言)

(一)cookie鑒權的原理:

當客戶端第一次訪問服務器時,服務器就會生成cookie,並且把生成的cookie信息放到響應頭的set-cookie字段里面,然后發送給客戶端,客戶端接收到cookie之后就會保存起來,然后在2-N次請求服務器的時候自動的帶上cookie信息實現鑒權。

(二)cookie分類

會話cookie:保存在內存中,當瀏覽器關閉之后會自動消失

持久化cookie:保存在硬盤中,瀏覽器關閉后不會消失只有當持久化的時間到期了才會消失。

name:cookie的名稱

value:cookie的值

domain:cookie作為的ip地址

path:cookie所在的服務器上面的項目路徑

exprise:失效時間

 七、環境變量和全局變量

  (1)環境變量和全局變量

在企業當中,一般有開發環境、測試環境和線上環境,有一些企業也會有預發布環境,我們在做接口測試的時候會發現,這些環境中接口的地址除了ip地址不一樣,其他的地方都是一樣的,我們在實際測試中,不可能每個環境都寫一套測試邏輯,這個時候就需要使用到環境變量,環境變量為全局變量。

注意:當全局變量和環境變量的名稱一致時,環境變量的權限比較大。

將接口地址中的IP地址參數化格式為{{ip}},試着運行一次

  (2)postman動態參數

一)postman內置動態參數

{{}}中加"$"代表示動態參數,不加"$"表示是全局變量或者是環境變量

{{$timestamp}}  生成當前的時間戳

{{$randomint}}   生成0-1000的隨機數

{{$guid}} 生成隨機的guid的字符串

二)自定義動態參數

也可以在Pre-request Script(發送請求之前)里面定義動態參數

//請求之前 自定義一個時間戳
var now_time = Date.now();
pm.globals.set("now_time",now_time)

八、接口關聯

在實際工作中,有一些變量的值是動態變化的,並且下一個接口請求的時候需要傳入該參數的值,比如token。

我們需要先在上一個接口的響應中獲取token的值,並將該值設置為全局變量,再在下一個接口中使用參數化的形式將該值傳入,即可實現了接口的關聯。

1、接口關聯方法一:json提取器

//把responseBody轉為json字符串
var jsvalue = JSON.parse(responseBody);
//將jsvalue的值打印到控制台上
console.log(jsvalue)
// 提取token的值,並保存到全局變量
pm.globals.set("token", jsvalue.token);
復制代碼

2、接口關聯方法二:正則表達式提取器

{
    "tag":{
        "id":100"name":"張三"
    }
}

假如響應數據的內容如上,我們現在要提取100,則在Tests中使用正則表達式提取的規則為 responseBody.match(new RegExp('"id":(.+?),')),這個方法表示匹配"id":后面且,之前的內容,如果將該結果打印到控制台,為一個數組:[" "id":100,","100"],若只取到100,則需要再加上索引

//通過正則表達式提取
var value = responseBody.match(new RegExp('"timestamp":(.+?),'))[1];
console.log(value );

3、接口關聯方法二:cookie提取器

如下圖所示,我們需要提取響應結果Cookies中的值,並將結果打印到控制台上。

方法如下:

//提取Cookies中SERVERID中的Value值並保存在cookies_serverid變量中
var cookies_serverid = postman.getResponseCookie('SERVERID').value
//將變量cookies_serverid中的值打印到控制台
console.log(cookies_serverid)

4、接口關聯方法三:hearder信息提取

//獲取響應headers的值,需要從響應頭取值
var Content_Type = postman.getResponseHeader('Content-Type');
console.log(Content_Type)

九、調試和日志

Postman控制台類似於瀏覽器的開發者控制台,不同之處在於它針對API開發進行了調整。如果API或API測試沒有按照我們期望的那樣進行,那么Postman控制台將是我們進行調試的得力工具。只要Postman控制台窗口處於打開狀態,所有的API活動都將記錄在此處,我們可以通過這里查看底層發生了什么。

Postman控制台會記錄以下信息:

  • 發送的實際請求,包括所有底層請求頭和變量值等;
  • 服務器返回的最原始的響應報文,這里輸出的響應報文是沒有被Postman處理的響應報文;
  • 用於請求的代理配置和證書;
  • 測試腳本或預先請求腳本的錯誤日志;
  • 使用console.log()輸出的內容。

在腳本中使用consolle.info()或console.warn()將有助於確認執行的代碼行。這個使用方法和JavaScript中的console.log()類似

在應用程序菜單中前往View,然后單擊“Show Postman Console”或使用鍵盤快捷鍵(CMD / CTRL + ALT + C)。每個調用及其標頭和有效負載都將記錄到Postman控制台。

十、斷言

要想完整的實現接口測試,自然是少不了斷言的,在postman中,斷言的內容寫在Tests中,

關於postman語法https://www.cnblogs.com/ldzcy/articles/15736974.html

系統提供了八種斷言方式:

八種斷言方式:

//1、返回的狀態碼為200
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});
 
//2、返回的結果中包含一個指定的字符串
pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
 
//3、對返回結果做json字段檢查
pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});
 
//4、斷言返回的結果等於一個字符串
pm.test("Body is correct", function () {
    pm.response.to.have.body("response_body_string");
});
 
//5、斷言響應頭中包含有指定的響應頭
pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type");
});
 
//6、斷言接口請求的時間少於200ms
pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});
 
//7、斷言一個post請求返回的狀態碼是否在指定的范圍之間
pm.test("Successful POST request", function () {
    pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
 
//8、斷言返回的狀態碼信息中包含指定的字符串
pm.test("Status code name has string", function () {
    pm.response.to.have.status("Created");
});

 十一、導入和導出

  1)Colltions測試數據包導出導入

  • 導出

  選擇要導出的數據包,點擊Export;

  • 導入

點擊Import按鈕,選擇要導入的文件;

  2)工作環境

選擇Settings->data,在Export data下點擊Download導出工作環境,在Import data下點擊選擇文件導入工作環境

十二、批量執行測試用例

1)在進行批量運行的時候 ,使用的數據驅動為csv或者是json  csv文件的編碼必須是utf-8

2)在請求參數里面取數據和取全局變量的方法一直({{變量名稱}}),在斷言里面取數據文件的值使用:data["變量名稱"]

參考:

https://blog.csdn.net/ZangKang1/article/details/123696130

https://blog.csdn.net/zhuyunier/article/details/87604371


免責聲明!

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



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