系列04-接口自动化:测试计划 vs Postman Collection,步骤传参与定时回归怎么选
个人联调接口,Postman 几乎人手一个:点几下就能发请求、看响应,Collection 还能分享给同事。
但当接口涨到几十上百条、要做** nightly 回归**、还要在测试/预发环境切换时,很多人会发现:Collection 里越堆越多 Tests 脚本,维护成本开始指数上升。
本文不谈「Postman 已死」,而是讲清楚:什么阶段继续用 Postman 足够,什么阶段需要测试计划引擎 ;并用一条常见的 登录 → 下单 → 查单 链路,对比两种做法的差异。
一、Postman 最擅长什么
| 场景 | Postman 表现 |
|---|---|
| 单接口调试 | ⭐⭐⭐ 强 |
| 探索性联调 | ⭐⭐⭐ 改参数即时看结果 |
| 小团队共享 Collection | ⭐⭐ 导出/导入 JSON |
| 文档生成 | ⭐⭐ Swagger 导入 |
结论:探索、联调、PoC 阶段,Postman 仍是首选,没必要为了「自动化」而自动化。
二、团队规模化后的 5 个典型痛点
当 Collection 从 10 条涨到 100 条,常见问题如下:
2.1 步骤间传参靠 Tests 脚本
登录接口返回 token,后续接口 Header 要带 Authorization。在 Postman 里通常写:
javascript
// Tests 脚本
var json = pm.response.json();
pm.environment.set("token", json.data.token);
下一个请求 Pre-request Script 或 Header 引用 {``{token}}。
问题:
- 脚本分散在每个请求的 Tests 里,读 Collection 像读代码库
- 新人改一条链路要懂 JavaScript
- 复制 Collection 时容易漏改环境变量名
2.2 环境与权限
- 测试 / 预发 / 生产 base_url 靠 Environment 切换,但用例和数据仍在个人 Collection
- 谁改了 Collection、改了什么,缺少审计
- 离职交接 = 导出 JSON + 口头说明
2.3 报告与历史
- 跑完一轮回归,结果在 Runner 输出或 Newman 报告文件里
- 很难按「计划维度」查上周三的通过率
- 失败时翻日志,缺少结构化的请求/断言明细
2.4 定时与 CI
- 常见路径:
Newman+ Jenkins/GitLab CI + 命令行参数 - 要维护 CLI 脚本、环境文件、报告上传,测试同学往往依赖开发配流水线
2.5 多人协作
- Collection 合并冲突(JSON diff 痛苦)
- 接口定义与「测试用例覆盖」耦在同一条请求上,接口变更时影响面大
三、测试计划引擎解决什么
「测试计划引擎」在这里指一类平台能力(MeterSphere、各类自建平台、以及下文提到的 BrickCore 等),核心不是 UI 好看,而是这几件事:
接口定义(元数据)
↓
测试用例(覆盖参数 + 断言 + 提取规则)
↓
测试套件(顺序/并行、失败即停)
↓
测试计划(定时 cron、跨套件、计划级报告)
| 能力 | 说明 |
|---|---|
| 配置化 extractors | 用 JSON 声明「从响应 $.data.token 提取 token」,不必写 Tests 脚本 |
| 变量池 | 套件顺序执行时,前序提取自动 merge 给后序用例 |
| 环境切换 | 项目/环境表维护 base_url、global_vars,用例不写死 Host |
| Token 授权 | 登录刷新 token 单独模块配置,多环境复用 |
| 报告落库 | 计划 / 套件 / 用例三级记录,失败可展开断言 expected/actual |
| 内置定时 | cron 表达式 nightly 回归,不必先搭 Newman |
四、10 维度对比表
| 维度 | Postman Collection | 测试计划引擎 |
|---|---|---|
| 单接口调试 | ✅ 极强 | ✅ 支持,略重 |
| 步骤间传参 | Tests/Pre-request 脚本 | extractors + 变量池 |
| 断言 | Tests 脚本或手动看 | JSON 配置 status_code/json_path |
| 环境管理 | Environment | 环境表 + 项目变量 |
| 定时回归 | Newman + CI | 内置 cron |
| 报告 | CLI/HTML 文件 | 库表 + Web 报告 |
| 权限 | Workspace 级别 | 项目 RBAC |
| 协作 | 导出 JSON / 团队版 | Web 集中维护 |
| 学习成本 | 低(联调) | 中(要理解分层) |
| 适合规模 | 个人 / 小团队 | 多项目 / 多人 / 长期回归 |
五、实战:登录 → 下单 → 查单
同一条业务链路,两种写法对比如下。
5.1 Postman 思路
请求 1:登录
-
Tests:
javascriptpm.environment.set("token", pm.response.json().data.token);
请求 2:创建订单
-
Header:
Authorization: Bearer {``{token}} -
Tests:
javascriptpm.environment.set("order_id", pm.response.json().data.id);
请求 3:查询订单
- URL:
/api/orders/{``{order_id}} - Header:
Bearer {``{token}} - Tests:断言
pm.response.json().data.id === pm.environment.get("order_id")
Collection Runner 按文件夹顺序跑三条。
5.2 测试计划思路(配置化)
用例 1:登录
json
{
"assertions": [
{"type": "status_code", "operator": "equals", "expected": 200}
],
"extractors": [
{"name": "token", "source": "json", "path": "$.data.token"}
]
}
用例 2:创建订单
json
{
"request_headers": [
{"key": "Authorization", "value": "Bearer ${{token}}"}
],
"extractors": [
{"name": "order_id", "source": "json", "path": "$.data.id"}
]
}
用例 3:查询订单
- path:
/api/orders/${``{order_id}} - Header:
Bearer ${``{token}} - 断言:
$.data.idequals${``{order_id}}
三条加入同一套件 ,套件挂测试计划;顺序执行时平台自动:
text
用例1 extracted_vars → merge 进变量池 → 用例2/3 替换 ${{token}}、${{order_id}}
测试同学改断言只需改 JSON 表格,不必碰 JavaScript。
5.3 源码视角:变量池与 extractors 如何落地
Postman 的 pm.environment.set 对应平台两层代码:套件级变量池 + 单用例 extract。
(1)套件顺序执行:前序 extract 并入变量池
BrickCore CE 源码 backend/app/core/api_suite_runner.py 中,串行跑套件时每条用例执行完都会 update 变量池:
python
# api_suite_runner.py --- _run_suite_cases_serial
for case_id in case_ids:
result = await runner(case_id, env.id, record_id, username, accumulated_vars, ...)
case_results.append(result)
accumulated_vars.update(result.extracted_vars or {}) # 链式传递
若套件开启 parallel ,则各用例共享 setup 后的快照、彼此不传 extract------注释写得很清楚,避免并发写同一变量名:
python
# api_suite_runner.py --- _run_suite_cases_parallel
"""并行执行:用例共享 setup 后变量快照,彼此不传递提取变量。"""
vars_snapshot = ensure_dt_cache(copy.copy(base_vars))
(2)单用例:变量合并优先级 + Token 注入
run_single_case(backend/app/routers/http/suites.py)在发 httpx 前合并变量,优先级为 项目全局 < 环境全局 < 套件传入 < Token 授权:
python
all_variables = {**proj_vars, **env_vars, **(variables or {})}
auth_vars, auth_err = await inject_auth_variables(case.project_id, env_id, all_variables)
if auth_vars:
all_variables.update(auth_vars)
等价于 Postman 里「Environment + Collection Pre-request + 登录 Tests 写 token」的组合,但拆成可复用的 授权配置模块 (api_auth_service.py)。
(3)extractors 与 assertions 的执行
响应返回后,extract_variables 按 JSON 配置从 body/header 取值;断言走 evaluate_assertion,支持 status_code / json_path / header 等类型------与 Postman Tests 里手写 pm.response.to.have.status(200) 同义,只是换成 JSON:
python
# routers/http/utils.py --- evaluate_assertion(节选)
if assertion_type == "status_code":
actual = response.status_code
elif assertion_type == "json_path":
actual = get_json_path_value(response_body, target)
# operator == "equals" → assert_values_equal(actual, expected)
读代码建议 :对照第五节 JSON 配置,在 Gitee 打开 api_suite_runner.py → suites.py 的 run_single_case → utils.py 的 evaluate_assertion,一条链路就能串起来。
六、Newman + CI vs 平台内置定时
Postman 常见 CI 形态
bash
newman run collection.json -e test.postman_environment.json \
--reporters cli,html --reporter-html-export report.html
| 优点 | 缺点 |
|---|---|
| 与 Git 流水线天然集成 | 要维护 collection 文件、环境文件、Newman 版本 |
| 开发者熟悉 | 报告分散在 CI 产物里,测试负责人要进 Jenkins 下载 |
平台内置 cron
- Web 上配
0 2 * * *每天凌晨跑「登录+订单」计划 - 失败邮件/钉钉/企微推送
- 报告和趋势在平台看板
| 优点 | 缺点 |
|---|---|
| 测试自主配定时,少依赖 CI 脚本 | 与 Git 联动需额外 Webhook(部分平台支持) |
| 历史计划执行可查询 | 需要部署平台 |
实践建议:
- CI 门禁(合并前冒烟)→ Newman 或平台 API 触发都可以
- 夜间全量回归→ 平台 cron 更省心
七、什么时候继续 Postman,什么时候上平台
| 继续 Postman | 考虑测试计划平台 |
|---|---|
| 接口 < 30,1~2 人维护 | 接口多、多人改同一套回归 |
| 偶尔手工跑 Collection | 需要 nightly / 定时 |
| 不需要历史报告趋势 | 需要计划级通过率、失败明细落库 |
| 已有成熟 Newman CI 且够用 | Tests 脚本已经「改不动」 |
| 只做联调不做回归资产 | 要把 Swagger 导入当长期资产 |
不是二选一 :很多团队 Postman 联调 + 平台跑回归 并存。
八、选型决策树(简版)
text
是否需要多人维护同一套回归用例?
├─ 否 → Postman 足够
└─ 是 → 是否需要定时 + 历史报告?
├─ 否 → 可继续 Newman + CI
└─ 是 → 测试计划平台 ROI 更高
├─ 要 SaaS → 商业产品
└─ 要自建 → Docker 开源方案
九、小结
- Postman 强在联调与探索,弱在规模化协作与报告沉淀。
- 测试计划引擎 强在分层模型、配置化传参、定时与落库报告。
- 步骤传参:Collection 靠 Tests 脚本 ,平台靠 extractors + 变量池。
- 定时回归:Newman 适合 CI 集成,平台 cron 适合测试自主运维。
- 成熟团队常见模式:Postman 联调,平台跑回归。
附录 A:关键源码走读(测试计划 vs Postman)
以下路径均来自 BrickCore 开源仓库(
backend/app/),读源码可对照 Gitee CE 克隆。
A.1 变量池:套件顺序执行如何传参
Postman 用 pm.environment.set;平台在 api_suite_runner.py 里用 accumulated_vars 字典逐条 merge:
python
# backend/app/core/api_suite_runner.py --- _run_suite_cases_serial
for case_id in case_ids:
result = await runner(case_id, env.id, record_id, username, accumulated_vars, ...)
case_results.append(result)
accumulated_vars.update(result.extracted_vars or {}) # 前序 extract 并入变量池
单用例执行完会把 extractors 提取结果放进 result.extracted_vars;下一用例请求里的 ${``{token}} 在发送前由变量替换层解析。
设计点 :顺序套件 = 链式变量池 ;若套件配置为并行,则各用例共享 setup 后快照、彼此不传 extract (见同文件 _run_suite_cases_parallel 注释),避免并发写同一变量名。
A.2 extractors 配置如何落库
用例 JSON 里 extractors 字段与 Postman Tests 脚本等价,结构示例:
json
{"name": "token", "source": "json", "path": "$.data.token"}
AI 生成接口用例时,后端 generate.py 的 _normalize_extractors 会校验 name/source/path,避免脏数据入库。
A.3 断言引擎:JSON 配置如何变成 pass/fail
Postman Tests 里 pm.expect(...) 对应 routers/http/utils.py 的 evaluate_assertion:
python
def evaluate_assertion(response, response_body, assertion):
assertion_type = assertion.get("type") # status_code | json_path | header | contains
if assertion_type == "status_code":
actual = response.status_code
elif assertion_type == "json_path":
actual = get_json_path_value(response_body, target)
if operator == "equals":
return assert_values_equal(actual, expected), actual
报告落库时 expected / actual 会写入 api_case_run_record,Web 上可展开------比 Newman HTML 文件更易按「计划维度」检索。
A.4 Token 授权:比手写 Header 多一层
api_auth_service.py 在计划执行前 inject_auth_variables:按环境绑定的授权配置调登录接口 → extract_variables → 把 token 注入变量池,用例里不必每条写 Bearer。
对比 Postman:相当于把「集合级 Pre-request + Tests」抽成 可复用的授权模块 ,切换环境只换 environment_id。
A.5 计划执行入口
定时任务 / 手动执行最终落到 routers/http/exec.py :创建 ApiPlanRunRecord → 按套件顺序调 execute_api_suite_cases → 报告写入 api_suite_run_record / api_case_run_record 表。
读代码顺序建议 :routers/http/exec.py(计划触发)→ api_suite_runner.py(变量池 + hooks)→ routers/http/suites.py 的 run_single_case(httpx + extract + 断言落库)。
关于 BrickCore(开源参考实现)
若你想体验「测试计划 + extractors + cron」的完整链路,可以用开源平台 BrickCore(FastAPI + Vue3):
| 项 | 链接 |
|---|---|
| 源码 | https://gitee.com/BanZhuanKeOrz/BrickCore |
| 在线体验 | http://43.142.83.156/ (admin / BrickCore123456) |
| 接口模块文档 | http://43.142.83.156/showcase/docs/ |
社区版含接口 httpx 执行引擎源码,支持 Swagger 导入、套件/计划、Token 授权与定时任务。
支持与交流
- 觉得有用欢迎 Star ⭐
- 问题反馈:Gitee Issues 或评论区留言