[Postman]接口自动化测试入门

文章大多用作个人学习分享,如果大家觉得有不足或错漏的地方欢迎评论指出或补充

此文章将完整的走一遍一个web页面的接口测试流程

大致路径为:

        创建集合->调用接口登录获取token->保存token->带着token去完成其他接口的自动化测试->断言->断言->保存测试结果

目录

简单介绍

新建集合与请求

postman中参数变量的存储

使用javascript对响应进行处理存储cookie到环境变量  

postman中的cookie管理

 断言

状态码断言

响应体内容断言

响应头断言

响应时间断言

DDT数据驱动测试

​编辑 编写CSV文件

运行集合


简单介绍

        postman是用于软件测试调试接口的工具,通过模拟用户发出的http请求参数来验证响应是否与期望值相符合。

新建集合与请求

workplace中创建一个集合,以及在集合中创建请求

在集合中,可以将组织相关的API都整合到一起,且可以按照顺序一键运行,记录测试结果,生成测试报告

下面会以csdn中的搜索接口来走一遍这个流程

csdn页面中需要先进行登录,才可完成后续的操作

所以,我们第一步的是需要先获取登录接口中返回的认证信息。

postman中参数变量的存储

通常在调用了一个登录接口后,会相应的返回一个token或者是cookie。让客户端存储下来,好完成后续的身份验证。

如果我们想要对一些有身份验证要求的接口进行测试,就要在请求头上对应的加上一个token或者cookie(对应的身份验证方式就要看被测接口的开发设计了)

对于请求头或者请求体中的某些参数,我们可以使用环境变量或者全局变量去进行赋值。

首先,先调查csdn登录接口的设计与参数

下面是csdn的账密登录接口对应的参数,userIdentification是账号,pwdOrVerifyCode是密码

{"userIdentification":"","pwdOrVerifyCode":"","loginType":"1","webUmidToken":"","uaToken":"","agreedPrivacyPolicy":0
}

我们在对应的进行传参登录后,再查看respond,可以发现其返回的cookie格式是由多个set-cookie以键值对的方式返回的。 

想要把这个respond里的cookie带到后续请求接口的header的参数中,方法可以有如下:

使用javascript对响应进行处理存储cookie到环境变量  

大致的流程是:

1. 首先对登录接口进行请求

2.使用postman中的test模块编写javascript,对响应中的cookie进行存储到环境变量当中

3.在后续的接口上,将cookie字段中的参数使用一个占位符进行替换

4.结果是,在进行请求时header就会带着cookie去访问了            

新建一个环境与环境变量

并在请求中使用上对应的环境,这样在执行javascript的时候,才会赋值到对应的环境变量上 编写一个javascript脚本去存储响应头里的所有set-cookie并进行拼装处理

//  拿header里面set-cookie
const cookies = pm.response.headers.filter(function (header){return header.key.toLowerCase() === 'set-cookie';
})// 拼接起来
let cookieString = cookies.map(function (cookie){return cookie.value.split(';')[0];
}).join(';');// 存储到环境变量中
pm.environment.set("cookie", cookieString);// 打到控制台看一眼
console.log(pm.environment.get("cookie"));

在接口进行请求响应后,再去查看环境变量中的cookie变量。可以发现cookie已经存储起来了 

在其他需要认证的接口上的请求头里加上cookie键,并将值用占位符代替。这样在请求的时候,就会将环境变量里的cookie值加到请求头上,完成身份验证。使用这个方法同理,也可以对其他响应体或者响应头中的参数进行存储或处理。

postman中的cookie管理

其实,在postman当中会自动识别响应当中是否包含有cookie,如果有的话会根据域名存储起来,下一次在对同一个域名的其他接口进行请求的时候,会自动给你加上域名对应的cookie

会自动的给你先拼接好这个请求头中的cookie 

 断言

如果想要知道一个接口的响应是否符合预期,那么可以写一个断言来对响应进行判断。

在postman中提供了一个pm API去方便编写一些脚本进行测试

pm.test是其中会用到进行断言或者测试的方法

pm.test()会接收两个参数,

        第一个参数是,测试的名称

        第二个参数是,测试函数,包含了测试的逻辑

状态码断言

如果我想要判断一个接口的状态码是否为200,则脚本可以编写为:

pm.test("状态码为200", function(){pm.expect(pm.response).to.have.status(200);
})

响应体内容断言

想要判断返回的jsonData中的某个字段是否存在,以及对其value进行断言,可以进行下面的编写。

场景方法
判断value是否为某一个特定值to.eql(value)/to.equal(value)
判断value是否小于某个值to.below(value)
判断value是否大于某个值to.above(value)
判断value是否包含某个值to.include(value)
判断对象是否包含某个键/字段/属性to.have.property(key)

eg,判断message字段是否为success

pm.test("检查message字段的value", function(){const jsonData = pm.response.json();pm.expect(jsonData.message).to.eql("success")
})

eg,判断score字段是否小于50 

pm.test("检查score字段的value是否小于50", function(){const jsonData = pm.response.json();const data = jsonData.data;const score = data.score;let scoreData = score.score;pm.expect(scoreData).to.below(50);  // 检查score字段的value是否小于50,是的话通过
})

eg中对应的响应体内容

{"code": "0","data": {"password": {"hasInfo": true,"expired": true},"email": {"hasInfo": false,"email": null},"score": {"score": 30},"loginLog": {"hasInfo": true,"logRisk": true},"showCancellation": true},"message": "success","status": true
}

响应头断言

判断response的header中某一个字段是否为某一个值时

pm.test("检查响应头中的content-type是否为application/json;charset=utf-8", function(){pm.expect(pm.response.headers.get('Content-Type')).to.equal("application/json;charset=utf-8")
})

响应时间断言

判断本次响应的时间是否在600ms之内

pm.test("检查响应时间是否在600ms之内", function(){let time = pm.response.responseTime;pm.expect(time).to.below(600);
})

DDT数据驱动测试

DDT(Data-Driven Testing,数据驱动测试)是一种自动化测试方法,指通过使用外部数据文件(如 CSV、Excel、JSON 等)或数据源来驱动测试的输入。它的核心思想是将测试数据和测试逻辑分离,以便在不修改测试代码的情况下,用不同的数据集来重复执行同样的测试逻辑。

学会了接口身份认证登录的方式,以及断言的编写后,就来到了被测接口的设计了。

像是对csdn中的文章搜索接口进行测试,测试返回的内容是否包含搜索关键字

 在network中找到的接口可以直接以bash形式复制下来,再导入到postman中,就可以带着参数以及其请求头的参数了

 编写CSV文件

此处就简单的设计一下测试用例,不具有太多的参考性。

再将postman中搜索接口的关键字的value用占位符替换,注意占位符的命名要与csv文件中对应的参数名一致

响应的结果一般是这样滴

运行集合

写好搜索接口的断言

pm.test("检查响应中是否有key值", function(){// 拿result_vos 这个对象是一个数组,一个元素就是一篇文章的信息let result_vos_data = pm.response.json().result_vos// 还要先判断是否存在result_vos// 如果result_vos为空,下面的forEach也不会执行,断言会通过pm.expect(result_vos_data).to.be.an('array').that.is.not.empty// 遍历result_vos_data中存储的元素,检查元素中的title字段是否包含有{{key}}参数// 动态的从csv中取参let key = pm.variables.get('key');console.log(key)result_vos_data.forEach((item, index) => {// 检查是否有title字段console.log(item)pm.expect(item).to.have.property('title');// 检查title字段是否为空let sign = item.title.toLowerCase().includes(key);console.log(sign)pm.test(`返回的下标为${index}的数据是否通过`, function(){pm.expect(sign).to.be.true;});})
})

打开菜单后,选择 Run collection

 可以在上传附件中加入写好的csv文件

但是有一点需要注意的是,测试接口根据csv文件中的参数个数,需要进行循环n次。但这个循环次数是会将整个集合的接口都重新调用一遍。

像是一些获取前置条件的接口:登录接口之类的 ,不想且不需要被重复调用。

只能创建另一个集合去单独调用了

在点击之后对应的测试报告就会生成出来啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/424760.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

✔2848. 与车相交的点

代码实现&#xff1a; 方法一&#xff1a;哈希表 #define fmax(a, b) ((a) > (b) ? (a) : (b))int numberOfPoints(int **nums, int numsSize, int *numsColSize) {int hash[101] {0};int max 0;for (int i 0; i < numsSize; i) {max fmax(max, nums[i][1]);for …

【人工智能】AI创业的前沿思考 | 从垂直领域到通用智能模型AGI的崛起

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Golang协程泄漏定位和排查

Golang协程泄漏定位和排查 1 场景&#xff1a;无缓冲channel写阻塞2 排查和定位思路2.1 Golang pprof2.2 协程数监控2.3 操作系统内存泄漏 参考 1 场景&#xff1a;无缓冲channel写阻塞 package mainimport ("log""net/http"_ "net/http/pprof"…

PPT中的图形与图片:插入、调整与格式设置技术详解

目录 引言 一、图形与图片的插入 1. 插入图形 2. 插入图片 二、图形与图片的调整 1. 调整大小与位置 2. 裁剪与旋转 3. 图形与图片的合并与组合 三、图片格式与布局设置 1. 图片格式设置 2. 图片布局设置 示例案例&#xff1a;制作产品展示PPT 四、结论 引言 在现…

【OJ刷题】双指针问题4

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

(CVPR-2022)感知优先的扩散模型训练

感知优先的扩散模型训练 Paper Title&#xff1a;Perception Prioritized Training of Diffusion Models Paper是首尔国立大学数据科学与人工智能实验室发表在CVPR 2022的工作 论文地址 Code地址 Abstract 扩散模型通过优化相应损失项的加权和&#xff08;即去噪得分匹配损失&…

IEEE 754浮点数表示

浮点数组成 以单精度浮点数(32位)为例说明&#xff1a; 十进制浮点数组成&#xff1a; 十进制基数(base)为10 二进制浮点数组成&#xff1a; 二进制基数(base)为2 以IEEE 754标准表示十进制数&#xff1a; ( 7.625 ) 10 (7.625)_{10} (7.625)10​&#xff0c;先将其转成…

一,掌心里的智慧:我的 TinyML 学习之旅

从云端到掌心&#xff1a;TinyML 的故事 想象一下&#xff0c;有一天你起床&#xff0c;伸手去关闭窗边的小闹钟&#xff0c;却发现这个小家伙已经提前预判到你的醒来时间——因为它能够“听到”你昨晚的呼吸变化&#xff0c;分析出你什么时候会醒。这个场景可能听起来像科幻小…

网络编程基础概述

文章目录 协议网络协议栈(osi)局域网IPIP和Mac地址端口号TCP和UDP网络字节序 协议 (网络协议的)意义:为了让计算机传输之间将信息正确传输给目标机器 不同系统之间能接入网络是因为定制了一套通用的协议以便支持不同系统间的网络通信 1.网络通信的问题: 将数据可靠的从A传给B a…

什么是 SMB 服务器以及它如何工作?

在本文中&#xff0c;您将了解 SMB 服务器以及它们如何促进网络文件共享。 我们将介绍它们的基本功能、主要特性以及如何安全地设置它们。无论您是新手还是需要复习&#xff0c;本指南都将帮助您更好地了解 SMB 服务器。 什么是 SMB 服务器&#xff1f; SMB&#xff08;服务器…

线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结

文章目录 1.二次型1.1 二次型、标准型、规范型、正负惯性指数、二次型的秩1.2 坐标变换1.3 合同1.4 正交变换化为标准型 2.二次型的主要定理3.正定二次型与正定矩阵4.重难点题型总结4.1 配方法将二次型化为标准型4.2 正交变换法将二次型化为标准型4.3 规范型确定取值范围问题4.…

基于HPLC的低压电力采集方案

1. 组网部署 2. 组网部件 3. 原理

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…

SpringCloud入门(一)SpringCloud简介

一、为什么要学SpringCloud&#xff1f; 企业开发都使用微服务&#xff0c;面试必问微服务 要学会微服务开发的问题和解决方案。应对用户的增长和并发需求。 要应对用户需求变化&#xff1b; 单点式架构无法应对高并发&#xff1b; 服务之间的错综复杂调用&…

C++多态讲解

多态 多态的概念 通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)这里重点讲运行时多态。 运行时多态 运行时多态&#xff0c;具体点就是去完成某个行为(函数)&#xff0c;可以传不同的对象就会完成不同的行为&#xff0c;就达到多种形…

【数学建模】2024年国赛成绩公布时间预测

经过三天三夜的奋战&#xff0c;2024年数学建模国赛也宣告结束&#xff0c;相信这几天超高强度的比赛也让大家精疲力竭了&#xff0c;所以经过几天的调整&#xff0c;大家都恢复过来了吧。能够在高强度的压力下坚持这么久&#xff0c;大家都超级厉害的&#xff01; 当然完整提交…

基于R语言的统计分析基础:使用键盘输入数据

在R语言中&#xff0c;键盘输入数据是一种灵活且直接的数据获取方式&#xff0c;适用于处理小数据集或需要即时用户交互的场景。通常用于交互式数据探索和分析、临时数据处理、交互式图形绘制、脚本自动化中的用户交互、特定应用场景下的数据录入中。 比如利用readline()函数根…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…

数据湖-方案对比

数据湖架构结合了数据湖和数据仓库。虽然它不仅仅是两者之间的简单集成&#xff0c;但其理念是充分发挥两种架构的优势&#xff1a;数据仓库的可靠交易以及数据湖的可扩展性和低成本。 Lakehouse 架构支持管理各种数据类型&#xff0c;例如结构化、半结构化和非结构化数据&…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…