---
name: sdlc-test
description: "AI 测试智能体编排：用例生成 → 静态代码一致性检测 → test 环境浏览器功能测试 → 报告生成。四个子命令（cases/static/exec/report）独立可重跑，两道人工关卡（用例审核、报告复验）。Use when 用户要求 AI 测试、生成测试用例、执行测试、提测验证、回归测试，或说 ai-test、AI testing、test generation、browser E2E。用法：/sdlc-test cases|static|exec|report <需求名>"
---

# AI 测试智能体

方案全文见仓库 `docs/sdlc-test-design.md`（设计决策记录，非 references 一层引用）；该文件缺失时以本 SKILL.md 与 references/ 为准继续执行。测试对象是 test 环境的 Web 前端（Java DDD 后端 + MySQL）。

产物目录（相对当前项目根）：`sdlc/<需求名>/test/` 下放 `cases.md` 与 `reports/<日期>-r<N>/`；共享环境配置在 `sdlc/env/`。

## 路由

| 子命令 | 阶段 | 产物 | 前置条件 |
|---|---|---|---|
| `cases <需求名或文档路径>` | 1 用例生成 | `sdlc/<需求名>/test/cases.md` | 无 |
| `static <需求名>` | 2 静态代码检测 | `sdlc/<需求名>/test/reports/<日期>-r<N>/static.md` + 用例文件重点验证项 | 关卡1 已过 |
| `exec <需求名> [--from TC-xx \| --all]` | 3 前端功能测试 | 同轮目录 `exec-log.md` + 用例回填/缺陷跟踪 + 截图 | 关卡1 已过 |
| `report <需求名>` | 4 报告生成 | 同轮目录 `report.md` | 阶段3 有结果 |

未带子命令时询问用户执行哪个阶段；无 `sdlc/<需求名>/test/cases.md` 时引导从 `cases` 开始。

## 轮次（round）规则

- **轮次目录**：`sdlc/<需求名>/test/reports/<日期>-r<N>/`，同轮 static / exec-log / report / screenshots 聚合一处。N = 该需求已有最大轮次 +1，不存在时从 r1 起。**大小写约定**：轮次目录名用小写 `r<N>`，用例结果/缺陷状态/修复轮次用大写 `R<N>`
- **轮次含义**：一次「检测→执行→报告」周期为一轮。需求和用例稳定的前提下，多轮 bug 修复 → 多轮回归，每轮独立留档，内容随缺陷收敛递减
- **回归轮（r2+）默认范围**：
  - static：只复检上轮 ⚠️ 疑似偏差与 ❓ 未确认项（代码已变），增量留档；`--all` 全量重比
  - exec：只重跑上轮失败/疑似/阻塞用例 + 缺陷跟踪表未闭环项（状态≠已修复验证）关联用例；`--all` 全量重跑
- **用例文件是当前状态快照**：「结果」列只反映最新轮次，格式 `通过（R2）`；历史判定在各轮 exec-log 留档
- **缺陷生命周期只在用例文件「缺陷跟踪」表维护**：新失败登记 BUG-xx，回归通过后更新状态/修复轮次；各轮 report 的缺陷清单摘引该表当轮切片

**关卡强制**：执行 `static`/`exec` 前读用例文件头部，`审核状态 ≠ 已确认` 时拒绝并提示用户先完成关卡1（人工审核用例后，将头部状态改为 `已确认（日期）`，或让用户口头确认后代改）。若 `sdlc/<需求名>/review/` 存在，关卡1 以 sdlc-gate 状态为准：`评审状态 = 已放行` 视同关卡1 通过（代改时引用 issues 文件），`≠ 已放行` 时拒绝并提示先完成 sdlc-gate 裁决；review 目录不存在则维持本条原行为。

## 阶段1 cases：用例生成

```text
Cases 进度：
- [ ] 定位输入（sdlc/<需求名>/intake/ 三件套优先，退回原始 PRD）
- [ ] 信息摄入（梳理文档/YApi/CodeGraph/MySQL 只读）
- [ ] 按六种设计技术生成用例并标注技术
- [ ] 填双向追踪表，未覆盖条目显式列出
- [ ] 写 sdlc/<需求名>/test/cases.md（模板：references/case-template.md）
- [ ] 🔒 关卡1：暂停等人审核
```

- 输入优先级：`sdlc/<需求名>/intake/digest-*.md` 三件套 > 原始需求文档。梳理文档的角色权限矩阵、状态机图、流程图、规则口径清单是设计直接输入；体检报告疑似问题转重点用例；PM 清单已澄清口径回填预期
- **独立性纪律（红线）**：生成过程禁止读技术设计文档（`sdlc/<需求名>/design.md`、任务系统/协作工具中的设计文档等）——用例必须与设计从 intake 三件套独立推导，sdlc-gate 交叉审查才有价值。用户坚持要读时先说明后果并征得明确确认，且在 cases.md 头部注明「已读设计，交叉独立性破坏」
- 设计技术清单与生成规则见 `references/design-techniques.md`，必须先读
- 关卡1 措辞：「用例已生成于 <路径>，请审核；确认后我继续，需修改请直接说」。迭代直至用户确认，然后把头部 `审核状态` 改为 `已确认（日期）`

## 阶段2 static：静态代码检测（前后端）

1. 读 `sdlc/env/repos.local.md` 获取前后端仓库路径（缺失则按 `references/env-template.md` 引导创建）；后端默认当前项目
2. 按梳理文档 §7「关键规则与口径」的 需求.FR-xx 编号逐条提取业务规则（三件套缺失时回退原始 PRD 的规则/口径章节，并在 static.md 注明证据降级），并标注检测端：后端（接口校验/权限/状态流转/排序 SQL）或前端（按钮显隐/页面校验/提示文案/页签隐藏）
3. 后端：用 `codegraph:codegraph_context`/`codegraph:codegraph_explore` 定位每条规则的 Controller → Service → Mapper/XML 链路；`mysql:mysql_query` 核对表结构。前端：`codegraph:codegraph_search`/`codegraph:codegraph_context` 传 `projectPath` 指向前端仓库索引定位页面/组件；无索引则降级定向 grep + 读文件，结果注明证据降级
4. 按 `references/static-check-template.md` 产出三态结论留档至本轮目录 `static.md`：✅符合 / ⚠️疑似偏差（附代码位置，前后端位置分别标注仓库）/ ❓静态无法确认
5. ⚠️ 项写入用例文件「重点验证项」区块，阶段3 优先执行；重大偏差立即报告用户

## 阶段3 exec：前端功能测试

> 执行≠验证：跑通创建流程≠验证了业务规则；页面表现正常≠无缺陷（接口/落库/console 必查）；用例预期与实现冲突时**禁止静默按实现校正**。首次执行参考 `references/exec-example.md` 完整范例

```text
Exec 进度：
- [ ] 读 sdlc/env/test.md 与 accounts.local.md（缺失则按 references/env-template.md 引导创建）
- [ ] 前置健康检查：chrome-devtools:list_pages 确认浏览器/页面存活、目标路由可达、MySQL 连通（SELECT 1）、上传目录就绪；读 sdlc/env/ui-recipe.md（无则首条用例侦察后按 env-template 沉淀）
- [ ] 读用例头部进度，确定本轮目录与用例范围（--from TC-xx 断点续跑；回归轮默认重跑上轮失败/疑似/阻塞+缺陷未闭环项；--all 全量）
- [ ] 逐用例：操作 → 等待稳定 → 四类证据采集 → 判定 → 立即回填（用例结果列 + 本轮 exec-log.md 双写）
- [ ] 失败用例登记/更新用例文件「缺陷跟踪」表
- [ ] 全部完成，更新用例头部阶段进度
```

- 登录：test 环境账号密码直登（账号在 `sdlc/env/accounts.local.md`，gitignored）
- **交互姿势**：浏览器/数据库操作按 `references/exec-interaction.md` 执行（浮层失明降级、日期键盘路径、evaluate 同步返回等）；新控件姿势 ≤3 次试错后回写该手册
- **分组合并执行**：同 G-xx 组（见用例文件「执行分组」区块）拦截类用例在同一表单会话内连续验证（改字段→断言→复原），每条用例仍独立留档判定；涉及提交/落库的用例不合并
- **落库断言前置**：表结构/列名以本轮 static.md 为准；bigint 主键按 exec-interaction 规范用业务键定位（JSON 往返舍入）
- **等待稳定再取证**：操作后先等页面稳定（`chrome-devtools:wait_for` 目标文本/元素出现，或确认对应网络请求已完成）再采集证据——防抢跑拿到 loading 骨架误判"功能缺失"；等待超时本身是证据，写入备注
- 判定证据（缺一存疑就标"疑似"）：页面表现 + `chrome-devtools:list_network_requests`/`get_network_request` 接口响应 + `mysql:mysql_query` 落库核验 + `chrome-devtools:list_console_messages` console 异常（补充；**error 级必查**——与失败相关的 error 作初判依据，无法解释的 error 标"疑似"不判通过；warning 记档不阻断）
- **通过前视觉复核**：判"通过"前扫一眼全页截图——视觉异常（布局错乱/弹窗遮挡/错误提示/列表空白）即使接口与落库正确，也降为"疑似"并备注
- **口径冲突三去向**：用例预期模型与实现不符（如时间链模型、快照口径）时，先以需求/拍板口径判定——实现偏离=登记 BUG-xx；需求未定=转 Q 待用户裁决；用例写错=修用例并在 exec-log 留档；仅确认实现正确后才按实际口径校正预期
- 截图：`chrome-devtools:take_screenshot` 落本轮目录 `screenshots/`
- **留档**：按 `references/exec-log-template.md` 逐用例写 `exec-log.md`（判定+证据引用+备注），当日志而非汇总写——每用例一段，执行完立即追加；备注除偏差外，执行中任何让你停顿的观察（文案/交互/性能/意外行为）都记录，不预筛"是不是缺陷"
- **缺陷跟踪**：新失败在用例文件「缺陷跟踪」表登记 BUG-xx（缺陷四要素详见 report-template）；回归轮重跑通过后更新「状态=已修复、修复轮次=R<N>」；不复现在备注说明
- **P0 缺陷快报**：发现口径违背/数据污染风险级缺陷立即报告用户裁决，不等整批执行完
- **造数纪律：允许通过前端页面操作（点击触发后端接口）生成前置数据，禁止改库**；MySQL MCP 只读仅做核验
- a11y 快照对 canvas/复杂自定义组件失明时，降级截图 + 视觉判断，结果注明证据降级
- chrome-devtools MCP 失效时降级 Playwright skill
- **阻塞前穷尽解锁**：标阻塞前先依次确认 ui-recipe 路由清单、Playwright skill 降级、接口直调（鉴权头见 ui-recipe）三条路径均不可行

## 阶段4 report：报告生成

1. 按 `references/report-template.md` 汇总产出本轮目录 `report.md`（回归轮为回归报告：重跑范围+缺陷闭环情况）
2. 🔒 关卡2 措辞：「报告已生成于 <路径>，请复验缺陷真伪；确认后的缺陷由你转达开发」。缺陷不自动推送任何外部系统。用户复验确认后，勾选用例头部「🔒 关卡2 报告复验」并注明轮次（如 `已复验（R2，YYYY-MM-DD）`）——与关卡1 代改口径对称，多轮场景可从用例文件看出各轮报告复验状态

## 通用纪律

- 源码只读、数据库只读；写操作仅限 test 环境前端页面与 `sdlc/` 目录
- 拿不准的判定标"疑似"并附证据，不硬下结论
- **汇报自解释**：向用户输出阶段小结/汇报时，统计须含端分布（前端/后端/前后端）；每条问题明细自解释（编号+现象+预期差异），禁缩写引用；「详 exec-log」等深挖入口只能附在完整陈述之后
- 每阶段结束更新用例文件头部阶段进度 checklist
- 术语统一：用例 ID 记作 TC-xx；角色名、状态名沿用梳理文档口径；**跨产物引用统一 `命名空间.编号`**（需求.FR-03 / 需求.A3 / 体检.P04 / 设计.D11 / 评审.T-12），禁止裸写他产物编号

### 反合理化

| 借口 | 现实 |
|---|---|
| "console 有 error 但页面表现正常，算通过" | error 是缺陷线索，必查；无法解释就标"疑似"，不判通过 |
| "四类证据差一类，其余都对，直接下结论" | 缺一即标"疑似"，证据底线不因多数通过而放松 |
| "直接改库造数更快" | 造数走前端页面操作（点击触发后端接口），改库绕过业务校验且污染回归基线 |
| "DOM 快照失明/截图看不清，就当通过" | 降级视觉判断必须注明"证据降级"，不允许静默放行 |
| "chrome-devtools 坏了，这条用例跳过" | 降级 Playwright skill 继续执行，工具故障不是跳过理由 |
| "点击后立即检查，页面还在 loading，功能就是坏的" | 先等稳定（wait_for / 网络请求完成）再判定；抢跑误判是执行事故，不是缺陷 |
| "控件姿势试错几轮是正常成本" | 按交互姿势手册执行；新姿势 3 次试错内沉淀回写手册，下个项目/会话不重付学费 |
