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

test(测试负责人·18:50轮): 三套本地套件全绿零漂移(frontend313/web90/langgraph51) | 新拓扑执行缺口B-51(本机Chromium缺失admin未跑)+B-52(health契约版本冲突) | ledger3793(+13) | 通知研发B-50/B-47

E2E Test Bot 5 дней назад
Родитель
Сommit
5073a5013e

+ 158 - 0
docs/tdd/orchestration/report-test-2026-11-07-1850.md

@@ -0,0 +1,158 @@
+# 测试负责人工作汇报 · TDD 闭环自动化测试
+
+> 轮次:2026-11-07 18:50 GMT+8(定时巡检;对比基线 18:30 / 提交 8dcc1fd5f,HEAD=18c91377e;本机 desktop204 无人值守,review 档)
+> 范围:全栈测试闭环 —— 浏览器自动化(按新拓扑:本机→admin、189→frontend)+ cfc-frontend + cfc-web + cfc-langgraph(251 不可达→本地兜底)
+> 拓扑指令(本轮新):浏览器自动化经 `http://cfc.iwintrue.com/admin`(后台) 与 `/frontend`(小程序) 进行;本机与 `192.168.16.189` 各为一个浏览器节点(每节点单任务);langgraph 部署于 `192.168.16.251`,测试应派发该节点。
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | `cfc-tester`(测试负责人,本会话/用户) |
+| 汇报周期 | 2026-11-07 18:50 GMT+8(定时巡检) |
+| 负责模块/单元 | 全栈测试闭环:浏览器自动化(admin / frontend)+ cfc-frontend + cfc-web + cfc-langgraph |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数** | 0 个 | 回归巡检,未新增用例 |
+| **本轮验证执行测试数** | 454 个 | cfc-frontend 313 + cfc-web 90 + cfc-langgraph 51(12 skipped 不计入执行) |
+| **用例通过率** | 100% | 454 PASS / 454 执行(langgraph 12 skipped 不计;浏览器/健康契约本轮未实跑见 1.2b) |
+
+**分套件明细:**
+
+| 套件 | 执行 | 通过 | 失败 | 跳过 | 结论 |
+|------|------|------|------|------|------|
+| cfc-frontend (Jest) | 313 | 313 | 0 | 0 | ✅ EXIT 0 |
+| cfc-web (Jest) | 90 | 90 | 0 | 0 | ✅ EXIT 0 |
+| cfc-langgraph (pytest, `--ignore=tests/qna`) | 63 | 51 | 0 | 12 | ✅ EXIT 0(251 不可达→本地 venv 兜底) |
+| 浏览器 admin-desktop(本机→`cfc.iwintrue.com/admin`) | — | — | — | — | ⚠️ 未执行(本机无 Chromium,见 B-51) |
+| 浏览器 frontend-mobile(189→`cfc.iwintrue.com/frontend`) | — | — | — | — | ⚠️ 未派发(189 可达但鉴权门控,未静默派发;基线 18:30 浏览器 15/15 为权威证据) |
+| 健康鉴权契约 health-contract(10 端点) | — | 5 | 5 | — | ⚠️ 未重跑(独立运行 Playwright 版本冲突,见 B-52);基线 5/10(B-50 待研发) |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数** | 0 个 | 189 未派发(鉴权门控,静默模式下不自动派发) |
+| **直接执行数** | 3 个 | frontend/web/langgraph 本地直跑 |
+| **恢复智能体会话数** | 0 个 | — |
+| **当前在用会话数** | 0 个 | 本地直跑会话已结束 |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| 本机 desktop204(浏览器节点·admin) | 本机直跑 | blocked | admin 浏览器自动化 | — | 不干净(他人 WIP 未提交) | Chromium 二进制缺失(`playwright install` 仅清理旧构建、网络受限无可用浏览器)→ admin 任务本轮回退未执行(B-51) |
+| web-189-4090(192.168.16.189:4090·浏览器节点·frontend) | — | idle | frontend 浏览器自动化 | — | — | 189:4090 TCP 可达,opencode 返回 `UnauthorizedError`(需鉴权);本轮未静默派发;基线 18:30 浏览器 15/15 含 frontend 6/6 为权威 |
+| opencode.iwintrue.com(192.168.16.251·langgraph) | — | blocked | langgraph pytest | — | — | 251:9000/4090 CLOSED,不可派发;langgraph 改本地 venv 兜底(51/0/12 绿) |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数** | 1 个 | B-51(本机 Chromium 缺失,环境/测试自处置) |
+| **已解决测试相关问题数** | 0 个 | — |
+| **待解决测试相关问题数** | 2 个 | B-50(P1 华为健康 5 端点未鉴权 200 直通,待研发)、B-51(本机 Chromium 缺失,测试自处置) |
+
+### 1.4 本轮 git 提交与推送证据
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| _本轮提交_ | 测试负责人巡检汇报 + B-51/B-52 登记 | 报告/台账 | 文档(md) | origin/cfclub | 待 push | 见文末 |
+
+### 1.5 状态机阶段分布(全局进度)
+
+本轮为回归巡检,未激活 TDD red→yellow→green 主循环;state.json 5 键全 GREEN(16:46 收口,B-46 已修复浏览器 15/15)。
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(SRS 池) | 0 | 异常(未启用) | srs_section 锚点 0,CFC 未启用 SRS 需求池 |
+| 契约常量(contract) | 正常 | 正常 | ops_file 扫描正常 |
+| 测试用例引用(test_case_map) | 784 | 正常 | 结构化用例 784 条 |
+| 执行结果回填(case_results) | 1185 | 正常 | 侧车 `test-progress.json` 1185 条 progress |
+
+**Ledger(discover + inventory,本轮刷新):**
+- 控制器 361|handler 1953(覆盖 434)|测试文件 292(@Test 2380,部分 4)
+- 覆盖分布:covered=32 / partial=198 / uncovered=130 / no-handler=1
+- 结构化 784 + Playwright 562 + Python 67 + Java @Test 2380 + 场景 11 = **3793**(基线 3780,+13 来自未提交后端集成测试 WIP)
+
+---
+
+## 二、向研发提出的改进建议
+
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
+|------|----------|----------|----------|----------|--------|------|
+| 1 | **华为健康 5 端点未鉴权 200 直通(B-50·P1)** | 华为运动健康 `auth-url/callback/sync/revoke/status` 未携带 Authorization 时返回 HTTP 200 直通(应为 401/403);小米同批接入正常拦截 | `JwtInterceptor.LOGIN_REQUIRED_PATHS` 含 `/api/xiaomi-health/` 但缺 `/api/huawei-health/`;`WebConfig.excludePathPatterns` 也未排除 → 匿名请求落到 controller 返回业务 200 | `LOGIN_REQUIRED_PATHS` 增 `/api/huawei-health/`(对齐小米) | P1 | 待处理 |
+| 2 | **JDK8 编译阻断(B-47·P0)** | `HuaweiAuthService` 使用 `URLEncoder.encode(s, Charset)`(仅 JDK10+),主干 JDK8 编译失败,后端全部用例无法编译执行 | 单点 JDK8 不兼容 API | 改 `encode(s, StandardCharsets.UTF_8.name())` 包 try/catch,或抬编译版本 | P0 | 待处理(本机无 mvn 未实测,基线已记录) |
+| 3 | **health-contract 独立运行版本冲突(B-52)** | 从 `d:/cfc` 根用 `-c tests/playwright.config.health.js` 跑 health 契约报 `test.describe() did not expect to be called here`(Playwright 版本冲突) | tests/node_modules 与根存在双版本 @playwright/test | 固化 playwright 版本或在 tests/ 目录内运行该契约 | P2 | 测试自处置 |
+
+---
+
+## 三、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| **B-51 本机 Chromium 缺失** | admin 浏览器任务本机无法执行 | 测试(自处置)/ 运维 | `playwright install chromium` 仅清理旧构建(chromium-1228/1234/headless_shell-1228),网络受限未装可用浏览器 → 本机 admin 任务回退未执行 | 测试/运维在本机节点重装 Chromium,或将 admin 任务改派 189 |
+| 251 langgraph 派发不可达 | langgraph 远程实测 | 测试/运维 | B-42 部分解除(189 通,251 仍闭);langgraph 本地 venv 兜底(51/0/12 绿) | 运维开通 251 opencode 端口或常态化本地兜底 |
+| SRS 池未启用 | 目标②覆盖率不可量化 | 需求/测试 | 待启用 | 产品/测试建 SRS 池 |
+
+---
+
+## 四、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 本机 Chromium 重装后重跑 admin 浏览器任务,验证 5/5(基线 B-46 已修复 15/15) | 下轮 | B-51 修复 | 回归 |
+| 189 派发接入(鉴权后回写 frontend 结果) | 下轮 | 189 节点鉴权通道 | 目前仅 18:30 基线权威 |
+| 251 端口开通后派发 langgraph 远程实测 | 下轮 | 251 可达 | 当前本地兜底 |
+| 启用 SRS 需求池 | 本迭代 | 产品口径 | 覆盖率可量化 |
+
+---
+
+## 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
+|---------|---------------|----------|----------|----------|----------|----------|
+| B-51 | 本机浏览器节点 desktop204(admin 任务) | 环境/测试自处置 | 测试自处置(重装 Chromium 或改派 189) | 2026-11-07 18:50 | 待处理 | 本轮(报告 + blockers.md) |
+| B-52 | tests/e2e-live/health-contract.spec.js(独立运行) | 测试(自处置) | 测试自处置(固化 playwright 版本) | 2026-11-07 18:50 | 待处理 | 本轮(报告 + blockers.md) |
+
+---
+
+## 对照用户双目标
+
+- **① 所有测试用例通过**:❌
+  - 失败/未执行项:admin 浏览器任务本机未执行(B-51 环境缺口);frontend 浏览器任务未派发(189 鉴权门控,基线 18:30 15/15 权威);健康契约 5/10(B-50 待研发);后端 2380 @Test 本机无 mvn 未跑 JUnit;251 不可派发 langgraph 远程。
+  - 通过项:cfc-frontend 313 ✅、cfc-web 90 ✅、cfc-langgraph 51 ✅。
+- **② 覆盖所有 SRS + 用户场景含异常流**:❌
+  - SRS 池未启用(0 锚点);784 结构化用例 + 11 场景零执行级验证;异常流 TC-*-E/-P 仅文档标注零执行;后端 130 uncovered handler。
+
+## 门禁结论
+
+**不通过**(双目标均未达成)。本轮关键事实:
+1. 三套本地可跑套件全绿且零漂移(frontend 313/313、web 90/90、langgraph 51/0/12),与 18:30 基线一致,无回归。
+2. 新拓扑执行缺口:本机浏览器节点 Chromium 缺失(B-51)→ admin 任务本轮回退未执行;189 可达但鉴权门控未静默派发;251 不可达 langgraph 本地兜底。
+3. 研发待办:B-50(华为健康 5 端点未鉴权 200,P1)、B-47(JDK8 编译阻断,P0)。
+
+## 变更触发动作(用户要求「结果有变化时提交远程 + 通知研发」)
+
+- **对比基线 18:30**:可重验结果零漂移(无测试失败变化);但**新增执行能力缺口 B-51(本机 Chromium 缺失,admin 任务无法本地执行)** + B-52(health 契约独立运行版本冲突)+ ledger +13(未提交 WIP 反映)——属执行拓扑/测试环境变化。
+- **处置**:本报告 + B-51/B-52 登记 → 提交并 push `origin/cfclub`(Agent Mail 不可用,以仓库报告 + 台账为通知载体)。研发通知重点:B-50(华为健康鉴权缺口 P1)、B-47(JDK8 编译 P0)。
+
+---
+
+## 提交与推送
+
+> 流程:`git stash`(隔离他人 WIP)→ `git pull --rebase origin cfclub`(origin 已推进至 7eefee1a0)→ `git stash pop` → `git add` 指定文档 → `git commit` → `git push origin cfclub`。回填:
+> - 提交 sha:`<TBD>`
+> - `git merge-base --is-ancestor <sha> origin/cfclub`:`<TBD>`
+> - 若 push 被拒(non-fast-forward):不 force,记录于 blockers / 待人工 `git pull --rebase` 后重推。

+ 6 - 3
docs/tdd/test/automation-status.md

@@ -21,10 +21,10 @@
 | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
 | 结构化测试用例(md) | 11 | 784 | 60 | 724 | 489 | 255 | 14 | 0 | 26 |
 | 用户场景(md) | 11 | 0 | 0 | 11 | 11 | 0 | 0 | 0 | 0 |
-| Playwright(e2e/integration) | 92 | 562 | 92 | 0 | 82 | 0 | 7 | 3 | 0 |
+| Playwright(e2e/integration) | 93 | 562 | 93 | 0 | 83 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 67 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 290 | 2367 | 290 | 0 | 273 | 0 | 15 | 2 | 0 |
-| **合计** | — | **3780** | **453** | **735** | 866 | 255 | 36 | 5 | 26 |
+| Java后端测试 | 292 | 2380 | 292 | 0 | 275 | 0 | 15 | 2 | 0 |
+| **合计** | — | **3793** | **456** | **735** | 869 | 255 | 36 | 5 | 26 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -821,6 +821,7 @@
 | --- | --- | --- | --- | --- |
 | `tests/e2e-live/admin-live.spec.js` | 5 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e-live/frontend-live.spec.js` | 6 | 已自动化(e2e) | 未跟踪 | — |
+| `tests/e2e-live/health-contract.spec.js` | 0 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e-live/shop-sort-api.spec.js` | 4 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/_smoke_browser.spec.js` | 2 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/activity-registration.spec.js` | 5 | 已自动化(e2e) | 未跟踪 | — |
@@ -1182,6 +1183,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | 10 | 已自动化(@Test) | 未跟踪 | HealthPlanReviewGuard |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` | 8 | 已自动化(@Test) | 未跟踪 | HealthReportAuditContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | 9 | 已自动化(@Test) | 未跟踪 | KnowledgeBaseBackfill |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallFilterTest.java` | 6 | 已自动化(@Test) | 未跟踪 | LegacyDimensionCallFilter |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallLogServiceTest.java` | 7 | 已自动化(@Test) | 未跟踪 | LegacyDimensionCallLogService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ManualDimensionScoreContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | ManualDimensionScoreContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | 6 | 已自动化(@Test) | 未跟踪 | MemberPriceResolver |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | MembershipRenewScP60ScP80Contract |

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
docs/tdd/test/blockers.md


+ 4 - 2
docs/tdd/test/discovery.md

@@ -14,8 +14,8 @@
 | 单元-部分覆盖(handler 方法) | 198 |
 | 单元-未覆盖(handler 方法) | 130 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 290 |
-| @Test 方法总数 | 2367 |
+| 测试文件数 | 292 |
+| @Test 方法总数 | 2380 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
@@ -433,6 +433,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | com | 7 | 10 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerAddMemberTest.java` | com | 7 | 1 | 1 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideFamilyServiceTest.java` | com | 7 | 0 | 0 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallLogServiceTest.java` | com | 7 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | com | 7 | 0 | 0 | OrchestrationController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDetailScP53ContractTest.java` | com | 7 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ScG01LandingContractTest.java` | com | 7 | 0 | 0 | — | — |
@@ -456,6 +457,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | com | 6 | 3 | 2 | HealthPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | com | 6 | 0 | 1 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorFavoriteServiceTest.java` | com | 6 | 6 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallFilterTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipPaySwitchTest.java` | com | 6 | 10 | 0 | MembershipController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipViewScP59ContractTest.java` | com | 6 | 0 | 0 | MembershipController | — |

+ 6 - 3
docs/tdd/test/inventory.md

@@ -9,11 +9,11 @@
 | 来源类型 | 文件数 | 用例/方法数 |
 | --- | --- | --- |
 | 结构化测试用例(md) | 11 | 784 |
-| Playwright(spec.js) | 92 | 562 |
+| Playwright(spec.js) | 93 | 562 |
 | Python(pytest) | 11 | 67 |
-| Java后端(测试文件) | 290 | 2367 (@Test) |
+| Java后端(测试文件) | 292 | 2380 (@Test) |
 | 用户场景(md) | 11 | 文件级 |
-| **合计** | — | **3780** 用例/方法 |
+| **合计** | — | **3793** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -814,6 +814,7 @@
 | --- | --- | --- |
 | `tests/e2e-live/admin-live.spec.js` | 5 | `tests/e2e-live/admin-live.spec.js` |
 | `tests/e2e-live/frontend-live.spec.js` | 6 | `tests/e2e-live/frontend-live.spec.js` |
+| `tests/e2e-live/health-contract.spec.js` | 0 | `tests/e2e-live/health-contract.spec.js` |
 | `tests/e2e-live/shop-sort-api.spec.js` | 4 | `tests/e2e-live/shop-sort-api.spec.js` |
 | `tests/e2e/_smoke_browser.spec.js` | 2 | `tests/e2e/_smoke_browser.spec.js` |
 | `tests/e2e/activity-registration.spec.js` | 5 | `tests/e2e/activity-registration.spec.js` |
@@ -1177,6 +1178,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | cfc-backend | 10 | HealthPlanReviewGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` | cfc-backend | 8 | HealthReportAuditContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthReportAuditContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | cfc-backend | 9 | KnowledgeBaseBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallFilterTest.java` | cfc-backend | 6 | LegacyDimensionCallFilter | `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallFilterTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallLogServiceTest.java` | cfc-backend | 7 | LegacyDimensionCallLogService | `cfc-backend/src/test/java/com/etotem/cfc/unit/LegacyDimensionCallLogServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ManualDimensionScoreContractTest.java` | cfc-backend | 13 | ManualDimensionScoreContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/ManualDimensionScoreContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | cfc-backend | 6 | MemberPriceResolver | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` | cfc-backend | 9 | MembershipRenewScP60ScP80Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` |

Некоторые файлы не были показаны из-за большого количества измененных файлов