系列04-接口自动化:测试计划 vs Postman Collection,步骤传参与定时回归怎么选

系列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:

    javascript 复制代码
    pm.environment.set("token", pm.response.json().data.token);

请求 2:创建订单

  • Header:Authorization: Bearer {``{token}}

  • Tests:

    javascript 复制代码
    pm.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.id equals ${``{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_casebackend/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.pysuites.pyrun_single_caseutils.pyevaluate_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 开源方案

九、小结

  1. Postman 强在联调与探索,弱在规模化协作与报告沉淀。
  2. 测试计划引擎 强在分层模型、配置化传参、定时与落库报告。
  3. 步骤传参:Collection 靠 Tests 脚本 ,平台靠 extractors + 变量池
  4. 定时回归:Newman 适合 CI 集成,平台 cron 适合测试自主运维。
  5. 成熟团队常见模式: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.pyevaluate_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.pyrun_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 或评论区留言