Files
PlantAI-rag-new/docs/TEST_PLAN.md
T
jerryandClaude Fable 5 1e94de7464 PlantAI-rag-new 首次提交:文献知识工作台
- BFF 薄适配层(FastAPI,8090):QA 代理/SSE 中继/Neo4j 直连/抽取代理/会话持久化
- Vue3 前端:五相位检索流水线、文献来源与证据链、知识图谱、提取任务四 tab
- 四档响应式(桌面/笔记本/平板/手机)、深浅主题
- 81 个 FR 全部实现,测试追溯矩阵 81/81,后端 121 测/前端 156 测
- 真实凭据已脱敏,运行时配置在 backend/.env(不入 git)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 20:47:52 +08:00

96 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TEST_PLAN.md —— 测试策略与轮次纪律
> 版本 1.0 | 作者 PM | 本文件由 PM 独占写入,所有开发/测试 agent **只读**
>
> 本文件定义「怎么测」。测什么以 `PRD.md` 为准,用例在 `TEST_CASES.md`(T 编写)。
---
## 1. 测试分层
| 层 | 工具 | 归属 | 覆盖对象 | 运行方式 |
|---|---|---|---|---|
| L1 后端单元 | pytest | A1/A2/A3 自测 | normalize 别名收敛、SSE 帧解析、阶段→相位映射、SQLite CRUD、错误信封 | `cd backend && pytest tests -m unit` |
| L2 后端接口 | pytest + respx(mock 上游) | T 主写,A 组配合 | 每个 BFF 接口的正常/降级/超时/重试路径 | `pytest tests -m api` |
| L2s 上游 smoke | 脚本 | T | 对真实 7920/8000/Neo4j 的最小连通验证(**不在 CI 每轮跑**,仅集成点与验收前跑一次) | `bash tests/smoke_upstreams.sh` |
| L3 前端单元 | Vitest | B 组自测 + T 补写 | stores、SSE parser、labels 映射、modes 参数集、工具函数 | `cd frontend && npx vitest run` |
| L4 前端组件 | Vitest + @vue/test-utils | B 组自测 + T 补写 | 每个组件的全部状态(默认/悬停/激活/禁用/加载/空/错误) | 同上 |
| L5 端到端 | Playwright | T | 完整流程 × 三档视口 | `npx playwright test` |
| L6 验收 | 人工 + 浏览器 | PM | 真实上游 + 视觉走查 | 见验收脚本 |
## 2. 覆盖率定义(100% 的可验证判定)
1. **需求追溯(主门禁)**:`PRD.md` 的 81 个 `FR-*`(FR-RESP-013 除外,为可选项)中,**每一个**在 `TEST_CASES.md` 追溯矩阵中至少映射一条 `TC-*`;同时**无孤儿 TC**(每条用例必须追溯到至少一个 FR)。双向映射完整性 = 100%。
2. **行覆盖(辅门禁)**:后端 pytest ≥85%,前端 Vitest ≥80%。未达标不能宣称 100%,但行覆盖达标**不替代**需求覆盖。
测试 agent 每轮报告首页必须给出:FR 总数 / 已覆盖 / 未覆盖清单(若不为空)。
## 3. 测试环境
| 项 | 值 |
|---|---|
| L1/L2 运行处 | 远端 `plantai-bff` conda 环境(pytest) |
| L3/L4 运行处 | 远端 `frontend/`(Vitest,Node 18) |
| L5 运行处 | 远端(Playwright chromium,headed 不强制),**或** Mac 本地通过 SSH 隧道打到远端 |
| L5 视口 | iPhone 14 390×844 | iPad 768×1024 | Desktop 1440×900 |
| mock 服务 | `python backend/mock/mock_server.py`,端口 8099,scenario 参数切场景 |
| 真实上游 | 7920 / 8000 / 7900 / Neo4j(按 DISCOVERY.md 选型) |
## 4. 缺陷分级
| 级别 | 定义 | 处置 |
|---|---|---|
| 阻断 Blocker | 主流程无法走通、数据损坏、崩溃 | 修复前不得进入下一轮 |
| 严重 Major | 功能错误、契约不符、数据错误 | 本轮必须修复 |
| 一般 Minor | 视觉瑕疵、次要交互问题 | 本轮修复,可批量 |
| 轻微 Trivial | 文案、间距等不影响理解 | 累积到 M6 收尾处理 |
缺陷编号:`BUG-R{n}-{序号}`,报告含复现步骤、预期/实际、截图或日志证据、对应 TC 编号。
## 5. 轮次纪律(用户明确要求,铁律)
1. 测试 agent **完整跑完一整轮全部用例**(L1+L2+L3+L4+L5 全量),**中途不修改任何代码**。
2. 产出 `docs/TEST_REPORT_R{n}.md`:首页统计(TC 总数 / pass / fail / 未跑 + FR 覆盖统计 + 行覆盖率)、缺陷清单(分级)、证据。
3. PM 汇总缺陷,**批量派发**给归属 agent 修复;开发 agent 只修自己文件归属内的缺陷。
4. 修复完成后进入下一轮:**再次完整跑完全部用例**(全量回归,不做增量)。
5. 循环直至:所有 TC pass + 主门禁 100% + 辅门禁达标。
6. 移交 PM 做 L6 验收。验收发现问题按第 4 级(轻微)回流或直接修复,由 PM 判定。
## 6. L5 端到端场景(必测主线)
对三档视口分别执行(各视口用例独立编号):
1. **E2E-主流程**:新建会话 → 问答模式提问 → 流水线五相位推进 → 答案揭示(含表格)→ 来源 tab 有数据 → 图谱 tab 渲染 → 刷新后历史恢复
2. **E2E-检索模式**:检索模式提问 → 只出来源不出答案块
3. **E2E-错误与重试**:mock `scenario=error` 下提问 → 错误展示 + 重试按钮可用;`scenario=degraded` 下作曲器禁用
4. **E2E-会话管理**:新建/切换/重命名/删除/搜索过滤/分组
5. **E2E-中断**:流式中途切会话 → 原会话置 error 标注已中断
6. **E2E-主题**:深浅切换 + 刷新持久化
7. **E2E-图谱**:实体搜索 → 邻域展开 → 节点详情 → 缩放平移(移动端双指)
8. **E2E-抽取**:任务列表 → 详情展开 → 运行日志;mock 下上传 PDF
9. **E2E-响应式专项**:三档视口各自布局断言(见 PRD FR-RESP-001~004)+ 移动端专项(安全区、16px 输入、44px 触控、表格横滚、键盘适配)
## 7. 运行命令约定
```bash
# 后端(远端,plantai-bff 环境)
cd backend && pytest tests -m unit -q # L1
cd backend && pytest tests -m api -q # L2(respx mock)
bash tests/smoke_upstreams.sh # L2s 真实连通(手动触发)
# 前端(远端)
cd frontend && npx vitest run # L3+L4
cd frontend && npx playwright test # L5(三档视口配置在 playwright.config.js)
# mock(开发与 L5 的 error/degraded 场景)
python backend/mock/mock_server.py # 127.0.0.1:8099
```
## 8. 报告模板(TEST_REPORT_R{n}.md 必须包含)
1. 轮次信息:日期、被测版本、运行环境
2. 首页统计表:TC 总数/pass/fail/skip、FR 覆盖 80/80 或缺口清单、行覆盖率(后端/前端)
3. 缺陷清单表:编号 | 级别 | TC | 归属 agent | 现象 | 预期 | 证据路径
4. 上轮缺陷修复确认表:BUG 编号 | 是否修复 | 本轮对应 TC 结果
5. 遗留问题与风险