
Bruno CLI 使用指南用bru命令驱动 API 集合测试与 CI/CD 自动化【免费下载链接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/brunoBruno CLInpm 包名usebruno/cli是 Bruno 项目的命令行执行引擎让你脱离图形界面、直接通过终端命令运行 API 集合Collection。本文围绕其官方文档展开结合仓库源码run.js、import.js、constants.js讲解安装、请求执行、集合导入、环境变量切换、报告生成、脚本化退出码等完整能力帮助你把它接入多环境测试与 CI/CD 流水线。一、安装与命令入口Bruno CLI 是标准的 Node.js 程序安装方式与普通 npm 包一致npm install -g usebruno/cli安装完成后系统会暴露bru命令。其命令入口定义在 bin/bru.js内容非常精简——只是调用了模块的启动函数#!/usr/bin/env node require(../src).run();而 src/index.js 基于yargs构建了严格的参数解析体系通过.strict()拒绝未知命令.commandDir(commands)自动加载commands/目录下的全部子命令当前包含run、import、docs并在无参数时打印横幅与帮助信息。CLI 启动时会先调用initializeShellEnv()来自usebruno/requests用于补全 shell 环境变量这对“作为子进程从 GUI 应用或 cron 定时任务中运行”的场景尤为重要。当前仓库中 CLI 版本号为1.16.0见 package.json不同版本间的可选参数可能存在差异实际使用以bru run --help输出为准。二、快速开始运行你的第一个集合运行 CLI 前先导航到存放 Bruno 集合的目录。Bruno 集合本质上是一个包含collection.bru或opencollection.yml与若干.bru请求文件的目录树CLI 会在当前工作目录process.cwd()见 run.js下构建集合模型并执行。运行集合内全部请求bru run不带任何路径时CLI 会默认把路径设为./并将recursive置为true见 run.js即递归执行当前目录下所有请求。执行结束后终端会打印一份表格形式的执行摘要包含Status / Requests / Tests / Assertions / Duration(ms)五个指标行实现见 printRunSummary。例如 Execution Summary ┌─────────────┬─────────────┐ │ Metric │ Result │ ├─────────────┼─────────────┤ │ Status │ ✓ PASS │ │ Requests │ 3 (3 Passed)│ │ Tests │ 0/0 │ │ Assertions │ 2/2 │ │ Duration(ms)│ 345 │ └─────────────┴─────────────┘2.1 运行单个请求或指定子目录除了整集合运行你还可以精确指定执行范围# 运行单个请求文件 bru run request.bru # 运行集合中某个子目录folder下的所有请求 bru run folder # 同时指定多个目标 bru run request.bru folder注意非递归地运行一个folder参数时只执行该文件夹直属的请求是否下钻到嵌套子文件夹取决于-rrecursive开关而缺省地递归整棵集合树时才默认启用-r。多个路径可以混用参考 run.js 中 yargs 对run [paths...]的example定义。2.2 运行环境目录之外会报错执行命令时所在目录必须是集合根目录即能向上解析出bruno.json/collection.bru等标识文件的目录。若bru被调用到集合根之外会以退出码4结束——这正是官方文档中“bru was called outside of a collection root directory”的含义对应 constants.js 中ERROR_NOT_IN_COLLECTION。三、环境变量与多环境测试同一个集合往往需要针对 Local、Staging、Production 等多套环境运行。Bruno 把环境变量存放在集合目录下的environments/文件夹中通过--env按名称选择bru run folder --env Local实现层面CLI 会按集合格式推断环境文件扩展名.bru或.yml由FORMAT_CONFIG[collection.format].ext决定去集合根/environments/env名ext加载环境变量见 run.js。若指定的环境文件不存在将以退出码6结束ERROR_ENV_NOT_FOUND。3.1 单次运行覆盖变量--env-varCI 场景下常需要临时注入密钥或动态参数而不想改文件可用--env-var以namevalue形式覆盖某个环境变量且允许多次使用bru run request.bru --env local --env-var secretxxx源码中对每个覆盖项都按正则/^([^])(.*)$/校验“键值”格式格式错误会分别以退出码7覆盖项不是字符串/数组或8覆盖项格式非法退出见 run.js 与 constants.js。3.2 补充的变量来源源码级能力除文档中明确列出的--env与--env-var外当前版本的 run 子命令还支持--env-file path直接指向一个.bru/.json/.yml环境文件支持绝对或相对路径--global-env name与--global-env-var namevalue用于基于 Workspace 的全局环境需要集合位于某个含workspace.yml的 workspace 内必要时用--workspace-path显式指定集合根目录下的.env文件也会被读取并合并进进程环境变量见 run.js。四、输出测试结果与报告默认bru run只在终端打印摘要。若需要把断言/测试结果沉淀成文件供 CI 解析使用--outputbru run folder --output results.json在源码中--output与--format别名-o、-f成对工作--output指定文件路径--format指定格式。当前 run 子命令支持三种格式json默认、junit、html见 run.js 与格式白名单校验逻辑。例如# JUnit 格式便于 Jenkins/GitLab CI 直接识别 bru run request.bru --output results.xml --format junit # HTML 可读报告 bru run request.bru --output results.html --format html当--format传入白名单之外的值时会以退出码9报错ERROR_INCORRECT_OUTPUT_FORMAT若输出路径的父目录不存在则以退出码2结束ERROR_MISSING_OUTPUT_DIR。如果你希望一次运行同时产出多种报告也可以使用独立的报告选项bru run request.bru --reporter-junit results.xml --reporter-html results.html--reporter-json、--reporter-junit、--reporter-html与--format/--output是兼容共存的——源码中会先把各 reporter 路径收拢进formats映射再逐一写入见 run.js。JSON 输出结构预览你可以直接参考仓库中随包附带的结果样例 examples/report.json其顶层由summary总请求数、通过/失败数、断言与测试统计与results每个请求的 method/url、response、断言明细等组成同时还有同目录下的 examples/report.html 可预览 HTML 报告形态。4.1 面向机密信息的脱敏选项源码补充报告往往需要脱敏后再归档。run 子命令提供了如下 reporter 脱敏开关均定义在 run.js并在每次结果入列后经sanitizeResultsForReporter处理--reporter-skip-all-headers报告中去掉全部请求/响应头--reporter-skip-headers Authorization仅去掉指定名称的头可传数组--reporter-skip-request-body/--reporter-skip-response-body分别去掉请求体 / 响应体--reporter-skip-body请求体与响应体一并去掉。五、控制执行策略--tests-only、--bail、--delay、--tags针对不同测试节奏run 子命令内置了如下执行控制参数--tests-only只运行“有测试脚本或启用了断言”的请求。源码中通过hasExecutableTestInScript()检查请求的 tests、pre-request 脚本script.req与 post-response 脚本script.res并结合“存在启用的断言”共同过滤请求见 run.js。注意--tests-only并不会让无测试请求“失败”而是直接跳过。--bail一旦某个请求 / 断言 / 测试失败立即终止后续执行。源码中会区分失败来源request / assertion / pre-request test / post-response test / test将剩余请求标记为 “Skipped (Bail)” 并计入摘要见 run.js。这与bru.setNextRequest()等脚本跳转逻辑nJumps 计数超 10000 时以退出码3报无限循环共同保证运行不会失控。--delay 毫秒在相邻两个请求之间插入固定延时适合限流或串行依赖场景源码会忽略delay 0与 NaN 值见 run.js。--tags hello,world与--exclude-tags skip按请求标签做包含 / 排除过滤内部调用usebruno/common的isRequestTagsIncluded非常适合在大型集合中挑选“冒烟测试”子集。六、安全连接自定义 CA 与忽略系统信任库当测试环境使用内网私有 CA 签发的证书时默认信任库往往无法校验服务端。官方文档给出的两种典型用法如下。6.1 在默认信任库基础上追加私有 CAbru run folder --cacert myCustomCA.pem此时myCustomCA.pem会与系统默认信任库叠加使用——适合“同时连接公网公网证书与内网私有证书两类对端”的场景。6.2 仅信任指定 CA 集合当需要把信任范围收缩到一组显式指定的 CA 时加上--ignore-truststore禁用默认信任库bru run request.bru --cacert myCustomCA.pem --ignore-truststore注意源码行为如果同时传了--insecure源码会打印Ignoring the cacert option since insecure connections are enabled并忽略--cacert见 run.js若--cacert指向的文件不存在也会在终端提示错误。6.3 其它安全相关选项源码补充--insecure允许不安全的服务器连接跳过证书校验仅限自托管的可信测试环境使用--client-cert-config file.json传入 JSON 文件做双向 TLSmTLS客户端证书配置文件需形如{ enabled: true, certs: [...] }文件不存在时以退出码5结束、JSON 解析失败时以退出码10结束见 run.js--cache-ssl-session开启 SSL 会话缓存跨请求复用 TLS 会话以缩短握手耗时--noproxy同时禁用集合级与系统级代理设置源码默认还会在未设置该标志时缓存系统代理见 run.js。七、集合导入从 OpenAPI / WSDL 起步如果团队已有 OpenAPI 或 WSDL 契约无需从零在 Bruno 中手写请求可直接用import子命令完成转换# 从本地 OpenAPI 文件生成集合目录 bru import openapi --source api.yml --output ~/Desktop/my-collection --collection-name My API # 等价的短别名形式-s / -o / -n bru import openapi -s api.yml -o ~/Desktop/my-collection -n My API # 直接抓取远程契约生成集合 bru import openapi --source https://example.com/api-spec.json --output ~/Desktop --collection-name Remote API导入成功后生成的 Bruno 集合目录可以直接在 Bruno 桌面应用中打开使用。7.1 输出为单文件 JSON若不需要目录形态例如只想快速预览或交给其他工具处理可用--output-file导出为单个 JSONbru import openapi --source api.yml --output-file ~/Desktop/my-collection.json --collection-name My API源码中--output与--output-file被声明为互斥选项conflicts二者至少必须提供其一见 import.js。7.2 导入选项一览OptionDetails对应 import.js 实现--source, -s源文件路径或 URL必填--output, -o输出目录若指向已存在的空目录则在其下以“净化后的集合名”建子目录--output-file, -f输出的 JSON 文件路径与--output互斥--collection-name, -n导入后的集合名称--insecure从 URL 抓取契约时跳过 SSL 证书校验可解决自签名契约站点的CERT_*报错--collection-format集合目录格式opencollection默认产出.yml或bru--group-by, -gOpenAPI 请求分组方式tags默认按 OpenAPI tag或path按 URL 路径结构补充说明当前import子命令支持openapi与wsdl两种类型type参数白名单见 import.js。转换本身在底层调用usebruno/converters包中的openApiToBruno/wsdlToBruno见 import.js源码可继续在 bruno-converters 与 bruno-converters 中追溯具体映射规则。八、完整的命令行选项参考bru run的选项除前文各节详述的外还包括如下高频项汇总自 run.js 的 builder 定义与官方文档表格选项说明-h, --help显示帮助信息--version显示版本号-r递归运行默认 false不带路径运行时自动为 true--cacert [string]用于校验对端的 CA 证书--ignore-truststore与--cacert联用时仅信任--cacert指定的 CA禁用默认信任库--env [string]指定要使用的环境名称--env-var [string]覆盖单个环境变量可多次使用namevalue-o, --output [string]结果写入路径-f, --format [string]输出格式json默认、junit或html--reporter-json [string]生成 JSON 报告的路径--reporter-junit [string]生成 JUnit 报告的路径--reporter-html [string]生成 HTML 报告的路径--insecure允许不安全的服务器连接--tests-only仅运行带测试或启用了断言的请求--bail某请求/测试/断言失败即停止执行--csv-file-path用 CSV 文件数据驱动运行集合--reporter--skip-all-headers报告跳过所有头部--reporter-skip-headers报告跳过指定头部--reporter-skip-request-body/--reporter-skip-response-body/--reporter-skip-body报告跳过请求体 / 响应体 / 两者源码补充--client-cert-config传入 JSON 文件配置客户端证书mTLS--delay [number]请求之间插入的延时毫秒--sandboxJS 沙箱类型safe默认quickjs或developernodevm--tags/--exclude-tags按标签包含 / 排除请求--env-file直接指定环境文件.bru/.json/.yml--global-env/--global-env-var/--workspace-path基于 workspace 的全局环境及其覆盖与路径定位源码补充--disable-cookies关闭 Cookie 自动保存与自动携带--noproxy禁用全部代理设置--cache-ssl-session启用 TLS 会话复用--verbose打印调试级详细输出九、脚本化集成退出码约定要让 CI 正确判定构建成败必须理解bru的退出码语义这也是官方文档 “Scripting” 一节的完整内容常量定义见 constants.js退出码含义0执行成功1集合中有断言、测试或请求失败2指定的输出目录不存在3请求链出现无限循环setNextRequest跳转超过保护上限4在集合根目录之外调用了 bru5指定的输入文件不存在6指定的环境不存在7环境变量覆盖项不是字符串或对象8环境变量覆盖项格式非法9请求了无效的输出格式255其它未知错误源码注1的判定在 run.js 中不仅包含失败的请求/断言/测试也包含 pre-request 测试、post-response 测试失败与请求级 error此外常量表还额外定义了10文件格式非法、11workspace 不存在、12全局环境需要 workspace、13全局环境不存在它们属于文档未列出但源码已覆盖的内部状态。典型 CI 用法示例GitHub Actions 风格# 安装 CLI npm install -g usebruno/cli # 运行集合并将结果输出为 junit交给 CI 解析 bru run . --env staging --output junit.xml --format junit # 失败退出码 1时流水线自动失败无需额外判断十、运行效果与更多参考命令行执行的整体效果可参考官方文档中给出的运行截图需要继续深挖的仓库资料CLI 入口与参数框架src/index.js、bin/bru.jsrun 子命令完整实现参数定义、环境加载、执行循环、报告写入、退出码判定src/commands/run.jsimport 子命令完整实现本地/URL 读取、JSON/YAML/WSDL 解析、目录与 JSON 两种产出src/commands/import.js退出码与颜色等常量定义src/constants.js单请求执行、变量插值、代理等底层逻辑src/runner/、src/utils/结果样例与 Docker 化部署参考examples/、docker/CLI 版本演进记录packages/bruno-cli/changelog.mdCLI 使用 MIT 协议开源许可文本见 license.md掌握以上命令后你便可以把 Bruno 集合从“桌面手工测试”平滑升级为“终端批跑 CI 报告”的自动化测试体系本地用--env快速切换环境CI 用--output/reporter 产出 JUnit 报告失败时依据退出码让流水线精确告警。【免费下载链接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/bruno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考