最近把用了好几年的 Postman 换掉了。换来换去的原因不是 Postman 功能不够,而是它越来越像一个“全家桶”:启动慢、登录墙、更新提醒、云端同步卡顿,加上电脑内存越来越紧张。直到同事丢过来一个安装包,只有 10 MB 级别,双击打开主界面几乎秒现——启动不到 1 秒的 Postman 替代品,居然不是噱头。这款工具就是 Bruno,开源、免费、离线优先。我用了两三周之后,日常接口调试基本不碰 Postman 了。如果你也受够了接口工具的臃肿和卡顿,或者刚要开始学接口测试想找一个轻巧的入口,这篇迁移记录和实操总结可能对你有用。
我会从它为什么能做到这么轻写起,然后讲怎么把 Postman 里的历史接口搬进来,再到断言、环境变量、自动化跑集合这些日常高频操作,最后是一些真实踩过的坑。整个过程偏实战,尽量不写空话。
1. 轻量是怎么做到的:10 MB 安装包背后的产品取舍
1.1 体积和启动速度的数字是怎么来的
先明确一件事:Bruno 的轻量不是靠牺牲功能换来,而是产品架构完全不同。Postman 启动时要干的事情太多,加载登录状态、检查更新、初始化远程工作区、同步云端集合,哪怕你只是打开一个本地请求,它也会先把一堆和网络相关的子系统唤醒。网上有个很形象的说法,Postman 本质上是个套着接口调试外壳的浏览器应用,逻辑没毛病,代价是不可避免的启动延迟。
Bruno 走的是“本地优先”路线。安装包 10 MB 级别,数据全部存成你机器上的普通文件,启动时只做一件事:读取本地文件夹。没有账号体系,不需要联网,不需要等待远端返回集合数据。我实测的感受是,双击图标到完整界面出来,真的不到 1 秒,在 Windows 和低配 Mac 上都试过。开发工具做减法做到这个程度,体验提升非常明显。
有人会问,同样是基于 Web 技术,为什么很多同类工具体积动辄几百 MB,而它能控制在 10 MB 左右?这里面的关键在于它没打算把所有能力内置。不需要内置协作平台、不需要内置团队管理、不需要内置一堆云端服务,安装包里装的只是核心编辑器、请求引擎和脚本运行时。这样设计还有个好处:安装包小,安装过程中的权限检查和杀毒软件误报概率都低一些。
1.2 它和 Postman 的本质区别
用一张表说清楚两者核心差异:
| 对比项 | Postman | Bruno |
|---|---|---|
| 数据存储 | 云端工作区 + 本地缓存 | 本地文件夹,纯文本文件 |
| 登录/账号 | 强制注册,免费版受限 | 无账号体系,开箱即用 |
| 启动速度 | 慢,受网络和更新影响 | 快,本地直读 |
| 协作方式 | 云端共享、团队工作区 | Git 仓库管理文件 |
| 脚本支持 | JavaScript,pm 对象 | JavaScript,bru 对象 |
| 中文界面 | 官方支持 | 设置中可切换,非全部版本 |
最影响我决策的是存储方式。Postman 把数据放云端,方便是方便,但导出、备份、迁移始终隔着一层,而且免费版对协作成员数、同步频率都有隐性限制。Bruno 的数据本质上就是一个文件夹,里面是 .bru 文件或 yml 文件,接口定义清清楚楚地躺在你磁盘上,直接扔进 Git 仓库就能做版本管理。这种模式对一个重视资产沉淀的技术团队来说,比账号体系里的云端工作区更让人安心。
当然,Bruno 也不是没有代价。它的生态插件、团队管理、在线协作功能都比 Postman 少,如果你重度依赖 Postman 那些周边能力,迁移前需要评估。但只是做接口调试和自动化测试这一亩三分地,它完全够用,甚至更顺手。
2. 从 Postman 迁过来的第一小时:安装、中文设置、数据导入
2.1 下载安装和平台支持
我从官网下载的 Windows 安装包,确实只有 10 MB 左右,安装过程比大多数软件都安静,没有捆绑、没有注册流程、没有“开始试用”的弹窗。装完第一次启动,界面直接就出来了,连个欢迎向导都没有。说实话,被 Postman 的首次启动引导和注册页烦过很多次之后,这种“默认你不需要被教育”的设计反而让人舒服。
安装方面不用花太多心思,官方网站和 GitHub Releases 都提供了主流平台的安装包:Windows 有 exe 和便携版,macOS 有 dmg,Linux 有 AppImage 和 deb。特别说一下便携版,我经常需要去客户现场临时调试接口,直接解压到一个 U 盘里就能跑,不用往对方电脑上装东西,这一点是很多大型工具做不到的。
第一次启动后建议先去设置里确认一下语言。Bruno 的语言切换在设置界面的对应选项里,找到语言相关配置,选择中文即可。如果你当前版本找不到中文选项,大概率是版本太老,去官网更新到最新版就行。另外,它不需要“跳过注册”这种操作,因为压根没有注册环节,打开即用。
2.2 免登录的体验为什么值得强调
对开发者来说,免登录这件事的价值常常被低估。Postman 这几年把“必须登录”卡得很严,哪怕只是本地调试,也要先过一遍账号体系。尤其在离线环境或者内网环境里,这种强制登录简直致命。我在一个完全隔离的机房环境下调试过海康设备的订阅推送接口,那会儿最困扰的不是接口协议,而是工具压根没法用。换成本地优先、不需要账号的工具之后,这类问题直接消失。
免登录带来的另一个好处是数据隐私。所有请求记录、环境变量、测试脚本都只存在本机,没有“上传到云端”这个默认动作。对一些对数据敏感的项目来说,这一条就是硬需求,连公司审计也不会来找你喝茶。
2.3 把历史接口搬进来:三种导入方式
迁移最怕的是历史资产搬家麻烦。Bruno 提供了从 Postman 导入集合的入口,把 Postman 里导出的 Collection JSON 文件直接拖进去,就能还原大部分请求,包括请求头、参数、body 结构。需要注意,Postman 集合里那些高度依赖 pm 对象的测试脚本,导入后基本需要重写,API 对象从 pm 换成了 bru,这部分逃不掉。
第二种方式是导入 OpenAPI/Swagger 文档。后端如果已经有标准接口文档,直接在导入入口选择 OpenAPI 格式的文件,工具会帮你生成一组请求集合。这种方式非常适合项目初期的接口联调,比一条条手敲快得多。
第三种方式适合临时抓包回放。在浏览器开发者工具的网络面板里,找到你要调试的请求,右键选择“复制为 cURL”,然后在 Bruno 导入入口里选择导入 cURL 命令,粘贴过去就能生成一个完整请求。这个特性我几乎天天用,尤其是排查线上问题时,从用户浏览器里复制一段 cURL 回来,立刻就能复现请求场景,效率极高。
从 Postman 导出接口文件、再用新工具导入,这一步熟练之后十分钟内就能搞定。关键是导入之后要养成整理目录的习惯,别让一堆命名为“New Request 15”的请求堆在那里,接口资产和代码一样,不整理就是负债。
3. 日常接口调试和自动化测试:顺手程度才是关键
3.1 请求构建与参数管理的日常操作
界面布局上和 Postman 是同一套逻辑:顶部是请求方法和 URL,下面是 params、headers、body 等标签页。习惯 Postman 的人切过来基本不用学。请求参数支持直接编辑和批量修改,也支持在 URL 里用环境变量占位,比如https://{{baseUrl}}/api/user/{{userId}},这个语法和 Postman 的{{var}}是兼容的,迁移时不需要改。
Bruno 的集合是用文件夹组织的,一个集合对应本地一个目录,请求以文件形式存储,这就意味着你可以把请求文件直接发给同事,或者提交到 Git。团队里做接口评审时,直接看请求文件内容比打开 Postman 截图要高效得多。我还试过把集合目录挂到私有代码仓库,配个 Webhook,每次接口变更都走 PR 流程,接口定义就像代码一样能被 review,这个体验是过去用 Postman 时完全不具备的。
3.2 断言和返回值提取的写法
接口调试只靠肉眼看得特别低效,尤其是登录态、分页数据、状态码这类信息,肉眼扫一遍容易漏。Bruno 支持在请求的测试脚本区域写 JavaScript 断言,基本逻辑和 Postman 的 pm 对象很像,对象名换成了 bru。下面是我项目里一段实际的登录接口脚本,演示了状态码断言、响应体断言、以及把 token 提取到环境变量三个动作:
if (res.status === 200) { const body = res.body; // 提取返回值里的 token 存到环境变量,后面的请求直接 {{token}} 引用 if (body.data && body.data.token) { bru.setEnvVar("token", body.data.token); } // 断言业务状态 bru.test("业务状态码为0", () => { bru.expect(body.code).to.equal(0); }); }这段脚本每次请求发出去之后会自动执行。跑完点开测试结果,能看到哪条断言通过、哪条挂了。这位相当于给接口加了一道自动检查,接口字段改了、状态码变了,跑一遍就能感知到。
需要明确的是,不同版本对 bru 对象的 API 支持细节略有差异。我自己在升级版本时遇到过setEnvVar和setVariable同时存在的情况,老脚本跑着跑着报错,后来才意识到是版本变更导致的。遇到这类问题,最快的解法是看官方示例集合,里面几乎覆盖了所有脚本用法,别自己瞎猜。
3.3 webservice 和回调/订阅类接口怎么调
这一节专门说两类看着和 Postman 周边环境绑定很深的场景。
第一类是 webservice 接口,本质上是 SOAP 协议那套。很多人一上来就想找现成插件,实际在 Bruno 里直接用 raw body 构造 XML 或 JSON 请求就行,重点是把 Content-Type 设成对应的 text/xml 或 application/soap+xml,同时把 SOAPAction 请求头设置正确。只要这两个头不出错,那些听起来唬人的 webservice 接口完全能正常调通。
第二类是海康设备这种回调/订阅类接口。调试思路不是“点一下网页然后等结果”,而是先构造一个订阅请求,把回调地址指到你能接收的位置,然后在另一端等待设备方的主动推送。我实际碰到的问题基本都是回调地址不可达、端口被防火墙拦截之类的网络问题,工具自身反而没有任何阻碍。本地调试时如果服务起在局域网里,记得确认目标设备能访问到你在这台机器上监听的端口;如果跨网络调试,就要配置可靠的网络通道,这一步要根据现场网络条件来,工具本身能做到最快程度的请求复现和异常响应解读。
3.4 “定时 post”到底怎么实现
搜索热词里“postman 可以定时 post 吗”出现率一直不低。Bruno 本身没有内置定时器,但定时执行接口这件事有现成套件:CLI + 系统定时任务。安装官方命令行工具后,一条命令就能跑完整个集合,然后交给系统来调度。
比如在 Windows 上用任务计划程序创建一个任务,每天执行一次:
bru run --env prod --collection ./path/to/collection生产环境我一般不用 Windows 计划任务,而是直接写进 CI:Jenkins 配定时构建,或者 GitLab CI 里配置定时 pipeline。这样接口自动化测试的结果能和构建日志放在一起,历史记录、失败通知、报告归档全都顺带解决了。说白了,定时跑接口这件事应该工具化、脚本化,而不是指望一个 GUI 软件内置个定时器,脱离 CI 去聊定时执行,后期的维护成本会高很多。
4. 从单机到团队协作:命令行跑集合、环境组织和避坑清单
4.1 用 CLI 把接口集合跑成自动化测试
命令行跑集合是 Bruno 一个很出彩的地方。安装命令行工具后,在没有图形界面的服务器上也能执行测试,这让接口回归测试完全可以做到无人值守。
npm install -g @usebruno/cli之后在集合目录下执行:
bru run --env prod工具会逐条发送请求,执行每个请求里挂的断言,最终在控制台输出测试通过和失败统计。如果某条断言挂了,会明确标出是哪个请求的哪个断言失败,定位问题比打开 GUI 一个个点要快得多。
把这个命令接进 CI 流程是最常见的玩法。我现在的做法是:每次代码合并前,在流水线里跑一遍接口回归集合,环境分支对应 dev 或 staging 环境。有一段时间同事改后端接口没通知前端,结果接口自动化直接在合并前拦住了一大片问题,这种价值无法用节省的时间衡量。相比 Postman 生态里的 Newman,它有类似的能力,但不需要登录、不需要 API Key,在轻量级流水线里集成成本低很多。
4.2 环境变量和多人协作的推荐组织方式
环境变量管理直接决定了一套接口集合能不能从一个人手里长出来,变成团队基础设施。Bruno 使用 .env 文件来管理环境变量,支持多个环境并存。我的目录结构通常是这样组织的:
collection/ ├── environments/ │ ├── dev.bru │ ├── test.bru │ └── prod.bru └── requests/ ├── 登录.bru ├── 用户列表.bru └── 订单详情.bru每个 .bru 文件对应一个环境,里面写好这个环境下的 baseUrl、账号、token 等变量。请求文件里不写死任何环境相关的值,统一用{{var}}占位。切换环境时只需要在界面里选中对应环境,或者命令行里加--env prod,同一个集合就能在开发、测试、生产三个环境之间横跳。
多人协作时,环境文件要谨慎提交到 Git。dev/test 环境的信息可以共享,但包含生产账号、密码、密钥的变量建议单独维护一个本地文件,并在 Git 忽略列表里排除掉。这个道理和代码里不提交数据库密码一样,别嫌啰嗦,栽过的都懂。
4.3 实际使用的坑清单
最后把我这段时间踩过的坑集中列一下,每一件都是真实遇到过、花了时间排查过:
| 坑 | 现象 | 解决方案 |
|---|---|---|
| 中文语言选项找不到 | 版本过旧,设置里没有语言配置 | 下载最新版,语言设置在偏好设置中切换 |
| Postman 导入后脚本全部失效 | pm 对象不存在,断言不执行 | 手动改写脚本,把 pm 替换为 bru 对应写法 |
| webservice 接口请求失败 | 报错经常是“服务器返回 500”或解析失败 | 重点检查 Content-Type 和 SOAPAction 两个请求头 |
| 本地调试自签名证书请求失败 | 请求发出后一直报证书错误 | 本地调试时可以在设置中关闭 SSL 校验,生产环境不要开 |
| 环境变量路径含中文/空格 | 某些脚本读取变量时解析异常 | 尽量避免在集合目录路径中放中文和空格字符 |
| 脚本里 console.log 输出难找 | 打了日志不知道去哪看 | 在工具的运行结果面板/日志区域查看输出 |
这里单独提一下自签名证书的坑。很多时候公司内网接口用的是内网 CA 或者自签证书,这种环境下 Bruno 默认会拦截,表现是请求发出去就报错,但错误信息又不太明确。我一开始以为是请求构造的问题,反复改参数浪费了大半个小时,后来才意识到是证书校验的问题。本地调试阶段在设置里关闭 SSL 校验能快速绕过,但这个方法只建议在安全可控的内网环境中使用,生产环境千万别这么干——那是给线上埋雷。
还有一个容易忽略的问题是数据文件夹的权限。如果你把集合目录放在系统盘受保护的位置,可能会遇到无法写入 .env 文件的情况,表现得很奇怪,比如“环境变量保存了但下次启动又没了”。遇到这种问题先看目录权限,然后用一个普通用户目录下的位置放集合,基本就能解决。
最后说点实在的
换工具这件事,最大的成本从来不是安装和迁移,而是改变习惯。我用了大概一周之后,就不再纠结“它少了哪些 Postman 的功能”,而是开始享受“启动快、不被打扰、数据在自己手上”的感觉。版本控制、命令行跑测试、团队 PR review 接口变更,这些才是最贴合开发日常工作流的体验。如果你也被 Postman 的启动转圈和登录提示搞得没脾气,花十分钟装一个轻量替代品,试一晚上,多半就回不去了。