UI 流量 → 接口自动化测试
把「人工点一遍功能界面」变成「可重复执行的接口测试」:抓真实流量 → 按功能切片 → 自动推导接口依赖 → 生成 pytest 用例。
核心原理
UI 测试最大的副产品不是多跑了几个页面,而是真实接口流量。 它给 AI 生成用例提供「事实锚点」,砍掉接口自动化最耗时的三件事:
| 卡点 | 只能靠猜 | UI 抓包直接给出 |
|---|---|---|
| 接口契约 | 参数字段靠编 | 真实 URL / query / body |
| 鉴权态 | 验证码、SSO、前端签名无解 | 复用浏览器 cookie + 真实签名字段 |
| 参数组合与时序 | 不知道先调谁 | 抓包天然带调用顺序 |
分工:脚本干机械活(去噪 / 去重 / 结构骨架 / 依赖匹配),大模型干推理活(异常 / 边界 / 越权 / 期望值),人干确认活(把 AI 断言拿去实测校准)。
Prerequisites
- Python 3.9+,且已装
playwright、requests、pytest、pyyaml - 依赖 skill
api-autotest-kit(提供工程脚手架init_api_autotest.py与common/assertions.py) - 可选 skill
browser-360-cdp(内网/需登录站点走--engine 360复用已登录会话) - 工作目录:先 cd 到你的工作目录再执行,所有产出落在
./out/,不写 skill 安装目录
Example Prompts
抓一下"下单支付"这个功能的接口流量,转成接口自动化测试把采购申请的界面操作,变成对应的接口测试用例UI 自动化只能覆盖 happy path,帮我把这些功能的接口层测试补上内网系统要登录,用 360 复用我的登录态去抓包生成接口用例
Workflow
-
确认目标与前置
- 明确要转的「功能」是什么(一个功能 = 一串接口调用,不是单个接口)
- 确认目标站点、入口 URL、是否需要登录态(内网/SSO →--engine 360)
- 跑check自检环境 -
写 UI 步骤文件(
steps.json)
- 每个步骤的name就是「功能切片标签」,会写进映射报告和用例注释
- 选择器优先data-testid/ 稳定 class / 语义 role,避免 nth-child
- 详见 references/steps-schema.md -
采集流量(
netcapture.py record,或import-har导入现成抓包文件)
- 只收 xhr/fetch;敏感 header/字段落盘前自动打码;cookie 值一律不落盘
- 新标签页(target=_blank)会被自动接管;单步失败不中断整次采集
- 没有 Playwright 环境? 用 Chrome DevTools(勾选 Preserve log → 右键 → Save all as HAR with content)、Charles 或 Fiddler 导出 HAR,import-har转成同一格式进入后续链路(对标 httprunner 的 har2case 入口,额外做脱敏与动态值标注) -
生成用例(二选一,可都做)
- 功能视角(推荐):scenario.py→ 一个 UI 功能 = 一个场景用例,含跨接口依赖串联
- 单接口视角:extract_cases.py→ 每接口一条连通性/结构用例 -
AI 补业务断言
- 把out/llm_prompt.md交给大模型 → 产出llm_cases.json(JSON 契约见 references/steps-schema.md)
-apply_llm_cases.py回填成可执行用例 -
校准与回归
- AI 断言必须实测校准:模型给的期望值可能与真实系统不符,这步不能省
- 依赖字段若推导错误,手工修正后重新生成
- 分层次跑(smoke / regression),接 CI
Commands
PY=<python> # 本机示例:D:/Python314/python.exe
S="{baseDir}/scripts"
# 0 自检
$PY $S/netcapture.py check
# 1 采一个功能的流量(steps 里每个 name 就是一个功能切片)
$PY $S/netcapture.py record "https://app.example.com/list" \
--scenario "首页列表_点开详情" \
--steps steps.json --out out/traffic.json --settle 5000
# 1b 归纳:去重后的接口清单 + 需要参数化的动态字段
$PY $S/netcapture.py summarize out/traffic.json
# 1c 替代路径:导入现成 HAR(DevTools/Charles/Fiddler 导出,需 with content)
$PY $S/netcapture.py import-har captured.har --scenario "下单支付" --out out/traffic.json
# 2a 功能视角(推荐):UI 功能 → 接口场景用例(自动串联跨接口依赖)
$PY $S/scenario.py out/traffic.json --only-host api.example.com \
--slug order_flow --project ./api-test
# 2b 单接口视角:每接口一条用例骨架
$PY $S/extract_cases.py out/traffic.json --project ./api-test --only-host api.example.com
# 3 回填大模型产出的业务断言
$PY $S/apply_llm_cases.py llm_cases.json --project ./api-test --force
# 4 回归
cd api-test && $PY -m pytest -q
$PY -m pytest -m smoke -q --junitxml=reports/junit.xml
内网/需登录站点,采集时加 --engine 360:手动登录一次 360 安全浏览器,后续采集复用它已登录的会话,签名与验证码问题一并解决。
工程目录不存在时,先用 api-autotest-kit 初始化:
$PY ~/.workbuddy/skills/api-autotest-kit/scripts/init_api_autotest.py ./api-test
关键约束
- 结构断言与业务断言分开。值写死必然随机挂:结构断言只校验 key 路径存在(
has_path),业务断言才校验值。 - 签名类参数不要写死。
a_bogus、msToken、X-Signature这类会过期,跑前重抓或用 UI 会话复用;脚本会在dynamic_fields里标注它们。 - 依赖推导带信心评分(0.95 名字一致 / 0.85 ID 形态 / 0.70 名字包含),低于阈值丢弃,避免把纯文本巧合当依赖。
- AI 断言要校准。实测中 AI 断言「非法枚举应返错误码」,真实响应却是 success —— 反而挖出服务端枚举入参未校验的真实缺陷。流程里「AI 断言 → 实测 → 人工定性」不可省略。
- 写接口用例必须收尾清理,否则脏数据会让第二天随机挂。
When Not to Use
- 纯前端渲染 / 视觉 / 交互正确性验证 → 仍应走 UI 自动化,本 skill 不替代它
- 纯后端接口(UI 上无调用路径)→ 直接用
api-autotest-kit按文档手写 - 已有完整接口文档、无需登录态与真实参数组合 → 直接写用例更快
- 压测 / 性能测试 → 用专门的压测工具
Definition of Done
check通过,目标环境的浏览器内核可启动out/traffic.json生成,summarize输出的接口数与预期功能范围一致(无埋点/监控噪音)out/scenario_<slug>.md生成:含 UI 步骤↔接口对照表、依赖表(含信心分)、请求四要素表- 生成的场景用例能跑通:
pytest testcases/test_scenario_<slug>.py -q通过 - 全量回归
pytest -q无 failed(AI 补的断言已全部实测校准) - 给用户的交付说明写明:哪些断言已校准、哪些依赖是低信心需人工复核、写接口的清理策略
Resources
- 分层方案、度量指标与落地节奏:references/workflow.md
- 依赖推导算法与调参:references/dependency-rules.md
- UI 步骤 JSON 与 LLM 用例 JSON 契约:references/steps-schema.md
- 实测踩坑与排查表:references/pitfalls.md
- 示例资产:
assets/steps.example.json、assets/llm_cases.sample.json