惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
U
Unit 42
V
Visual Studio Blog
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
博客园 - Franky
C
CXSECURITY Database RSS Feed - CXSecurity.com
大猫的无限游戏
大猫的无限游戏
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
I
Intezer
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
腾讯CDC
博客园 - 【当耐特】
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Fortinet All Blogs
Project Zero
Project Zero
Blog — PlanetScale
Blog — PlanetScale
S
Security @ Cisco Blogs
量子位
M
MIT News - Artificial intelligence
美团技术团队
C
Cisco Blogs
S
Schneier on Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
Google Developers Blog
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
The Hacker News
The Hacker News
H
Help Net Security
S
Secure Thoughts
Scott Helme
Scott Helme
SecWiki News
SecWiki News
T
Troy Hunt's Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
O
OpenAI News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 司徒正美
T
Tenable Blog

Mohuishou

如何实现支持多集群的 Kubernetes Operator? 第三方应用如何调用我们 kubebuilder 生成的自定义资源? Kubernetes 简明教程 k8s job 为何迟迟不能结束? Go 工程化(十一) 如何优雅的写出 repo 层代码 Go 工程化(十) 如何在整洁架构中使用事务? 给博客添加章节目录 使用 Notion Database 管理静态博客文章 一个普通 Go 开发的三年 4. localhost 就一定是 localhost 么? Go可用性(七) 总结: 一张图串联可用性知识点 Go可用性(六) 熔断 10. 总结 9. kubebuilder 进阶: 源码分析 8. kubebuilder 进阶: webhook 7. kubebuilder 进阶: 测试 6. kubebuilder 实战: status & event 5. kubebuilder 实战: CRUD 4. kustomize 简明教程 3. KubeBuilder 简明教程 2. Kind: 如何快速搭建本地 K8s 开发环境? 1. Operator概述: 如何对 Kubernetes 进行扩展 Go可用性(五) 自适应限流 Go可用性(四) 漏桶算法 Go可用性(三) 令牌桶的实现 rate/limt Go可用性(二) 令牌桶原理及使用 Go可用性(一) 隔离设计 Go并发编程(十二) Singleflight Go工程化(九) 项目重构实践 Go工程化(八) 单元测试 Go工程化(七) Go Module Go工程化(六) 配置管理 Go工程化(五) API 设计下: 基于 protobuf 自动生成 gin 代码 Go工程化(四) API 设计上: 项目结构 & 设计 Go工程化(三) 依赖注入框架 wire Go工程化(二) 项目目录结构 Go工程化(一) 架构整洁之道阅读笔记 Go并发编程(十一) 总结 Go并发编程(十) 深入理解 Channel Go并发编程(九) 深入理解 Context Go并发编程(八) 深入理解 sync.Once Go并发编程(七) 深入理解 errgroup Go并发编程(六) 深入理解 WaitGroup Go并发编程(五) 深入理解 sync/atomic Go并发编程(四) 深入理解 Mutex Go并发编程(三) data race Go并发编程(二) Go 内存模型 Go并发编程(一) goroutine Go错误处理最佳实践 微服务(二) 服务发现&多租户 微服务(一) 微服务概览 5. 栈下: 深入理解 defer 4. 栈上: 如何实现一个计算器 Go Struct 初始化风格的抉择 3. 数组下: 使用 GDB 调试 Golang 代码 2. 数组上: 深入理解 slice 1. 链表: 深入理解container/list&LRU缓存的实现 Go设计模式24-总结(更新完毕) Go设计模式23-中介模式 Go设计模式22-解释器模式 Go设计模式21-命令模式 Go设计模式20-备忘录模式 Go设计模式19-访问者模式 Go设计模式18-迭代器模式 Go设计模式17-状态模式 Go设计模式16-职责链模式(Gin的中间件实现) Go设计模式15-策略模式 Go模板模式14-模板模式 Go设计模式13-观察者模式(实现简单的EventBus) Go设计模式12-享元模式 Go设计模式11-组合模式 Go设计模式10-门面模式 Go设计模式09-适配器模式 Go设计模式08-装饰器模式 Go设计模式07-桥接模式 Go设计模式06-代理模式(generate实现类似动态代理) Go设计模式05-创建型模式总结 Go设计模式04-原型模式 Go设计模式03-建造者模式 Go设计模式02-工厂模式&DI容器 笔记-让你最快速地改善代码质量的20条编程规范 Go设计模式01-单例模式 一点拙见-如何写好一个技术预研报告? Go Web小技巧(四)在单个仓库中支持多个 go mod 模块 Go Web 小技巧(三)Gin 参数绑定 Go Web 小技巧(二)GORM 使用自定义类型 Go Web 小技巧(一)简化Gin接口代码 go generate and ast hexo-next-algolia-search全文搜索 docker镜像瘦身&优化 GORM避坑指南之含关联关系的更新 Github Actions介绍&自动构建Github Pages博客 在blog中内嵌在线PPT 记一次net http内存泄漏 使用TravisCI自动部署Blog 使用Goland调试Go程序 一个十分边缘的gorm的bug Httprouter介绍及源码阅读 Gin源码阅读 从0.1开始
善用工具之postman高级用法概述
mohuishou <1@lailin.xyz> · 2019-07-11 · via Mohuishou

注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用

POSTMAN 是我在开发过程当中最常用到的 API 测试工具之一,虽然并不完美,但也是目前个人认为在 API 测试时最好用的客户端工具之一。

本文适用于后端,前端,移动端以及测试的同学,分三大部分从最简单的界面操作开讲,然后涉及到变量、脚本以及一些云服务相关的功能,最后将适配几个案例讲解怎么使用 POSTMAN 提高我们的工作效率。本文前半部分包含较多基础功能讲解,对已经比较熟悉使用的同学,可以选择性的跳过部分内容。

PS: 本文包含大量示例图片,大屏食用效果最佳,postman 看这一篇文章就够用了

零、序

我所有的文章基本都来自平时开发中的需求,前段时间在公司通过网关调用接口,测试很麻烦,然后就想使用在本地直接调用,由于有签名机制,所以需要通过 SDK 进行调用,后面比较完整的看了一下postman的文档,感觉发现了新大陆。

注: 本文会介绍 postman 的常用以及不太常用的高级用法,但是不会所有方面都去做细节介绍,希望可以起到的抛砖引玉的作用

一、简要介绍

postman是一款强大的 API 接口测试工具,有 chrome app、chrome 扩展、桌面版,推荐使用最新最强大的桌面版本。主要包括以下功能,本文也会围绕以下功能点展开讲解:

有 ☁ 标识表示为云服务

  1. API 测试
  2. 变量
  3. 代码生成
  4. Script
  5. API 代理
  6. ☁️ API 文档
  7. ☁️ Mock Server
  8. ☁️ 接口监控
  9. ☁️ Postman API

二、正文

2.1、使用简介

如下图所示,postman 界面十分丰富,基本上所有常用的功能都能一览无余

20220911175401

2.2、API 测试

如下图所示,API 测试页面十分的易用,操作界面一目了然。
20220911175446

2.2.1、认证

接口的调用常常需要通过登录,postman 预设一些常见的认证方式,比较常用的 Basic Auth, OAuth2.0 等,这些预设的协议在实际使用过程中会十分的有用。
20220911175459

通过上图我们可以发现,默认选项是从父目录中继承,所以如下图所示,其实我们可以在一个 Collection 或者是下面的文件夹中设置认证方式,这时候整个目录下的所有的 API 默认都可以通过认证
20220911175521

2.2.2、参数

所有 K-V 模式的参数都可以批量编辑, 包括 QueryString, Body, Header, 批量编辑的功能可以快速复制浏览器中的请求参数信息到 postman 中

20220911175553
20220911175558

2.3、变量

postman 中一共存在五种变量类型, 全局变量,Collection/文件夹中的变量,环境变量,数据变量,本地变量

20220911175611

如图所有变量层级从外到内,如果出现重复的变量名,里面的会覆盖外部的变量

2.3.2、变量设置

2.3.2.1、Collection 变量

点击编辑 Collection,如图所示

INITIAL VALUE: 这个值是用于分享给团队的成员的时候展示的值

CURRENT VALUE: 表示当前实际的值

20220911175624

2.3.2.2、环境变量 & 全局变量

环境变量和全局变量的设置在 postman 的右上角,设置界面和上图的 Collection 界面类似

20220911175634

2.3.2、变量的使用

变量通过 {{VAR_NAME}}, 在实际请求的时候变量可以设置为实际的值,变量也可以被脚本设置, 修改, 读取, 这个特性能够让我们有了很多可能

20220911175640

2.3.3、动态变量

postman 预设了几个动态变量{{$guid}}, 可以获取当前的时间戳等信息

20220911175645

2.4、代码生成

如图所示,postman 提供了很多语言以及一些常用框架的代码,我们在实际使用的过程中,可以直接复制代码节约许多时间

20220911175653

2.5、Script(划重点)

2.5.1、简介

在 POSTMAN 中,你可以通过编写 JavaScript 脚本增强其功能,POSTMAN 的脚本运行在其提供的沙盒环境中,如下图所示,点击左下角按钮可以出现调试窗口,会显示脚本的 debug 信息

20220911175700

在 postman 中一共支持两种脚本,分别是 Pre Request Script, Test Script,这两种脚本分别在请求前以及请求后生效,第一种我常用于生成各种签名或者是需要提前请求获取一些 token,后面一种更常见于集成测试中,用于控制测试的前后顺序,例如后面会讲到的案例,在 CD 前集成接口回归测试,确保主流程无误再上线等。

20220911175707

2.5.2、API

postman 提供了一些 API,pm.*, 例如:

1
2
3
4
5
6
7
8
9
10
pm.global.* # 全局变量相关
pm.environment.* # 环境变量相关
pm.request.* # 请求相关, 注意请求相关的信息时只读的不能修改
pm.sendRequest() # 发送请求

# 下面这些只能用于 test script
pm.response.* # 返回值相关
pm.cookies.* # cookies
pm.test() # 执行测试
...

除此之外还内置了一些常用的 npm 包可以直接使用,例如:

1
2
3
4
5
6
ajv → v6.6.2
atob → v2.1.2
btoa → v1.2.1
chai → v4.2.0
cheerio → v0.22.0
...

更多 API 信息可以访问官方文档查看: Postman Sandbox API reference

2.5.3、Pre Request Script

请求前执行该脚本,一般用于提前设置一些签名信息,上文提到过虽然 postman 将请求的信息暴露给了我们,但是我们并不能修改,那我们要如何才能够将我们生成的值放在请求之中呢?

答案是: 变量,如果签名信息仅在 header 之中使用,也可以直接插入新的 header 信息

下面我们来看一个例子

调用第三方服务的时候往往需要生成一个 Token 进行鉴权,这个示例会分别生成一个时间戳,以及利用自带的CryptoJS库进行AES加密签名,并且分别使用设置环境变量,新增 header 的方式注入到请求之中

20220911175717

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 从环境变量中获取密钥与appid
let secret = pm.environment.get("secret");
let appid = pm.environment.get("appid");

// 获取当前时间戳
let time = new Date().getTime();
console.log("time:", time + "");

// 直接向 Header 中插入一条新的记录
pm.request.headers.upsert({ key: "time", value: time });

// 签名
let sign = CryptoJS.AES.encrypt(time + appid, secret);

// 设置环境变量
pm.environment.set("sign", sign.ciphertext.toString().toUpperCase());

20220911175725

2.5.4、Test Script

测试脚本和一半的单元测试大同小异,这里简要介绍比较常用和重要的两个功能,详细了解可以点击查看文档

  • 基本的测试语句

    1
    2
    3
    4
    pm.test("测试名称", function () {
    // 断言
    pm.expect(pm.response.responseTime).to.be.below(200);
    });
  • 流程控制,可以对 API 测试的顺序进行控制

    1
    2
    3
    4
    // 设置下一个会被执行的请求
    postman.setNextRequest("request_name");
    // 终端流程
    postman.setNextRequest(null);

运行一共有两种方式,分别是 Collection Run 以及 newman cli 执行, newman 会在后文的案例之中提到

20220911175733
可以看到执行结果详细的信息,也可以导出

20220911175739

2.6、API 代理

这个功能对于客户端调试的同学十分有用,可以通过 POSTMAN 提供的代理功能,将客户端的请求保存在历史记录或者是一个 Collection 中

首先我们在 POSTMAN 进行如下设置,点击 Filters 还可以对请求的方法,URL 进行一些过滤的操作

20220911175747

接下来,以安卓手机为例,我们需要和电脑处于同一网段,并且在 WIFI 设置里加上代理

20220911175753

然后再到我们之前设置的 Collection 中就可以看到请求的记录了,如下图所示在手机上设置了代理之后访问了一下百度,所有的请求链接以及参数都会展示在 postman 中

20220911175758

2.7、☁️ API 文档

接下来,将会是云服务相关的功能,如果不能使用云服务这一趴可以跳过

20220911175804

如图所示文档发布成功之后,即可看到文档的详情,已经 API 详情,并且右侧有代码生成器,可以直接复制对应的代码,十分方便

20220911175815

详细示例可以点击查看 We 川大 API ,需要注意的是截止到文章发布时,postman 对免费账户文档有一定的限制每月公开文档只能有 1000 的访问

2.8、☁️ Mock Server

同样十分的简单,右键 Collection 点击 mock 并按照如图所示,进行一些简单的配置即可,注意 mock server 的数据是请求的时候 save example 的数据,并且同样免费账户,一个月只能调用 1000 次 API,可以点击查看 We 川大 API ,里面的文档示例就是使用的 Mock Server

20220911175824

2.9、☁️ 接口监控

同样十分的简单,右键 Collection 点击 monitor collection 并按照如图所示进行一些配置,可以选择 频率,接口监控的位置,触发时间等字段

20220911175830

2.10、☁️ Postman API

除此之外 POSTMAN 还提供开放的 API 使其有更多的可能,如图所示获取 API Key,具体的使用请点击查看 API 文档, 通过 API 我们可以实现一些自动化的操作,也可以自动生成文档,然后用 github pages 进行部署,不受账户限制等等,由于文章篇幅有限,这里就不展开讲了。

20220911175837

三、使用案例

3.1、和 CI/CD 联动,进行接口自动化测试

postman 提供了一个命名行工具,newman, 通过它我们可以在我们的 CI /CD 的流程上加入接口自动化回归的流程,确保服务的稳定性

接下来,我们以 gitlab ci/cd 为例,配置一个简单的接口回归

newman 具体的使用方法可以查看官方的文档或者是github 仓库的介绍, 这里不再赘述,我们直接看一下简单的使用

首先是 .gitlab-ci.yml 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
stages:
- test

api_test:
stage: test
image: node:11.15.0
before_script:
- npm install -g newman
script:
# 此处执行的是官方的一个例子,run 后面可以是导出的Collection的文件,也可以是分享出来的Collection
- newman run "https://www.getpostman.com/collections/631643-f695cab7-6878-eb55-7943-ad88e1ccfd65-JsLv"
tags:
- gitlab-org

如下图所示我们可以看到具体的执行结果,返回的信息也比较详细,和上文的 Test Script 脚本结合就可以达到我们想要的接口回归测试的效果

20220911175846

点击可以查看这个 demo

3.2、本地接口文档

在上文我们有提到过,postman 的云文档比较好用,但是免费账户的限制比较大,并且很多时候在公司我们不能使用一些云的功能,这个时候,我们就可以通过导出 postman collection 并且使用一些第三方的工具,或者是自己实现一个接口文档的生成功能,来达到输出本地文档的目的

这里我们借助 docgen 这个轮子来输出一份本地的文档,类似的工具还有许多,实现上也不复杂,如果有格式上的一些需求完全可以一两个小时的功夫造出一个还能用的小工具

1
2
3
4
# 只需要导出json文件,就可以输出在线文档,或者是生成html,markdown 文件了
$ ./docgen.exe server -f We川大.postman_collection.json
2019/07/12 00:30:51 Listening on port: 9000
2019/07/12 00:30:51 Web Server is available at http://localhost:9000/

生成的效果如下图所示:

20220911175855

总结

这篇文章拖的稍微有点点久,内容有点超出最开始的预计,写的稍稍有点点多了,POSTMAN 还有需要有用的玩法,大家可以探索一下,除了上文讲到的之外,说一些我常用到的方式

  • 利用 collection run 批量提交请求,做一些批处理的工作
  • 利用 pre request script 设置在 Collection 中,然后用不同的环境变量区分不同的项目,这种用在网关类的测试十分有

文章比较长,感谢你的阅读

参考资料

  1. Postman 官方文档,很全面,基本上所有的操作都能在上面找到
  2. Postman 高级用法
  3. Postman 高级应用(9):API 收集神器——请求拦截
  4. We 川大 API
  5. newman
  6. gitlab ci demo
  7. docgen

关注我获取更新

猜你喜欢