Postman接口测试/接口自动化实战教程

 

一、API 自动化测试

Postman 最基本的功能用来重放请求,并且配合良好的 response 格式化工具。

高级点的用法可以使用 Postman 生成各个语言的脚本,还可以抓包,认证,传输文件。

仅仅做到这些还不能够满足一个系统的开发,或者说过于琐碎,你仍需要频繁地在开发环境,测试环境,生产环境中来回切换。单一的请求也不够,你需要维护系统所有 API 的请求,并且每个请求还带有不同的 querystring 和 body。

二、Collection

对服务器端的所有请求按功能或者业务模块进行组织,使用 markdown 对所有请求和示例添加适当的描述,这时候就用到了 Collection。以下是 postman 的一些术语以及组织请求的建议。

  • Collection对应一个Application,组内各个成员(server, client, QA)共享一个 Collection。可以对整个 Collection 添加测试,文档。对于一开始未在 postman 组织请求的应用,可以设置 Proxy,跑一遍应用,对应用的所有请求进行抓包。
  • Folder (ItemGroup)对应一个模块,或者各层级子路由。如 router.use(‘/users’) 所有的请求都在一个 Folder,可以根据路由互相嵌套 Folder。
  • Request (Item)对应一个请求,可以添加认证信息。也可以设置代理,进行抓包。详见 capturing http requests。
  • Example对应一个请求不同的参数以及响应,用于Mock Server 以及文档。

postman 可以根据 Collection 的结构生成文档与Mock Server。不过都是付费功能,免费版有次数限制

三、文档

postman 自动生成文档有助于团队协作,解决了手动写文档,以及更新不及时的重大bug。

对于 GET 请求,Postman 上可以添加对该字段的描述,生成文档。
对于 POST 以及 PUT 请求,如果 Content-Type 是 form-data 或者 x-www-form-urlencoded 可以添加描述生成文档。不过如今传递 json 更方便灵活,所以 application/json 也会有很多,而且 json 又是不能添加注释的。如果需要对 json 添加文档说明的话,可以添加冗余字段 _{key}.comment 标明注释

 
  1. {

  2. "id": 128,

  3. "_id.comment": "id",

  4. "page": 10,

  5. "_page.comment": "页数"

  6. "pageSize": 15,

  7. "_pageSize.comment": "每页条数"

  8. }

不过这样冗余字段过多,更好的解决方案是在测试中对请求进行 json 校验,同时充当了一部分文档的功能。毕竟 json-schema 就是用来描述数据使数据更加可读。

以上说到请求,对于响应的文档,可以 json-schema 校验或者每个字段的描述,以及更多的测试用例代表更多的细节。

四、Mock

当服务器端还没有写好 API 时,客户端可以根据 Examples 来生成 Mock Server。

建议客户端端自己做 Mock,与项目集成在一起,纳入版本控制,方便灵活。强烈推荐 json-server,简单好用

五、测试

对于每一个 Request 都需要有测试用例。验证响应是否成功,响应时间是否过长或者响应 json 的数据类型是否正确。

测试可以使用 pm.expect 进行 BDD 测试,风格和 chai 很像,如果熟悉 chai 就很容易上手。

postman 内置了一些第三方库,如果你更喜欢 chai ,可以直接使用,也可以使用 pm.expect 底层使用 chai 实现,与 chai BDD API 一致。

postman 也有一些 http 相关的测试 API,如 status code,header, body,并且也提供了一些 snippets。

 
  1. // 响应成功

  2. pm.test('Status code is 200', () => {

  3. pm.response.to.have.status(200)

  4. })

  5. // 响应成功 chai.expect

  6. pm.test('Status code is 200', () => {

  7. chai.expect(pm.response).to.have.property('code', 200)

  8. })

  9. // 校验响应数据

  10. pm.test('Page is 100', () => {

  11. const jsonData = pm.response.json()

  12. chai.expect(jsonData.page).to.eql(100)

  13. })请注明出处。

六、Json Schema

json-schema 可以用来描述 json 信息,使 json 更加易读,同时也可以用来校验 json 的合法性。主流语言都有实现 json-schema 的库。

建议对所有 GET 响应进行 json-schema 校验,一来校验数据,二来也可以作为文档使用,使用 tv4 校验 json

 
  1. pm.test("User info", () => {

  2. const jsonData = pm.response.json()

  3. const schema = {

  4. title: 'UserInfo',

  5. discription: '用户信息',

  6. type: 'object',

  7. required: ['age', 'email', 'name'],

  8. properties: {

  9. age: {

  10. description: '年龄',

  11. type: 'number',

  12. mininum: 0,

  13. },

  14. email: {

  15. description: '邮箱',

  16. type: 'string'

  17. },

  18. name: {

  19. description: '姓名',

  20. type: 'string'

  21. }

  22. }

  23. }

  24. pm.expect(tv4.validate(jsonData, schema)).to.eql(true)

  25. })

同样对于请求也可以添加 json 校验,不过更复杂一些,因为 postman 没有直接给出获取全部请求参数的api,需要自己解析和计算

  1. // 获取 application/json 中的数据

  2. const json = JSON.stringify(pm.request.body.raw)

  3. // 获取 GET query string 的数据

  4. const qs = pm.request.url.query.toObject()

如果 postman 可以根据请求参数的 json-schema 自动生成数据就好了…

  • 参考
    json-schema.org
    tv4 Documentaion
    chai bdd - API
    postman sandbox api reference
七、测试请求参数

一个请求带有若干参数,如 GET 的 querystring(search) 以及 POST 的 body,不同的参数会有不同的响应。

假设一个请求不同参数返回的 json schema 完全不同,则可以写成两个 Request 分开测试。如果返回的 json schema 相同,只是值不同,则需要考虑传递了哪些参数,参数是多少。

一个经典的场景,根据 filter 来筛选符合条件的列表。拿用户列表举例

伪代码如下:

  1. const url = '/api/users'

  2. const query = {

  3. name: 'san',

  4. age: 12,

  5. sex: 'MALE'

  6. }

  7. // 注意query数据需要校验,防止 SQL 注入

  8. const sql = `select * from users where name = ${query.name} and age = ${query.age} and sex = ${query.sex}`

一个思路是根据请求的参数进行测试,一段重要的 snipet 是在 postman 中获取 querystring,query 是一种 PropertyList 的数据,定义在 postman-collection - PropertyList

如下:

 
  1. const name = pm.request.url.query.get('name')

  2. const age = pm.request.url.query.get('age')

  3. if (name) {

  4. pm.test('Items should match the name', () => {

  5. const jsonData = pm.response.json()

  6. expect(_.uniq(jsonData.rows.map(row => row.name))).to.eql([name])

  7. })

  8. }

  9. // 冗余代码有些多,postman不知道支不支持自建 snipets

  10. if (age) {

  11. pm.test('Items should match the age', () => {

  12. const jsonData = pm.response.json()

  13. expect(_.uniq(jsonData.rows.map(row => row.age))).to.eql([age])

  14. })

  15. }

当然以上 filter 只包含了最简单的场景,其中只涉及到了相等测试。但是有不等以及包含关系呢。

 
  1. const query = {

  2. name: 'san',

  3. age: 12,

  4. sex: 'MALE'

  5. }

  6. const sql = `select * from users where name like ${query.name} and age < ${query.age} and sex = ${query.sex}`

这种请求参数依赖于前后端的协商交流,当然对测试或者一个不知情的开发来说很不友好的。

当然对于后端也是不友好的,因为需要对你传入的每个 query 来进行处理,而且以后每添加一个筛选字段,都需要手动改一下。

可以由前端自行决定需要筛选的数据,比如使用类似于 mongo 的检索语法。

graphql 是相当酷的,值得尝试一下

 
  1. const query = {

  2. name: {

  3. $like: 'san'

  4. },

  5. age: {

  6. $lt: 12

  7. },

  8. sex: 'MALE'

  9. }

不过这对于测试的开发能力要求也比较高了,测试人员需要解析参数并且测试接口。

八、测试多次请求

当对一个函数进行单元测试时,需要大量的输入以及期望输出,在postman中,可以使用 data 来模拟多次输入

data 是一种变量,只能在 Runner 中使用,有必要对每个 Folder 建立相关的 data file,并且加入版本控制

  • using csv and json files in the postman collection runner
九、集成测试

单个API测试通过后,需要把所有请求集成在一起进行测试。这时候出现了两个问题
1、如何确保API依赖
2、API之间如何传递数据

请求在 Collection 的顺序就是他们的发起请求的顺序,如果需要强制更改顺序,可以使用 setNextRuest()

在 postman 中有三种作用域的数据,data,environment,global。在请求中用 {{}} 占位符替代。

environment 可以用来更改 HOST,避免在 url 中频繁手动切换本地环境,开发环境和生产环境。另外也可以用来传递数据。

一个常见的场景是项目使用 token 来保存登录信息,每次请求都需要携带token。可以在登录的测试代码中设置 token 的环境变量

 
  1. const url = 'http://{{HOST}}/api/login'

  2. pm.test('There is a token', () => {

  3. const jsonData = pm.response.json()

  4. pm.expect(jsonData.token).to.a('string')

  5. pm.environment.set('token', jsonData.token)

  6. })

  7. const urlNext = 'http://{{HOST}}/api/profile?token={{token}}'

十、测试Collection

确保依赖后,可以对 Collection 新建一个 Runner,并且引入一个 data 文件来测试所有的请求。对局部的 Folder 也可以使用 Runner 以及 data 进行测试。

最新版本的 postman 已经可以支持,为每个 Postman 新建变量以及 Test

所有的请求都会有一些共同测试,比如测试接口是否响应成功以及以上提到的测试 filter

 
  1. pm.test('Response is right', () => {

  2. // status code: 2XX

  3. pm.response.to.be.success

  4. })

  5. pm.test('Filter is matching', () => {

  6. // ...

  7. })

十一、持续集成

当可以测试 Collection 后,需要对测试加入版本控制,与项目集成在一起,保留测试记录,以便准时定位 bug。可以与 postman 的官方工具 newman 集成在一起,但是有一点不方便的是,持续集成仅仅可以保存记录,并不能还原记录。

newman run https://api.getpostman.com/collections/{{collection_uid}}?apikey={{postman-api-key-here}} --environment https://api.getpostman.com/environments/{{environment_uid}}?apikey={{postman-api-key-here}}
十二、对比UI自动化测试

按照我的理解,UI 自动化测试目的是用来测试流程是否通畅,比如登陆,注册,退出,如果用例没通过则截屏。但是前端需求的不断变化,加上现在各种前端框架,导致 selector 不是特别容易获取到且流程容易更改。

而API 自动化测试用来测试数据是否正确。而且大部分问题是出在数据问题上,所以 API 自动化测试性价比比较高一些。

十三、总结

1、如何编写测试用例

postman 底层使用 chai.js 的 bdd 语法作为断言库,另外加了一些特有的语法。

2、如何debug

点击菜单栏 View -> Show Devtools (Show Postman Console) 可以查看响应,检查输出,不过不能打断点。对于系统的单个请求,可以使用 Proxy 监听请求进行调试。

3、如何使用js第三方库对请求就行预处理以及后处理

比如:
发送请求时,服务器端要求时间为 timestmap(unix) 的格式,但接口调试时可读性过弱,是否可以使用 moment 转化时间。

收到响应时,也需要 moment 对时间进行解析,获得更好的展现形式。或者使用 lodash 一些函数进行数据的处理。

可以在 Tests 和 Pre-request Script 中编写脚本对请求以及响应做一些处理。但是不能对数据格式化,比如日期。
建议前后端交流日期时使用 ISO 格式的字符串,前后端都容易解析,并且可读性强。

4、如何管理请求依赖
比如:
两个API需要有依赖关系,比如当创建完一个用户后(注册),获取他的个人信息。获取个人信息就需要依赖创建用户这个API。

使用 Environment Variables 可以管理依赖

5、如何设置统一的请求参数
比如:大部分接口都需要统一的 token 参数。

目前好像没什么办法

6、如何集成到服务器端项目中
如果系统后续版本没有通过API测试,则保留测试记录是很重要的,版本控制可以得知该时间段内的代码变更。以git为例,需要每次提交后运行测试,并保留测试结果。

可以使用 npm 包 newman 来集成到项目中

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

Postman简介

目录 1.概述 2.诞生背景 3.历史版本 4.安装和卸载 5.菜单和菜单项 6.使用 7.应用场景 8.示例 8.1.简单的GET请求 8.2.POST请求提交数据 8.3.查询参数 9.未来展望 10.总结 1.概述 Postman是一款用于API开发、测试和文档管理的综合性工具。允许开发者和测试人员创建…

TFT屏幕波形显示

REVIEW 关于TFT显示屏&#xff0c;之前已经做过彩条显示&#xff1a; TFT显示屏驱动_tft驱动-CSDN博客 关于ROM IP核&#xff0c;以及coe文件生成&#xff1a; FPGA寄存器 Vivado IP核_fpga寄存器资源-CSDN博客 1. TFT屏幕ROM显示正弦波 ①生成coe文件 %% sin-cos wave dat…

【会议征稿,ACM出版】2024年云计算与大数据国际学术会议(ICCBD 2024,7月26-28)

2024年云计算与大数据国际学术会议(ICCBD 2024)将于2024年7月26-28日在中国大理召开。ICCBD 2024将围绕“云计算与大数据”的最新研究领域, 旨在为从事研究的专家、学者、工程师和技术人员提供一个国际平台&#xff0c;分享科研成果和尖端技术&#xff0c;了解学术发展趋势&…

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性&#xff08;变量&#xff09;和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些相同的属性和方法&#xff0c;所有的子…

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA&#xff0c;需要先按照Graphql插件&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;打开插件管理 在IDEA中&#xff0c;打开主菜单&#xff0c;选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

【最新鸿蒙应开发】——HarmonyOS沙箱目录

鸿蒙应用沙箱目录 1. 应用沙箱概念 应用沙箱是一种以安全防护为目的的隔离机制&#xff0c;避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下&#xff0c;应用可见的目录范围即为应用沙箱目录。 对于每个应用&#xff0c;系统会在内部存储空间映射出一个专属的应用沙箱…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前&#xff0c;我们要知道linux是一个操作系统。 那操作系统是什么呢&#xff1f;&#xff08;这里只做大概了解&#xff09; 操作系统就是一个管理软硬件的软件。 它对上提供良好&#xff08;稳定、高效、安…

Java面试题--JVM大厂篇之掌握JVM性能优化:选择合适的垃圾回收器

掌握JVM性能优化&#xff1a;选择合适的垃圾回收器 引言: ​  在Java开发中&#xff0c;性能优化往往是提高应用稳定性和用户体验的关键所在。而垃圾回收器的选择和优化&#xff0c;是JVM性能调优的核心环节。如何在众多垃圾回收器中选出适合自己应用需求的那一个&#xff1…

在Kubernetes中部署Elasticsearch高可用集群详细教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

网络编程之XDP和TC

一、TC之于XDP 在前面分析过XDP&#xff0c;今天简单分析一下与其相关的TC&#xff0c;即traffic control,流量控制。在分析XDP时知道其只能用于ingress方向触发&#xff0c;而TC却可以在两个方向即ingress和egress方向触发。也可以简单理解成它可以同时钩住进出两个方向的数据…

网络安全(补充)

物理安全威胁一般分为自然安全威胁和人为安全威胁。自然安全威胁包括地震、洪水、火灾、鼠害、雷电&#xff1b;&#xff1b;&#xff1b;&#xff1b;人为安全威胁包括盗窃、爆炸、毁坏、硬件安全防火墙白名单策略&#xff1a;只允许符合安全规则的包通过防火墙&#xff0c;其…

算法day31

第一题 542. 01 矩阵 本题本来求解的是每一个1到0的最短距离并返回到矩阵之中&#xff1b; 我们采用正难则反的思路&#xff0c;将其化解为每一个0到每一个1的最短距离&#xff0c;并通过矩阵来返回&#xff1b; 解法&#xff1a;多源bfs正难则反 步骤一&#xff1a; 定义一个…

STM32单片机选型方法

一.STM32单片机选型方法 1.首先要确定需求&#xff1a; 性能需求&#xff1a;根据应用的复杂度和性能要求&#xff0c;选择合适的CPU性能和主频。 内存需求&#xff1a;确定所需的内存大小&#xff0c;包括RAM和Flash存储空间。 外设需求&#xff1a;根据应用所需的功能&…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站&#xff0c;不得不说这是一个神奇的网站&#xff0c;在这个网站上你可以实现不可思议的各种操作&#xff0c;让我们对网站有了新的认知&#xff0c;因为它告诉你不是所有有趣的网站都那么花哨&#xff0c;有些网站看着外形平淡无奇…

【工业自动化领域解决方案】利用Profishark工具捕获EtherCAT报文

随着工业自动化技术的不断进步&#xff0c;对于实时数据捕获和分析的需求也在增加。尤其在EtherCAT这样的高性能工业网络中&#xff0c;精准的报文捕获和分析工具显得尤为重要。在这篇文章中&#xff0c;我们将深入探讨如何利用ProfiShark工具捕获EtherCAT报文&#xff0c;并展…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络&#xff08;FFN&#xff09;2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

Sentence Transformers x SwanLab:可视化Embedding训练

Sentence Transformers(又名SBERT)是访问、使用和训练文本和图像嵌入&#xff08;Embedding&#xff09;模型的Python库。 你可以使用Sentence Transformers快速进行模型训练&#xff0c;同时使用SwanLab进行实验跟踪与可视化。 1. 引入SwanLabCallback from swanlab.integra…

XSS攻击

黑客怎么拿到你的cookies呢&#xff1f; 浏览器可以执行脚本 网站有留言板 黑客发现留言板有xss漏洞&#xff0c;没有做过滤 一般就是网络管理员登录后台查看留言数据&#xff0c;然后就会产生cookies 然后之前黑客留言的东西就包含恶意的程序&#xff08;不仅写了留言&am…

运维系列.在Docker中使用Grafana

运维专题 在Docker中使用Grafana - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_2855026…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…