Просмотр исходного кода

docs(tdd): R103 测试负责人执行汇报 — 浏览器E2E 28/28、管理端116/116 零漂移;前端实测391/32(较R102采信基线+8绿);251 langgraph派发B-91复发未实测沿用R102 43/32/11

E2E Test Bot 3 дней назад
Родитель
Сommit
4cc66482b9
2 измененных файлов с 202 добавлено и 0 удалено
  1. 196 0
      docs/tdd/orchestration/report-test-2026-11-09-R103.md
  2. 6 0
      docs/tdd/test/blockers.md

+ 196 - 0
docs/tdd/orchestration/report-test-2026-11-09-R103.md

@@ -0,0 +1,196 @@
+# 测试负责人工作汇报(R103)
+
+> 汇报人:测试负责人(软件测试专家团 · 陆谨)|汇报周期:2026-11-09(第 103 轮)
+> 负责模块/单元:浠艾福 XAF(d:/cfc)· 全栈测试闭环(浏览器自动化 + langgraph + 回归)
+> 执行档:review(内网站点 + 251 派发已授权;未联网装依赖;静默无人值守)
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 本轮新增测试用例数 | 0 个 | 窗口内 SRS/场景零变更(`git log 24c86e177..HEAD` 仅 1 个 `[skip ci]` bump,对 `docs/10`/`specs/`/`API_REFERENCE.md`/`tests/test-cases/` 命中 0 提交),不新增 |
+| 本轮验证执行测试数 | **570 个** | cfc-frontend 426 + cfc-web 116 + 浏览器 E2E 28(admin5+frontend6+shop4+health13);langgraph 本轮未实测(见 5.2)|
+| 用例通过率 | **93.9%**(本轮实测口径)| 570 例中 535 通过(391+116+28)/ 32 失败 / 3 skip;langgraph 沿用 R102 权威 43/32/11 不计入本轮实测集 |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 分派任务数 | 2 个 | ① 251 节点 langgraph pytest(shell 通道,**失败**:opencode 连接中断 `fetch failed`×2)② 本机 admin/frontend/shop/health E2E 串行 |
+| 恢复智能体会话数 | 0 个 | — |
+| 当前在用会话数 | 1 个 | 251 opencode(ses_e40f8bd…/ses_e40f1c9…,均 failed)|
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| 251-langgraph | ses_e40f8bddeffehEMhzQ4moiy7sH / ses_e40f1c967ffeapp7DBNRhq8tFe | failed | langgraph pytest(shell 通道)| — | `/sc-data/cfc/cfc-langgraph` | 251:4096 鉴权 OK(Basic Auth 200)但 shell 轮询中途 `fetch failed`×2(B-91 复发,疑 B-90 LLM 挂起拖垮会话)|
+| 本机-admin | — | done | admin-live 5 | — | 干净 | `tests/node_modules/.bin/playwright` 1.61.1 |
+| 本机-frontend | — | done | frontend-live 6 | — | 干净 | 189/204 失联,本机单节点串行 |
+| 本机-shop | — | done | shop-sort 4 | — | 干净 | — |
+| 本机-health | — | done | health-contract 13 | — | 干净 | — |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| 新测试发现问题数 | 1 个 | **B-91 复发**:251 langgraph 派发(shell 通道)本轮两次均 `fetch failed`,未取得 pytest 结果 |
+| 已解决测试相关问题数 | 0 个 | — |
+| 待解决测试相关问题数 | 12 个 | B-65(P0 第 10 轮)、B-69(P1 第 10 轮)、B-90(P0 第 4 次复证)、B-82、B-84、B-87、B-89(第 5 轮)、B-92、B-93、B-95、B-96、B-91(本轮复发)|
+
+### 1.4 本轮 git 提交与推送证据
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| (待提交)| R103 汇报 + blockers(B-91 复发)| 报告 | 文档 | cfclub | 提交时填写 | — |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | — | CFC 发现/跟踪模式 |
+| RED | 3 族 | Guhe 契约 22 例 / dx-bridge / S-cfc-79(沿用 R102)|
+| YELLOW | 2 键 | `guhe.p3.lowSideAggregate` / `diet.recommendation.participantSelect`(沿用)|
+| GREEN | 5 | 状态机 5 键全 GREEN(沿用)|
+| DONE | +3 | 沿用 R102 复验(lowSideAggregate/versionSplit/V2Route)|
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(SRS)| 200 份 specs | 正常 | 窗口内**零新增**、零变更 |
+| 测试用例(test-cases)| 13 文件 / 806 条 TC | 正常 | 无用例更新义务 |
+| E2E 用例 | 28 例 | 正常 | 100% 通过(28/28)|
+| langgraph pytest | 43 例 | 异常 | 251 派发失败、本地 LLM 测试挂起 → **本轮未实测**,沿用 R102 |
+| 线上可用性 | /admin /frontend /api | 正常 | 302/302/200,无 502 窗口(B-93 未复发)|
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | langgraph analyze checkpointer(第 10 轮)| `test_analyze.py` 2 例 500(Checkpointer 缺 thread_id)| `analysis_graph.py:96 MemorySaver()` + `analyze.py:35 ainvoke` 无 config | 去 MemorySaver 或显式传 `thread_id` | P0 | 待评估 |
+| 2 | 251 LLM 凭据 + 调用超时(第 4 次复证)| live `chat`/`analyze` 挂起无响应;251 派发 shell 通道 `fetch failed` | 251 侧 LLM 凭据失效 + 调用无 timeout/熔断(B-84 同源)→ 会话被拖垮 | 注入有效 etotem/deepseek 凭据;所有 LLM/检索调用加 `timeout`+熔断 | P0 | 待评估 |
+| 3 | `/api/mind/**` 4 端点公开白名单(第 10 轮)| 4 端点匿名全 200 | `JwtInterceptor.java:79-82` PUBLIC_PATHS | 4 条移入 `LOGIN_REQUIRED_PATHS` → 匿名 401 | P1 | 待评估 |
+| 4 | 前端 diet.recommendation 32 例红(真实态)| 实测前端 391/32(32 红集中于 `diet/recommendation.uiRework` 等 REQ 未实现契约)| 实现分层推进中(S-cfc-79/97/116/128 派发中)| 派发剩余能力键使绿 | P1 | 待评估 |
+| 5 | 运维:189/204 节点放通 + 251 派发稳定 | 189(B-89 第5轮)、204(B-95)失联;251 派发本轮 `fetch failed`(B-91 复发)| 节点 opencode 端口拒连 / 251 LLM 挂起拖垮会话 | 放通 189:4090/22 + 204:4090;251 加 pytest 进程超时巡检 + 恢复 LLM 凭据 | P1 | 待评估 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| B-91(本轮复发)| langgraph 测试派发 251 | 环境/测试 | 251:4096 鉴权 OK 但 shell 通道两次 `fetch failed`,未取得 pytest 结果;本地 venv 受 chromadb(B-54)+LLM 缺凭据(B-90) 无法测 11 例 → 沿用 R102 43/32/11 | 运维注入 251 LLM 凭据 + 进程巡检(B-55/B-82 同源)|
+| B-65(第 10 轮)| AI 报告解析 | 研发 | 未修(源码未变,2 例 500 复现)| 研发实现 |
+| B-69(第 10 轮)| 鉴权边界 | 研发 | 本轮未复跑;R102 线上 4 端点匿名 200 证据仍有效 | 研发实现 |
+| B-89(第 5 轮)| admin 浏览器节点 | 运维 | 189 仍失联 → 本机降级 5/5 绿 | 运维恢复 |
+| B-95(第 102 轮)| frontend 浏览器节点 | 运维 | 204 失联 → 本机降级 6/6 绿 | 运维恢复 |
+| B-92 | D 盘 99% 满 | 环境 | 可用空间紧张,本地 langgraph 全量跑易超时 | 运维清理历史 worktree |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 251 pytest 复验(凭据/连接恢复后)| 下轮 | 运维注入 LLM 凭据 + 251 派发稳定 | 取回权威 43/32/11 或转绿 |
+| 前端 diet 32 红跟踪 | 下轮 | 研发派发 REQ 实现 | 前端通过率天花板 |
+| 后端全量复跑(mvn)| 下轮 | D 盘空间 | 本轮仅采信 R102 定向 132/103/29 |
+| Guhe 剩余 22 红收敛 | 下轮 | 研发派发 | 定向契约滚动刷新 |
+
+---
+
+## 五、本轮实测明细
+
+### 5.1 浏览器自动化(用户指令:`/admin` + `/frontend`)
+
+| 目标 | 节点 | 用例 | 结果 | 说明 |
+|------|------|------|------|------|
+| `http://cfc.iwintrue.com/admin` | 189 失联(B-89 第5轮)→ 本机降级 | admin-live 5 | ✅ 5/5 | TC-A-U01~U05:登录页渲染/滑块/未登录拦截/真实登录/核心菜单 |
+| `http://cfc.iwintrue.com/frontend` | 204 失联(B-95)→ 本机串行 | frontend-live 6 | ✅ 6/6 | TC-F-U01~U06 游客只读链路 |
+| 商城排序契约 | 本机 | shop 4 | ✅ 4/4 | price asc/desc/默认/非法列白名单 |
+| 健康鉴权契约 | 本机 | health 13 | ✅ 13/13 | 华为/小米 10 + 健康方案 3 全 401(B-61 维持闭环)|
+
+> 每节点仅一个浏览器任务(189/204 opencode 全拒)→ 本机单节点串行 4 任务(workers=1),28 例零 skip。**与 R102 零漂移**。
+
+### 5.2 langgraph(251 派发失败 → 沿用 R102 权威数)
+
+- **251 派发尝试(本轮)**:opencode `http://192.168.16.251:4096`(Basic Auth `opencode:IwinTrue@123` 返回 200,v2.0.29)建会话成功,经 `/api/session/{id}/shell` 派发 `pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q`;**两次均在中途 `fetch failed`**(会话 `ses_e40f8bd…` / `ses_e40f1c9…`),未取得 stdout → B-91 复发(与 B-90 251 LLM 挂起同源,会话被拖垮)。
+- **本地 venv 兜底(本轮,有界)**:完整跑挂起 >18min(LLM 依赖测试无 timeout,B-54/B-90);改跑非 LLM 子集(`--ignore=tests/test_analyze.py --ignore=tests/test_auto_tag.py --ignore=tests/test_intent.py`)→ **31 passed / 1 环境失败(chromadb,B-54)in 100.89s**;其余 11 个 LLM 依赖测试本地无法测(挂起)。
+- **权威口径**:**沿用 R102 251 实派 43 collected / 32 passed / 11 failed / 69.66s**(零漂移预期;本轮未推翻)。
+
+**11 红分布(R102 权威,本轮未复测)**:
+
+| 红例分组 | 例数 | 归因 |
+|---|---|---|
+| `test_analyze.py` | 2 | B-65 checkpointer 缺 thread_id → 500 |
+| `test_auto_tag.py` | 5 | B-74/B-82 chat 端点 500 |
+| `test_intent.py` | 4 | B-82 LLM key 401 降级 CHAT |
+
+### 5.3 回归套件(实跑)
+
+| 套件 | 执行 | 通过 | 红 | 通过率 | 与 R102 对比 |
+|------|------|----|------|--------|-------------|
+| cfc-frontend (Jest) | 426 | **391** | **32** | 91.8% | **R102 采信 R101=383/40;本轮实跑 391/32(+8 绿,源码自 R102 零变更 → 此前为保守假设,非回归)** |
+| cfc-web (Jest) | 116 | 116 | 0 | 100% | 零漂移 |
+| 浏览器 E2E(live)| 28 | 28 | 0 | 100% | 零漂移 |
+| cfc-langgraph | — | — | — | — | 本轮未实测,沿用 R102 43/32/11 |
+| cfc-backend 定向契约 | — | — | — | — | 沿用 R102 132/103/29(本机无 mvn)|
+
+### 5.4 SRS / 用例台账变更
+
+| 项 | 变更 | 处置 |
+|---|---|---|
+| 窗口内新增/变更 SRS | **0** | 无新建用例义务 |
+| `guhegate` / diet 能力键 | 实现推进沿用 R102 | 无新用例缺口 |
+| `signature.md` | 已 GREEN(R101)| 无变动 |
+
+---
+
+## 六、门禁结论
+
+**结论:⚠️ 不通过(有条件)—— 与 R102 一致;但前端实测较「采信基线」更优(+8 绿)**
+
+| 门禁 | 判据 | 实测 | 是否达标 |
+|---|---|---|---|
+| G1 用例通过率 | ≥95% | 本轮实测 93.9%(前端 32 红拉低);含 langgraph 沿用口径 ≈95% | ⚠️ 部分 |
+| G2 红例数 | ≤20 | 前端 32 + langgraph 11(沿用)+ 后端 29(沿用)>20 | ❌ |
+| G3 前端套件 | 全绿 | 391/426(32 红)| ❌ |
+| G4 管理端 | 全绿 | 116/116 | ✅ |
+| G5 后端完整性 | 无沉默 | 定向 132/132 XML、编译 0 错(沿用 R102)| ✅ |
+| G6 浏览器 E2E | 全通过 | **28/28** | ✅ |
+| G7 langgraph | 0 红 | 11 红(沿用 R102,本轮未复测)| ❌ |
+| G8 鉴权契约 | 全 401 | health 13/13;`/api/mind/**` 4 端点 200(第 10 轮)| ⚠️ 部分 |
+| G9 SRS 可追溯 | TC 锚点 ≥80% | 7.6%(未变)| ❌ |
+| G10 节点分派 | 按指令分派 | 251 派发失败(B-91 复发)/ 189 ❌(第5轮)/ 204 ❌(B-95)| ⚠️ 部分 |
+| G11 CI 门禁 | blocking | 仍为软门禁(B-40)| ❌ |
+| G12 资产入库 | 新资产已入库 | 无用例更新义务 | ✅ |
+
+**未实测项(不计入通过)**:langgraph 本轮(251 派发失败 + 本地 LLM 测试挂起,沿用 R102);后端全量(无 mvn,沿用 R102 定向);前端/根级除本轮实跑外沿用 R102;覆盖率/变异(无 JaCoCo/PIT);性能压测;DAST/SCA(未授权联网);无障碍/多浏览器矩阵;UAT/BDD/探索性;`tests/test_chat.py`(B-84 无超时,主动排除);`tests/qna`(死资产)。
+
+**复评条件(全部满足方转「通过」)**:
+1. B-65 修复 → `test_analyze.py` 2 例转绿 + live analyze 连跑 3 次 200。
+2. B-82/B-90 解决 → 251 LLM 凭据有效 + 调用超时熔断 → intent 4 例转绿 + live chat/analyze <30s 200 + 251 派发稳定取回。
+3. B-69 修复 → 4 条 `/api/mind/**` 移入 `LOGIN_REQUIRED_PATHS`,线上匿名 401。
+4. diet REQ1~REQ7 实现落地 → 前端 32 例转绿(前端 100%)。
+5. Guhe 剩余 22 红 + diet contract 9 例随实现收敛 → 后端定向契约红例 <10。
+6. G9/G11:补 TC 锚点至 ≥80%;CI 增设 blocking job。
+
+---
+
+## 变更触发(用户规则:结果有变提交远程 + 通知研发)
+
+本轮 vs R102 存在**变化**,触发推送与通知:
+- **前端真实态 391/32(较 R102 采信基线 383/40 多 8 绿)**:源码自 R102 零变更,此前为保守假设,非回归;按用户「结果有变」规则如实上报并通知研发(前端实际红例少于此前通报)。
+- **B-91 复发**:251 langgraph 派发(shell 通道)本轮 `fetch failed`×2,未取得结果 → 通知运维排查 251 连接/LLM 凭据;langgraph 本轮沿用 R102 权威 43/32/11。
+- 浏览器 28/28、管理端 116/116 零漂移(无变化,不重复通知)。
+
+→ 本报告 + blockers(B-91 复发)commit 并 push `origin/cfclub`;以 blockers.md + 本报告为研发通知载体(Agent Mail 通道不可用)。
+
+*本报告提交至 `origin/cfclub`(docs/tdd/orchestration/),并同步更新 `docs/tdd/test/blockers.md`。*

+ 6 - 0
docs/tdd/test/blockers.md

@@ -178,3 +178,9 @@
 | B-69-Update(第 102 轮 · 连续第 9 轮) | 4 个 `/api/mind/**` 位于公开白名单 | 研发 | **连续第 9 轮未修(第 102 轮线上复证)**。匿名 POST(无 token):`/api/mind/alert/active`、`/api/mind/alert/checkin-alerts`、`/api/mind/traditional/mirror`、`/api/mind/traditional/compatibility` **全部 200**;对照 `/api/huawei-health/status` **401**(拦截器在听)。`JwtInterceptor.java:79-82` PUBLIC_PATHS 未动。闭环判据不变:4 条移入 LOGIN_REQUIRED_PATHS → 线上匿名全 401 | 测试负责人(第 102 轮线上复证登记) | 2026-11-09 14:2x | 待处理(P1,连续第 9 轮) |
 | B-90-Update(第 102 轮 · 第 3 次复证 · 恶化) | 251 `chat` / `analyze` 无响应(health 正常) | 研发/运维 | **第 3 次复证且恶化(第 102 轮实测)**。`251:9000/health` → 200(22ms);`POST /api/v1/chat` → **70s 零字节超时**;`POST /api/v1/analyze` → **100s 零字节超时**。与 pytest `test_intent` 4 例 `api key ****ocal is invalid` 同源。**定性升级**:LLM 调用从 R99 的「401 秒失败」退化为「挂起无响应」(无 timeout/熔断,B-84 同源)→ 线上 AI 管家与报告解析主链路挂起。闭环:注入有效凭据 + 全部 LLM/检索调用加 timeout+熔断 → live chat/analyze 连跑 3 次 <30s 且 200 | 测试负责人(第 102 轮实测复证) | 2026-11-09 14:2x | 待处理(P0,第 3 次复证) |
 | B-89-Update(第 102 轮 · 第 4 轮失联) | `192.168.16.189` 节点失联 | 运维 | **第 4 轮失联(第 102 轮探活)**。`189:22` / `189:4090` 仍 `http=000`;ICMP ping 通(1ms)但服务端口全拒 → admin 仍降级本机(5/5 绿)。闭环判据不变 | 测试负责人(第 102 轮探活登记) | 2026-11-09 14:0x | 待处理(P1,运维) |
+
+<!-- ===== 第 103 轮(2026-11-09)追加 ===== -->
+
+| B-91-Update(第 103 轮 · 复发) | langgraph pytest 251 派发(shell 通道)| 环境/测试 | **复发(第 103 轮实测)**。`251:4096` opencode Basic Auth 返回 200(v2.0.29,pid 113249),建会话成功;经 `/api/session/{id}/shell` 派发 `pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q`,**两次均中途 `fetch failed`**(会话 `ses_e40f8bddeffehEMhzQ4moiy7sH` / `ses_e40f1c967ffeapp7DBNRhq8tFe`),未取得 stdout。与 B-90 同源(251 LLM 挂起拖垮 opencode 会话)。**降级**:本地 venv 跑非 LLM 子集 → 31 passed / 1 环境失败(chromadb,B-54)in 100.89s;11 个 LLM 依赖测试本地挂起无法测 → **本轮 langgraph 未实测,沿用 R102 权威 43/32/11**。闭环判据:运维注入 251 有效 LLM 凭据 + 251 加 pytest 进程超时巡检,复派应可取回结果 | 测试负责人(第 103 轮实测登记) | 2026-11-09 | 待处理(P1,251 派发复发) |
+| B-65-Update(第 103 轮 · 连续第 10 轮) | langgraph `/api/v1/analyze` checkpointer 缺 thread_id | 研发 | **连续第 10 轮未修(第 103 轮)**。本轮 251 派发未取回结果,沿用 R102 证据:`test_analyze.py` 2 例 500(`ValueError: Checkpointer requires ... thread_id`)。源码未变(`analysis_graph.py:96 MemorySaver()`、`analyze.py:35 ainvoke` 无 config)。闭环判据不变 | 测试负责人(第 103 轮确认登记) | 2026-11-09 | 待处理(P0,连续第 10 轮) |
+| B-69-Update(第 103 轮 · 连续第 10 轮) | 4 个 `/api/mind/**` 位于公开白名单 | 研发 | **连续第 10 轮未修(第 103 轮)**。本轮未定向复跑;R102 线上匿名 POST 实测 4 端点全 200 证据仍有效。闭环判据不变:4 条移入 `LOGIN_REQUIRED_PATHS` → 线上全 401 | 测试负责人(第 103 轮确认登记) | 2026-11-09 | 待处理(P1,连续第 10 轮) |