Procházet zdrojové kódy

test(lead): R76 闭环汇报 + B-58 langgraph WIP 漂移通知 (2026-11-08)

E2E Test Bot před 5 dny
rodič
revize
a183d457c3

+ 158 - 0
docs/tdd/orchestration/report-test-2026-11-08-0021.md

@@ -0,0 +1,158 @@
+# 测试负责人工作汇报 · TDD 闭环自动化测试
+
+> 轮次:2026-11-08 00:21 GMT+8(定时闭环巡检,第 76 轮)
+> 基线:`origin/cfclub` round 75 报告 `report-test-2026-11-07-2305.md`(后端 JUnit 2398 在隔离树跑通;langgraph 本地 venv 59/0/12)
+> 执行档:review(离线);未联网改动、未安装依赖、未启停服务、未改生产代码
+> 拓扑执行实况:浏览器自动化 → 本机节点串行 21 例(admin 5 + frontend 6 + 健康契约 10);189 节点 TCP 4090 OPEN 但 HTTP API 401(B-56 未解除)→ 不可派发;langgraph → 251 的 9000/4090 仍 CLOSED(B-55 未解除)→ 本地 venv 兜底。本节点无 Maven,后端 JUnit 2398 未在本节点复跑(R75 证据保留)。
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | `cfc-tester`(测试负责人) |
+| 汇报周期 | 2026-11-08 00:21 GMT+8(定时闭环巡检,第 76 轮) |
+| 负责模块/单元 | 全栈测试闭环:cfc-frontend + cfc-web + cfc-langgraph + 线上浏览器自动化(admin / 小程序 H5)+ 鉴权契约 + SRS 用例建设 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | **0 个** | 本节点仅执行既有套件;按 skill 边界不创建用例。SRS 频繁变更(见 1.6)但文档用例接入执行台账仍为零(缺口,非本节点可闭环) |
+| **本轮验证执行测试数** | **475 个** | frontend 313 + web 90 + langgraph 51 + 浏览器/契约 21(admin5+frontend6+health10) |
+| **用例通过率** | **97.5%** | 463 PASS / 12 SKIP / 0 FAIL,分母 475;SKIP 为 langgraph 环境依赖项 |
+
+**分套件明细(全部本轮实测):**
+
+| 套件 | 执行 | 通过 | 失败 | 跳过 | 结论 |
+|------|------|------|------|------|------|
+| cfc-frontend(Jest 16 套件) | 313 | 313 | 0 | 0 | ✅ EXIT 0 |
+| cfc-web(Jest 12 套件) | 90 | 90 | 0 | 0 | ✅ EXIT 0 |
+| cfc-langgraph(pytest `--ignore=tests/qna`) | 63 | 51 | 0 | 12 | ⚠️ 较 R75 的 71/59 少 8(见变更) |
+| 浏览器 admin-desktop(`cfc.iwintrue.com/admin`) | 5 | 5 | 0 | 0 | ✅ TC-A-U01~U05 |
+| 浏览器 frontend-mobile(`/frontend`) | 6 | 6 | 0 | 0 | ✅ TC-F-U01~U06 |
+| 健康鉴权契约(10 端点) | 10 | 10 | 0 | 0 | ✅ B-50 保持关闭 |
+| cfc-backend JUnit | — | — | — | — | ⚠️ 本节点无 Maven,未复跑(R75 隔离树 2398 例 / 2279 绿 / 119 红) |
+
+### 与 R75(23:05)基线对账(变更检测)
+
+| 维度 | R75 | R76(本轮) | Δ | 归因 |
+|------|-----|-----------|---|------|
+| frontend | 313/313 | 313/313 | 0 | — |
+| web | 90/90 | 90/90 | 0 | — |
+| langgraph 收集/通过 | 71 / 59 | 63 / 51 | **-8 / -8** | ⚠️ 工作区 8 个 langgraph 测试文件未提交(WIP,B-53 复发)→ 本轮按当前工作树执行,收集数下降 |
+| admin 浏览器 | 5/5 | 5/5 | 0 | — |
+| frontend 浏览器 | 6/6 | 6/6 | 0 | — |
+| 健康契约 | 10/10 | 10/10 | 0 | — |
+| 后端 JUnit | 2398(隔离树) | 未跑(无 mvn) | N/A | 环境差异,非回归 |
+
+**结论:本轮存在测试结果与 R75 基线的变化 —— langgraph 通过数 59→51(-8),属「测试结果有变化」,已按指令提交远程 + 通知研发(见 1.4 / 三 / 附录 C)。**
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | 0 个(成功 0) | 尝试 189(浏览器)/ 251(langgraph)均失败:189 API 401(B-56)、251 CLOSED(B-55) |
+| **恢复智能体会话数** | 0 个 | — |
+| **当前在用会话数** | 3(本机 / 189 / 251) | 见 1.2b |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| 本机节点(浏览器+各 Jest+langgraph venv) | local | done | admin 5/5 + frontend 6/6 + 健康 10/10 + 三套 Jest + langgraph 51/12 | — | 干净(仅提交本报告) | workers=1 串行,遵守「每节点单任务」 |
+| 192.168.16.189:4090 | — | blocked | admin 浏览器自动化派发 | — | — | TCP OPEN,API 401 未鉴权(B-56) |
+| 192.168.16.251(langgraph) | — | blocked | langgraph pytest 派发 | — | — | 9000/4090 CLOSED(B-55)→ 本地 venv 兜底 |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | 1 个 | langgraph 通过数漂移 59→51(WIP 未提交,B-53 复发),详见附录 C |
+| **已解决测试相关问题数** | 0 个 | — |
+| **待解决测试相关问题数** | 5 个 | B-53(P0)/B-55(P1)/B-56(P1)/SRS 795 零执行(P1)/本节点无 Maven(P2) |
+
+### 1.4 本轮 git 提交与推送证据
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| `<本轮提交>` | B-58(langgraph WIP 漂移通知)+ 本报告 | 报告/台账 | md | `origin/cfclub` | 是(rebase 后 push) | 不触碰 74 个 WIP 文件 |
+
+> 提交前 `git fetch` 显示 origin 已推进至 `e35ca7186`(领先本节点 1+ 提交);本节点 HEAD=2441ab5f9。推送流程:stash 74 WIP → rebase origin/cfclub → push → stash pop 还原 WIP(不污染他人工作)。
+
+### 1.5 状态机阶段分布
+
+沿用 R75 台账(本轮未重跑 discover/inventory,因工作区含 74 WIP 文件,重跑会污染台账)。结构化 784 + Playwright 562 + Python 67 + Java @Test 2380 + 场景 11 = 3793;SRS 池未启用(0 锚点);795 文档用例/场景执行状态=0%。
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish / SRS) | 大量 | ⚠️ 活跃变更 | 自 11-05 起数十个 `docs(spec)`/`docs(需求)` 提交:华为运动健康接入、分润双体系 v0.1~v0.7、健康方案重构 R1-R6、家庭关系/签名横屏、商城价格排序等 |
+| 契约常量(contract) | — | 正常 | API_REFERENCE 持续增补 |
+| 测试用例引用(test_case_map) | — | ⚠️ 缺口 | 795 文档用例 0% 接入执行;分润/ai-butler/planner 等规格先于用例 |
+| 执行结果回填(case_results) | — | 部分 | 仅可执行子集回填;后端 119 红 / langgraph WIP 漂移未回填 |
+
+> **SRS 变更→用例更新缺口(目标②核心障碍)**:SRS 频繁变更但测试侧无自动化绑定闭环,文档用例处于「已编写未执行」状态。按 skill 边界测试负责人不创建用例,须由研发/测试协作将变更需求接入用例并执行(登记缺口,非静默放过)。
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | langgraph 测试 WIP 未提交致通过数漂移 | 8 个 langgraph 测试文件(conftest/test_analyze/test_auto_tag/test_chat/test_graph/test_intent/test_memory/test_report_parse)未提交,本轮收集 71→63、通过 59→51 | 多会话并行编辑同目录未收口(B-53 复发) | 产生 WIP 的会话对这 8 文件 `git add`+`commit`+`push`;PR 仅含测试文件 | P0 | 待处理 |
+| 2 | 251 langgraph 节点不可达 | 9000/4090 CLOSED,无法按拓扑派发 langgraph 测试 | 端口未放通/服务未起 | 运维放通 9000 后派发 langgraph(B-55) | P1 | 待处理 |
+| 3 | 189 浏览器节点 API 401 | TCP OPEN 但 HTTP API 返回 UnauthorizedError,admin 无法派 189 | 缺鉴权配置 | 配置 189 鉴权后 admin 改派 189,本机只跑 frontend,落实「每节点单任务」(B-56) | P1 | 待处理 |
+| 4 | SRS 变更→用例更新零闭环 | 795 文档用例 0% 执行,分润等规格先于用例 | 未启用 SRS 池、文档用例未接入执行台账 | 启用 SRS 池 + 将文档用例接入 discover/inventory 执行台账 | P1 | 待处理 |
+| 5 | 本节点无 Maven | 后端 JUnit 2398 无法在本节点复跑(R75 在隔离树跑通) | 沙箱无 mvn/mvnw | CI 接入后端 JUnit 或具备 Maven 节点回归 | P2 | 待评估 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| B-53 WIP 未提交(langgraph 8 文件 + 后端 11 文件) | langgraph/后端通过率稳定 | 研发/流程 | 已量化「42 例可转绿 / +1.75pp」;本轮 langgraph 再漂移 8 | WIP 归属会话收口 |
+| B-55 / B-56 节点分派 | 浏览器与 langgraph 无法按拓扑远程执行 | 运维/平台 | 本机单节点串行兜底 | 运维放通 + 配置鉴权 |
+| SRS 变更→用例更新缺口 | 目标②(覆盖全部 SRS+场景) | 需求/测试 | 登记缺口,待协作闭环 | 研发/测试协作 |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| WIP 收口后重跑 langgraph 验证 51→? 回归 | 待 WIP 会话提交 | B-53 | 目标回到 R75 59/0/12 |
+| 189 配置鉴权后 admin 改派 189 | B-56 修复后 | 运维 | 落实每节点单任务 |
+| 251 放通后派发 langgraph | B-55 修复后 | 运维 | 落实拓扑 |
+| 启用 SRS 池闭环 795 文档用例 | 本迭代内 | 研发/测试 | 目标②闭环 |
+
+---
+
+## 附录
+
+### 附录 A:本轮新增测试用例明细
+
+无(本轮未新增用例;SRS 变更用例更新为登记缺口,待协作闭环)。
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| langgraph pytest | 192.168.16.251 | 00:21 | 新建 | blocked(CLOSED) | — | B-55 端口不可达 | — |
+| admin 浏览器 | 192.168.16.189 | 00:21 | 新建 | blocked(API 401) | — | B-56 未鉴权 | — |
+
+### 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|----------|----------|----------|----------|
+| B-58 | cfc-langgraph tests/* | 缺陷/异常(通过数漂移) | 研发(WIP 未提交) | 2026-11-08 00:21 | 待处理 | 见 1.4 |
+
+---
+
+**模板版本**:v1.1(2026-11-03)|**适用对象**:测试负责人
+**门禁结论**:**不通过**。对照用户双目标:① 所有测试用例通过 ❌(后端 119 红 R75 + langgraph 漂移 59→51 + 本节点不可跑后端);② 覆盖全部 SRS+用户场景含异常流 ❌(SRS 池未启用=0 锚点 + 795 文档用例 0% 执行 + 异常流仅文档标注零执行)。可执行的本节点子集 475 例 100% 通过(除 12 langgraph 环境 skip)。

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

@@ -63,3 +63,4 @@
 | B-56 | 测试节点 opencode 派发任务执行不生效(204/189 均 TCP 可达但 session 创建后 agent 零产出) | 测试/运维 | **P2 分派机制缺陷(21:20 轮实测)**。`python` 经 opencode HTTP API(Basic `opencode:IwinTrue@123`)向 `192.168.16.204:4091` / `192.168.16.189:4090` `POST /api/session` 创建会话成功(200,返回 `ses_*`),`POST /api/session/{id}/prompt` 返回 200,但轮询 480s 内 `GET /api/session/{id}` 的 `assistant` 消息始终为空(`len=0`)→ 派发的浏览器任务未被 agent 实际执行,无任何产出。影响:按新拓扑「admin→189 / frontend→204」的远程派发链路失效,本轮改为在本机(204)直接用本地 Playwright CLI 实跑两个浏览器套件(frontend 6/6、admin 5/5 全绿)作为兜底证据。建议:修复 204/189 opencode 节点的 agent 任务执行链路(会话创建后需触发 agent run,而非仅登记 prompt),或将浏览器任务改为 opencode `run` 接口直接执行 playwright 命令。闭环:204/189 节点派发任务能回传真实 playwright 结果 JSON | 测试负责人(21:20 轮实测登记) | 2026-11-07 21:20 | 待处理 |
 | B-56 | 测试节点 opencode 派发任务执行不生效(204/189 均 TCP 可达但 session 创建后 agent 零产出) | 测试/运维 | **P2 分派机制缺陷(21:20 轮实测)**。`python` 经 opencode HTTP API(Basic `opencode:IwinTrue@123`)向 `192.168.16.204:4091` / `192.168.16.189:4090` `POST /api/session` 创建会话成功(200,返回 `ses_*`),`POST /api/session/{id}/prompt` 返回 200,但轮询 480s 内 `GET /api/session/{id}` 的 `assistant` 消息始终为空(`len=0`)→ 派发的浏览器任务未被 agent 实际执行,无任何产出。影响:按新拓扑「admin→189 / frontend→204」的远程派发链路失效,本轮改为在本机(204)直接用本地 Playwright CLI 实跑两个浏览器套件(frontend 6/6、admin 5/5 全绿)作为兜底证据。建议:修复 204/189 opencode 节点的 agent 任务执行链路(会话创建后需触发 agent run,而非仅登记 prompt),或将浏览器任务改为 opencode `run` 接口直接执行 playwright 命令。闭环:204/189 节点派发任务能回传真实 playwright 结果 JSON | 测试负责人(21:20 轮实测登记) | 2026-11-07 21:20 | 待处理 |
 | B-53-Update(第 75 轮量化) | B-53 精确复现:带 WIP 同 11 类 170 例 48 红 → 6 红(42 例可转绿) | 研发 | **P0 第三次催办,量化证据已具备**。隔离树 @`bca7dec03` 带入主工作区 11 个 `M` 状态后端测试文件后定向复跑同 11 类:`Tests run: 170, Failures: 4, Errors: 2`(`GuideFamilyTaskControllerTest` 2F+1E、`GuideRolePermissionTest` 1F+1E、`StatsControllerTest` 1F),对比 clean 基线同 11 类 **48 红**(Article 9 / Auth 4 / Family 1 / GuideFamilyTask 5 / GuideOrder 8 / GuideRolePermission 5 / GuideTeam 2 / Payment 4 / Product 3 / ProductOrder 6 / Stats 1)→ **42 例可立即转绿**。整体影响:后端 2279/2398 = 95.04% → **2321/2398 = 96.79%**(越过 G1 96% 阈值),红例 115 → **73**,红类 35 → **29**。闭环:11 文件入库后全量复跑 ≥96.79% | 测试负责人(第 75 轮实测量化) | 2026-11-07 23:05 | 待处理(连续 3 轮未收口) |
 | B-53-Update(第 75 轮量化) | B-53 精确复现:带 WIP 同 11 类 170 例 48 红 → 6 红(42 例可转绿) | 研发 | **P0 第三次催办,量化证据已具备**。隔离树 @`bca7dec03` 带入主工作区 11 个 `M` 状态后端测试文件后定向复跑同 11 类:`Tests run: 170, Failures: 4, Errors: 2`(`GuideFamilyTaskControllerTest` 2F+1E、`GuideRolePermissionTest` 1F+1E、`StatsControllerTest` 1F),对比 clean 基线同 11 类 **48 红**(Article 9 / Auth 4 / Family 1 / GuideFamilyTask 5 / GuideOrder 8 / GuideRolePermission 5 / GuideTeam 2 / Payment 4 / Product 3 / ProductOrder 6 / Stats 1)→ **42 例可立即转绿**。整体影响:后端 2279/2398 = 95.04% → **2321/2398 = 96.79%**(越过 G1 96% 阈值),红例 115 → **73**,红类 35 → **29**。闭环:11 文件入库后全量复跑 ≥96.79% | 测试负责人(第 75 轮实测量化) | 2026-11-07 23:05 | 待处理(连续 3 轮未收口) |
 | B-57 | 新用例断言错设:`@RequestAttribute` 缺失在 Spring 绑定层即 400,非业务分支 | 测试(自处置) | **A 类用例缺陷(本轮自发现并修复)**。`FamilyInviteApproveRequestTest` 首版把「未登录审批」断言为 `200 + message=请先登录`,实测 **400 Bad Request**——`@RequestAttribute("userId")` 为必需属性,缺属性时 `RequestAttributeMethodArgumentResolver` 在进入方法体前即抛 `ServletRequestBindingException`,controller 内 `approverUserId == null` 分支在 MockMvc 下不可达(仅当属性存在且为 null 才进入,而 `requestAttr(k, null)` 本身被 MockMvc 拒绝)。影响:若按首版断言入库,该用例会永久红;若为让用例变绿而放宽断言,则失去「未登录不得触达业务」的守护意义。修复:断言改为 `status().isBadRequest()` + `verify(service, never())`(既锁定拒绝、又锁定不触达业务);删除不可达的「属性为 null」用例并在此登记该分支为防御性代码。闭环:`FamilyInviteApproveRequestTest` **7/7 绿**,与另两类合计 **18/18 绿** | 测试负责人(第 75 轮实测登记) | 2026-11-07 23:05 | 已处置(用例已修,18/18 绿) |
 | B-57 | 新用例断言错设:`@RequestAttribute` 缺失在 Spring 绑定层即 400,非业务分支 | 测试(自处置) | **A 类用例缺陷(本轮自发现并修复)**。`FamilyInviteApproveRequestTest` 首版把「未登录审批」断言为 `200 + message=请先登录`,实测 **400 Bad Request**——`@RequestAttribute("userId")` 为必需属性,缺属性时 `RequestAttributeMethodArgumentResolver` 在进入方法体前即抛 `ServletRequestBindingException`,controller 内 `approverUserId == null` 分支在 MockMvc 下不可达(仅当属性存在且为 null 才进入,而 `requestAttr(k, null)` 本身被 MockMvc 拒绝)。影响:若按首版断言入库,该用例会永久红;若为让用例变绿而放宽断言,则失去「未登录不得触达业务」的守护意义。修复:断言改为 `status().isBadRequest()` + `verify(service, never())`(既锁定拒绝、又锁定不触达业务);删除不可达的「属性为 null」用例并在此登记该分支为防御性代码。闭环:`FamilyInviteApproveRequestTest` **7/7 绿**,与另两类合计 **18/18 绿** | 测试负责人(第 75 轮实测登记) | 2026-11-07 23:05 | 已处置(用例已修,18/18 绿) |
+| B-58 | cfc-langgraph 测试通过数漂移 59→51(WIP 未提交) | 研发 | **第 76 轮(2026-11-08 00:21)实测回归**:本地 venv 跑 `pytest tests/ --ignore=tests/qna` 收集 63(R75 为 71)、通过 51(R75 为 59),少 8 例。根因:工作区 8 个 langgraph 测试文件(`conftest.py`/`test_analyze`/`test_auto_tag`/`test_chat`/`test_graph`/`test_intent`/`test_memory`/`test_report_parse`)处于 `M` 未提交状态(WIP,B-53 复发)。影响:langgraph 通过率口径不稳,无法确认是否为真实回归,且违反「已修未提交=未完成」铁律。闭环:产生 WIP 的会话对这 8 文件 `git add`+`commit`+`push`(PR 仅含测试文件),收口后全量复跑回到 59/0/12;测试侧不代提交。 | 测试负责人(第 76 轮实测登记) | 2026-11-08 00:21 | 待处理 |