Bruno CLI 如何同时输出 JSON、JUnit 与 HTML 测试报告并用 --reporter-skip-headers 控制报告头
在 CI 或本地跑 Bruno API 集合时,常见的需求是:同一次 bru run 既要产出机器可解析的 JSON 报告,又要给 CI 流水线(如 Jenkins、GitLab CI)提供 JUnit XML,还要一份 HTML 报告供团队在浏览器里查看,同时报告里不能留下 Authorization 这类敏感请求头。Bruno CLI 的 run 命令支持在同一次执行中通过 --reporter-json、--reporter-junit、--reporter-html 三个选项各写一个报告文件,并用 --reporter-skip-headers 指定要从报告输出中剔除的报头,无需跑多次。
准备条件
-
全局安装 Bruno CLI(使用任意 Node 包管理器,以 NPM 为例):
npm install -g @usebruno/cli -
进入 API 集合所在目录再执行
bru run。Bruno CLI 的退出状态码文档中明确列出了4 -- bru was called outside of a collection root directory,即命令必须在集合根目录下调用,否则直接报错退出。
一次运行同时输出三种格式的报告
bru run 为每种报告格式提供了独立选项,三者可以在同一条命令中叠加使用:
| 选项 | 作用 |
|---|---|
--reporter-json <string> |
指定生成 JSON 报告的路径 |
--reporter-junit <string> |
指定生成 JUnit 报告的路径 |
--reporter-html <string> |
指定生成 HTML 报告的路径 |
执行示例(在当前集合根目录下运行,递归处理时加 -r):
bru run folder -r \
--reporter-json reports/report.json \
--reporter-junit reports/report.xml \
--reporter-html reports/report.html
run 命令的内部实现(run.js 中 formats 的收集逻辑)会把每个有值的 reporter 选项登记为一个格式,运行结束后统一写出各报告文件,因此三个选项互不冲突,指向的路径建议先创建好所在目录——退出码 2 表示 "the specified output directory does not exist"。
如果只需要单一格式,文档给出的替代路径是 --output 配合 --format(可用格式为 json(默认)或 junit):
bru run request.bru --output results.json
bru run request.bru --output results.xml --format junit
注意 --output 只能写一个文件,与 --reporter-* 系列定位不同;多格式需求用 --reporter-* 叠加即可。
用 --reporter-skip-headers 控制报告中的请求头
--reporter-skip-headers 是一个数组类型选项,可重复传入,每个值表示要从报告输出中跳过的一个报头名:
bru run --reporter-skip-headers "Authorization"
其处理逻辑在 sanitize-results.js:对每个结果,分别遍历 result.request.headers 与 result.response.headers,按大小写不敏感的方式匹配并删除命中的报头,所以 --reporter-skip-headers "authorization" 与 "Authorization" 效果一致。
几个关键边界:
- 该选项只影响报告输出(run.js 中的描述是 "Skip specific headers from the reporter output"),请求本身仍会照常携带并发送这些报头,不会改变线上行为;
- 如果不想在报告中保留任何报头,直接用布尔选项
--reporter-skip-all-headers("Omit headers from the reporter output"),它会把请求和响应头整体置空; - 同类还有
--reporter-skip-request-body、--reporter-skip-response-body和同时省略两者的--reporter-skip-body,与报头过滤可自由组合。
组合完整场景的命令如下:
bru run folder -r \
--env Local \
--reporter-json reports/report.json \
--reporter-junit reports/report.xml \
--reporter-html reports/report.html \
--reporter-skip-headers "Authorization" \
--reporter-skip-headers "Set-Cookie"
说明:--env Local 为可选分支,仅当集合需要指定环境时使用;--reporter-skip-headers 重复书写一次即跳过一个报头。
验证结果
- 退出码:
0表示执行成功,1表示集合中存在失败的请求、测试或断言(完整退出码表见 readme.md 的 "Scripting" 一节)。CI 中可用退出码判断本次集合是否全部通过。 - 报告文件:确认
reports/report.json、reports/report.xml、reports/report.html三个文件按指定路径生成。JSON 报告的内容是一个包含summary(totalRequests、passedRequests、failedRequests、totalAssertions 等统计字段)与results(每个请求的明细)的对象结构,可在浏览器或jq中直接查看。 - 报头是否被剔除:检查 JSON 报告中对应请求的
request.headers与response.headers,其中不应再出现Authorization、Set-Cookie字段,其余报头保留。JUnit 报告中的用例结构(testsuite/testcase、@name、@status、failure 节点)可参考 junit.spec.js 中的断言;HTML 报告则在浏览器中打开确认请求头展示区域已不包含被跳过的项。
限制与注意事项
- 报告路径所在目录必须已存在(退出码
2);--output使用--format传入了不支持的格式时退出码为9。 --reporter-skip-headers只做报告层面的过滤:被跳过的报头仍会随真实请求发送,如果目标是"减少网络上传输的报头",该选项不解决该问题。- 可选配合项:
--tests-only只跑带测试/断言的请求,--bail在首个失败后停止执行;两者都会改变最终报告内容,按需使用。 - 更完整的选项说明见 packages/bruno-cli/readme.md 的 Command Line Options 表格,以及
run命令实现 packages/bruno-cli/src/commands/run.js。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00