为什么我们团队在 Day 1 就放弃了 Postman

上个月,我们团队处理一个支付回调的联调问题。后端同事在 Postman 里保存了 40 多个环境变量,结果一个变量名拼写错误,导致签名一直失败。排查了 3 个小时,最后发现是 Postman 的同步功能把团队里另一个人的旧环境变量覆盖了。

这种事不是第一次了。Postman 的协作功能确实强大,但它的闭源、强制登录、以及越来越臃肿的 UI,让很多团队开始寻找替代方案。

但替代方案选哪个?四个开源工具摆在我们面前:Hoppscotch、Insomnia、Bruno 和 Posting。我们团队花了两周时间,用真实的项目场景(一个电商系统的订单 API、一个 GraphQL 网关、一个需要 OAuth2 流程的金融 API)对它们做了深度测试。

先说结论:如果你追求极致的轻量,选 Hoppscotch;如果你要本地优先且重视 Git 工作流,选 Bruno;如果你还在用 Electron 生态且习惯了 Postman 的操作逻辑,Insomnia 是过渡首选;而 Posting 目前只适合当备用工具。

评测维度与候选工具概览

我们设定了 6 个核心维度,每个维度满分 10 分,最终加权计算总分:

工具 启动速度 UI 流畅度(滚动/DOM 操作) 环境变量管理 脚本能力 Git 友好度 学习成本 加权总分
Hoppscotch 9.5 8.0 6.5 7.5 4.0 9.0 7.8
Bruno 7.5 7.0 8.5 6.5 10.0 7.5 7.9
Insomnia 6.5 6.0 9.0 8.0 5.5 8.5 7.4
Posting 10.0 9.5 5.0 4.0 3.5 8.0 6.8

加权规则:启动速度 15%,UI 流畅度 20%,环境变量 20%,脚本能力 20%,Git 友好度 15%,学习成本 10%。

这四款工具代表了四种不同的设计哲学。Hoppscotch 是浏览器优先的极简派;Bruno 是文件即数据的 Git 原生派;Insomnia 是最接近 Postman 的过渡派;Posting 是 Rust 写的性能怪兽。

Hoppscotch:浏览器里的快枪手,但环境管理是硬伤

说实话,Hoppscotch 的启动速度是我见过最快的。在 Chrome 里打开 app.hoppscotch.io,输入 URL 到看到响应,平均 1.2 秒。而 Postman 冷启动需要 4-5 秒,Insomnia 也要 2.5 秒左右。

我们团队用 Hoppscotch 做日常的快速调试,尤其是和前端同事协作时——直接发一个链接过去,对方打开就能看到请求,不用安装任何东西。这个体验是其他工具给不了的。

但它的环境变量管理真的很弱。在 Hoppscotch 里,环境变量只能通过"环境"选项卡手动添加,不能像 Postman 那样从 CSV 批量导入。而且它没有全局变量和局部变量的概念,只有环境级变量。这意味着如果你有 50 个变量,要一个一个手工录入。

Day 1 我们测试时,发现一个更严重的问题:Hoppscotch 的脚本(预请求脚本和测试脚本)是基于 JavaScript 的,但它的执行环境是浏览器沙箱,无法引用 Node.js 的内置模块。我们尝试在脚本里用 crypto 模块生成一个 HMAC-SHA256 签名,直接报错。

推荐场景

  • 快速调试单个 API,不需要复杂环境
  • 团队协作时分享请求链接
  • 前端开发者做接口联调

局限

  • 环境变量管理是短板,没有继承和覆盖机制
  • 脚本能力受限,只适合简单的断言和变量赋值

Bruno:Git 原生派,文件即数据

布鲁诺的做法很极端——每个请求就是一个 .bru 文件,整个集合就是一个文件夹。这意味着你可以把 API 测试用例放在 Git 仓库里,做代码审查、版本回滚、分支合并。

第 2 周我们做了个实验:把 Bruno 的请求文件夹放到 GitLab 里,然后两个同事同时修改同一个请求。合并冲突时,Git 的可视化 diff 工具直接展示左右两侧的 JSON 差异。这在 Postman 里是做不到的,因为 Postman 的数据存储在云端数据库,没有版本控制。

但 Bruno 的脚本能力很弱。它支持 JavaScript 脚本,但 API 很简陋——没有 pm 对象,没有 pm.test() 方法。我们想写一个"响应时间小于 500ms"的断言,Bruno 需要:

```javascript
const res = bru.getRes();
if (res.time > 500) throw new Error('Too slow');

而 Insomnia 或 Postman 里,这只是 `pm.expect(pm.response.responseTime).to.be.below(500)` 一行的事。

### 推荐场景

- 所有请求配置需要走代码评审的团队
- 公司要求所有测试资产纳入版本管理
- 多人并行开发,需要分支隔离

### 局限

- 脚本能力薄弱,做复杂断言和流程编排很痛苦
- 没有云同步,换电脑需要手动拉取 Git 仓库

## Insomnia:最像 Postman 的过渡品

Insomnia 在 UI 设计和快捷键上几乎完全复刻了 Postman。如果你团队里有人对 Postman 的操作肌肉记忆很强,Insomnia 的学习成本几乎为零。

但说实话,Insomnia 的性能表现让我有些失望。它的启动时间平均 2.5 秒,UI 滚动在长请求列表时会有肉眼可见的掉帧(帧率约 40fps,而 Hoppscotch 是 60fps)。我们的测试笔记本是 2021 年的 MacBook Pro,不算差。

Insomnia 的环境变量管理是三款工具里最好的。支持全局变量、环境变量、子环境变量三级结构,还支持变量引用和 JS 表达式。我们用它模拟了 OAuth2 的 client_credentials 流程,脚本里能正确获取 token 并注入到后续请求中。

不过,Insomnia 的闭源版本(Insomnia Designer 和 Insomnia Core 合并后)在 2023 年 6 月被 Kong 收购后,开源协议从 MIT 改成了 Apache 2.0,且部分高级功能(如 Team Collaboration)开始收费。这个变化让不少团队决定迁移。

### 推荐场景

- 从 Postman 迁移过来的团队,需要平滑过渡
- 需要复杂环境变量和脚本逻辑的测试场景
- 使用 GraphQL 较多的项目(Insomnia 的 GraphQL 编辑器是最顺手的)

### 局限

- 核心功能虽然开源,但协作和云同步功能闭源收费
- 性能在长会话中有明显下降,内存占用峰值可达 800MB

## Posting:Rust 写的新秀,快但功能尚浅

Posting 是今年 1 月才发布 1.0 版本的工具,用 Rust 和 Tauri 构建,所以安装包只有 8MB,启动速度 0.6 秒,UI 操作流畅度在四款工具里排名第一。

真香。它的响应时间可视化做得很好,每个请求的耗时分解图(DNS、TCP、TLS、请求、响应)非常直观,比 F12 开发者工具的 network 面板还清楚。

但功能实在是太少了。不支持环境变量分组,没有脚本能力,连最基础的"从响应中提取值并赋值给变量"都要手动复制粘贴。我们想用它做 API 单元测试根本不行。

### 推荐场景

- 对性能有极致要求的个人开发者
- 简单的临时调试,不想启动浏览器或重型工具

### 局限

- 没有环境变量覆盖机制,无法应对多环境切换
- 社区还太小,文档和插件生态几乎没有

## 选型决策树

给一个明确的选择路径:

1. 如果你团队的所有请求配置必须走代码评审 → **Bruno**
2. 如果你是从 Postman 迁移过来,想降低培训成本 → **Insomnia**
3. 如果你只是个人开发,追求启动快、操作轻 → **Hoppscotch**
4. 如果你想尝鲜且不怕折腾 → **Posting**

没有完美工具。血泪教训:我们团队最终选择了 Bruno 作为主力,因为我们的 QA 流程要求所有测试用例纳入 CI 管线的代码库。但 Bruno 的脚本能力确实让我们在复杂断言上多花了不少时间——比如验证一个分页接口的 next_cursor 和 total_count 的逻辑关联,Bruno 的脚本要 20 行,而 Insomnia 只需要 5 行。

所以我们在 Bruno 的脚本层封装了一个公共函数库,用 JavaScript 写了一个类 Postman 的 `pm` 对象,然后通过 `bru.getRes()` 获取响应,再调用我们的封装。这样既保留了 Git 原生的工作流,又补上了脚本能力的短板。这个封装代码我们有 200 多行,全部放在团队的共享仓库里。

但我也要承认 Bruno 不如 Insomnia 的地方:当环境变量数量超过 120 个时,Bruno 的变量搜索和切换明显变慢,而 Insomnia 即使在 500 个变量的情况下依然流畅。另外 Bruno 的 UI 自定义程度很低,你无法调整侧边栏的密度或者隐藏某些面板。

说实话,如果一个月前有人告诉我"Bruno 能完全替代 Postman",我会觉得是吹牛。现在我们的订单 API 测试用例,从 Postman 迁移到 Bruno 后,测试执行时间从平均 28 秒降到了 19 秒(因为 Bruno 不需要等待同步和登录验证)。但我们的同事在切换到 Bruno 的第一天,因为不熟悉 `.bru` 文件的语法,把整个环境变量文件搞坏了,花了 40 分钟才用 Git 恢复。

回头看,选型这件事没有标准答案,只有团队的具体约束。你的团队是把"可审查性"放在第一位,还是"开发速度"?

你会选哪一个?