Postman接口自動化測試實例

一.實例背景?

  在實際業務中,經常會出現讓用戶輸入用戶密碼進行驗證的場景。而為了安全,一般都會先請求后臺服務器獲取一個隨機數做為鹽值,然后將鹽值和用戶輸入的密碼通過前端的加密算法生成加密后串傳給后臺服務器,后臺服務器接到到請求后,先獲取校驗原來的隨機數是否有效合法,如合法后,再做解密,并根據約定的規則把隨機數鹽值剔除等后續處理。

  也就是說先有一個獲取隨機數的接口請求,然后有一個驗證密碼的請求。

二.基于Postman來自動化這種場景的測試

  獲取隨機數的接口每次請求返回的隨機數是不一樣的,那么這種情況下,要實現接口的自動化,就要用到postman中設置環境變量這個功能。

1.腳本編寫

  在這里,為了防止別人用工具對接口發起請求,除做了token校驗外,還簡單對請求時間做了校驗,即服務器會校驗客戶端的請求時間前后不能相差1分鐘,如超過,說明是有問題的請求,將直接拒絕。

  腳本要能自動運行,就必須在Postman上實現一個獲取當前時間的功能,每次請求前獲得當前時間。在Postman中是在Pre-request Script中編寫,獲得后臺約定的日期格式,然后通過

postman.setEnvironmentVariable將其設置到環境變量中,如下所示:

  完整代碼如下:

var currentTime = new Date();function PrefixInteger(num, length) {return (Array(length).join('0') + num).slice(-length);
}
Date.prototype.toMyDateStr = function() {return this.getFullYear() + "-" + PrefixInteger((this.getMonth() + 1),2) + "-" + PrefixInteger(this.getDate(),2) + " " + PrefixInteger(this.getHours(),2) + ":" + PrefixInteger(this.getMinutes(),2) + ":" + PrefixInteger(this.getSeconds(),2);
};postman.setEnvironmentVariable("reqTime", currentTime.toMyDateStr());

  這樣就可以在請求體中通過{{}}方式進行引用。

  注意的是,我這時的請求是application/json格式,且是UTF-8編碼格式的,所以在Headers中還有如下配置。

  接下來就是最重要的一塊了,就是對請求響應的判斷(判斷是否成功)及成功后根據返回的隨機數用加密算法對密碼進行加密處理。

  接下來在驗證密碼的接口中,就可以通過{{radomNumCode}}、{{pwdSM2}}方式進行變量的引用。

  在這個驗密請求中,Pre-request Script和Headers中的配置和上面的獲取隨機因子的配置是一樣的,下面我們再來看一看Tests中的內容。

  Tests中其實也是對http請求的返回碼和響應體的返回碼、返回消息進行判斷。?

2.運行效果

  先運行獲取隨機因子的請求,在Test Results中看到都是和預期值一致的,也就是全是PASS的。

  再運行第二個真正驗證密碼的請求,如下所示,發現所有響應都符合預期,都是PASS。

  這時,我們來簡單修改其中一個預期值,讓其不通過,執行效果如下。

三.postman常用方法集合

1.設置環境變量

postman.setEnvironmentVariable("key", "value");
pm.environment.get("key", "value");//postman  5.0以上版本設置環境變量的方法
2.設置全局變量postman.setGlobalVariable("key", "value");
pm.globals.set("variable_key", "variable_value");//postman 5.0以上版本設置全局變量方法
3.檢查response body中是否包含某個stringtests["Body matches string"] = responseBody.has("string_you_want_to_search");pm.test("Body is correct", function () {pm.response.to.have.body("response_body_string");
});//5.0以上版本方法

4.檢測JSON中的某個值是否等于預期的值

var data = JSON.parse(responseBody);
tests["Your test name"] = data.value === 100;

  JSON.parse()方法,把json字符串轉化為對象。parse()會進行json格式的檢查是一個安全的函數。?

  如:檢查json中某個數組元素的個數(這里檢測programs的長度)

var data = JSON.parse(responseBody);
tests["program's lenght"] = data.programs.length === 5;
5.轉換XML body為JSON對象var jsonObject = xml2Json(responseBody);tests["Body is correct"] = responseBody === "response_body_string";
6.檢查response body是否與某個string相等7.測試response Headers中的某個元素是否存在(如:Content-Type)//getResponseHeader()方法會返回header的值,如果該值存在
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type"); tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");

  上面的方法,不區分大小寫。下面的方法,要區分大小寫。?

8.驗證Status code的值

tests["Status code is 200"] = responseCode.code === 200;pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});//5.0以上版本方法

9.驗證Response time是否小于某個值

tests["Response time is less than 200ms"] = responseTime < 200;//5.0以上版本方法
pm.test("Response time is less than 200ms", function () {pm.expect(pm.response.responseTime).to.be.below(200);
});

10.name是否包含某個值

tests["Status code name has string"] = responseCode.name.has("Created");//5.0以上版本方法
pm.test("Status code name has string", function () {pm.response.to.have.status("Created");
});

11.POST 請求的狀態響應碼是否是某個值

tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;//5.0以上版本方法
pm.test("Successful POST request", function () {pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

12.很小的JSON數據驗證器

var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
console.log(tv4.error);
tests["Valid Data1"] = tv4.validate(data1, schema);
tests["Valid Data2"] = tv4.validate(data2, schema);

13.獲取request值:var Json = JSON.parse(request.data); 
data {object}:
this is a dictionary of form data for the request. (request.data["key"]=="value")headers {object}:
this is a dictionary of headers for the request (request.headers["key"]=="value")method {string}:
GET/POST/PUT etc.url {string}:
the url for the request.假設requestBody中有"version":"1.0";這個值,如果想獲取到version的value值,代碼如下var Json = JSON.parse(request.data); 
var version = Json["version"];
14.JSON.parse()和JSON.stringify()

JSON.parse()【從一個字符串中解析出json對象】--把string轉對象
JSON.stringify()【從一個對象中解析出字符串,主要針對[object object]類型數據的轉換】--把對象轉Stringvar data={name:'goatling'}JSON.parse(data)
結果是: '{"name":"goatling"}'JSON.stringify(data)
結果是:name:"goatling"

15.判斷字段值是否為空typeof()var Jsondata = JSON.parse(responseBody);
if( typeof(Jsondata.data) != "undefined" )
 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ARM 嵌入式 編譯系列 11 -- GCC __attribute__((packed))詳細介紹】

文章目錄 __attribute__&#xff08;(packed)&#xff09; 介紹 上篇文章&#xff1a;ARM 嵌入式 編譯系列 10.3 – GNU elfutils 工具小結 下篇文章&#xff1a;ARM 嵌入式 編譯系列 11.1 – GCC attribute((aligned(x)))詳細介紹 attribute&#xff08;(packed)&#xff09; …

針對Android項目藍牙如何學習

一、概述(Overview) 藍牙是一種專有的開放式無線技術標準,用于在固定和移動設備之間進行短距離數據交換(使用2400–2480 MHz ISM波段的短波長無線電傳輸),從而創建具有高度安全性的個人局域網(PANs)。由電信供應商愛立信(telecoms vendor Ericsson)于1994年創建,[1…

系統架構設計師---計算機網絡基礎知識

根據考試大綱,本章知識點會涉及單項選擇題,約占2~6分。本章內容屬于基礎知識范疇,根據以往全國計算機技術與軟件專業技術資格(水平)考試的出題規律而言,會在單項選擇題中出現,也會在案例分析題中出現。 想成為一名合格的高級架構師,需要在計算機領域中“上知天文,下知地…

【ES】筆記-ES6的函數rest參數用法

es6中引入了rest參數&#xff0c;樣式形如…xxx&#xff0c;用于獲取函數的多余參數&#xff0c;這樣就不需要使用arguments對象了。rest參數搭配的一個變量是一個數組&#xff0c;該變量將多余的參數放入數組中。例如&#xff1a; function add(...value){console.log(value);…

pytest自動生成測試類 demo

一、 pytest自動生成測試類 demo # -*- coding:utf-8 -*- # Author: 喵醬 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 動態生成測試類def create_test_class(class_name:str, test_cases:list) -> type:"""生成測試類…

前端面試的性能優化部分(10)每天10個小知識點

目錄 系列文章目錄前端面試的性能優化部分&#xff08;1&#xff09;每天10個小知識點前端面試的性能優化部分&#xff08;2&#xff09;每天10個小知識點前端面試的性能優化部分&#xff08;3&#xff09;每天10個小知識點前端面試的性能優化部分&#xff08;4&#xff09;每天…

TiDB數據庫從入門到精通系列之一:TiDB數據庫的軟硬件環境要求和系統配置檢查

TiDB數據庫從入門到精通系列之一&#xff1a;TiDB數據庫的軟硬件環境要求和系統配置檢查 一、軟件和硬件配置要求1.操作系統及平臺要求2.服務器建議配置3.網絡要求4.磁盤空間要求 二、TiDB 環境與系統配置檢查1.在 TiKV 部署目標機器上添加數據盤 EXT4 文件系統掛載參數2.設置 …

RESTAPI簡介與DRF使用

RESTAPI 以資源為url&#xff0c;通過不同的請求方式實現不同的行為。 以資源名作為url POST:增 …/student/ GET&#xff1a;查所有 …/student/ GET&#xff1a;查單個 …/student/<pk>/ 獲取idpk的學生 DELETE&#xff1a;刪 …/student/<pk>/ PUT&#…

輕量級 Spring Task 任務調度可視化管理

Spring Task/Spring Scheduler 傻傻分不清 首先做一下“名詞解釋”&#xff0c;分清楚這兩者的區別&#xff1a; Spring Task Spring Task 是 Spring 框架自帶的一個任務調度模塊&#xff0c;提供了基本的任務調度功能。它是通過 Java 的 Timer 和 TimerTask 類來實現的&…

python獲取音樂文件

瀏覽器打開音樂地址 http://www.htqyy.com/top/hot 點擊第一首歌曲&#xff0c;會打開新的網頁并且可以獲取 改歌曲的id&#xff0c;就是url中的33 在播放頁面點擊F12&#xff0c;打開開發者調試功能 如下圖所示&#xff0c;在script腳本中可以獲取歌曲的下載數據 host&#…

滑模控制器理論推導和matlab/simulink實例分享

滑模控制的運動軌跡主要分為兩個方面&#xff1a;(1)系統的任意初始狀態向滑模面運動階段&#xff1b;(2)系統到達滑模面后并且慢慢趨于穩定的階段。所以&#xff0c;對于滑模變結構控制器的設計&#xff0c;對應于系統運動的兩個階段&#xff0c;可以分為兩個部分&#xff1a;…

從規劃到落地,數字化工廠如何破局

隨著第四次工業革命的推進&#xff0c;數字化工廠解決方案已經成為制造業轉型升級的必經之路。然而&#xff0c;在實際推進過程中&#xff0c;許多企業卻面臨著規劃難以落地、投資回報率低、人才短缺等問題。如何破局&#xff0c;實現數字化工廠的順利轉型&#xff0c;成為制造…

卡爾曼濾波

初見Kalman 假設我養了一只豬&#xff1a; 一周前&#xff0c;這只豬的體重是460.5kg。注意&#xff0c;在這里我用了0.5&#xff0c;表示其實我對這只豬一周前的體重并不是那么確定的&#xff0c;也就是說&#xff0c;46kg這個體重有0.5kg的誤差。現在&#xff0c;我又養了這只…

Java基礎(十二)面向對象編程 OOP

一、抽象數據類型 1.面向對象基本概念 1. 面向對象 面向對象程序設計&#xff08;OOP&#xff09;是一種基于對象概念的軟件開發方法&#xff0c;是目前軟件開發的主流方式。 常見面向對象的語言&#xff1a;C 、Python 、Java 常見面向過程的語言&#xff1a;C 面向對象的三…

計算機競賽 python+opencv+機器學習車牌識別

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于機器學習的車牌識別系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;4分工作量&#xff1a;4分創新點&#xff1a;3分 該項目較為新穎&#xff0c;適…

使用插件實現pdf,word預覽功能

效果 代碼&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

如何在Vue表單處理中實現表單的條件渲染

在Vue開發中&#xff0c;我們經常會遇到需要根據某些條件來渲染表單的情況。這種情況下&#xff0c;我們需要靈活地根據條件來展示或隱藏一些表單字段。本文將介紹如何在Vue中實現表單的條件渲染&#xff0c;并提供了代碼示例。 一、使用v-if指令實現簡單的條件渲染 在Vue中&a…

2023年網絡安全比賽--綜合滲透測試(超詳細)

一、競賽時間 180分鐘 共計3小時 二、競賽階段 競賽階段 任務階段 競賽任務 競賽時間 分值 1.掃描目標靶機將靶機開放的所有端口,當作flag提交(例:21,22,23); 2.掃描目標靶機將靶機的http服務版本信息當作flag提交(例:apache 2.3.4); 3.靶機網站存在目錄遍歷漏洞,請將…

Linux設備樹詳解

Linux 設備樹詳解 Linux 操作系統早期是針對個人電腦設備而開發的操作系統&#xff0c;而個人電腦處理器產商較為單一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同時個人電腦產商均使用 Intel 或 AMD 制造的處理器&#xff0c;業界形成了統一的總線/硬件接口標準…

JavaScript進階 第二天

深入對象內置構造函數 一. 深入對象 創建對象三種方式構造函數實例成員&靜態成員 1.1 創建對象三種方式 ① 利用對象字面量創建對象 const o {name: 哈哈 } ② 利用new Object 創建對象 const o new Object({ name: 哈哈 }) ③ 構造函數創建對象 1.2 構造函數 …