|
|
@@ -0,0 +1,336 @@
|
|
|
+# 测试负责人工作汇报(第 147 轮 · 2026-11-11 GMT+8)
|
|
|
+
|
|
|
+> 角色:cfc-tester(测试负责人)|执行档:**review(离线;内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)**
|
|
|
+> 基线 HEAD:`df4c2ab45`(R146),窗口内 origin 推进至 `c21934790`(仅 cfc-web 版本号 bump + CHANGELOG + 研发 R119 汇报,**零功能源码变更**)→ 后端全量**采信 R146**(44m 实跑刚产出、窗口零源码变更),浏览器 / langgraph / 三套 Jest / 根级**本轮全部实跑**。
|
|
|
+> 节点:`189:4090` = 200 且 shell 可建可读 → **admin-desktop 实派 5/5**|`251:4096` = 200、`251:9000 /health` = ok → **langgraph pytest 实派 51 例**|`204:4090` = 000(B-95 第 18 轮)
|
|
|
+> 分工:**189** = admin-desktop E2E(1.2m);**251** = langgraph pytest(506.90s);**本机** = 浏览器 fe/shop/health/dx + 三套 Jest + 根级 + 报告编译
|
|
|
+> 结论:⚠️ **有条件通过** —— **langgraph 51 例首次全绿**(R146 2 红全部转绿,B-142-2 红例清零、疑似销号待下轮复验);浏览器 **28/28 + dx 2 skip**(189 实派 5/5);全量 **3782 例 / 3728 过 = 98.57%**(G1 ✅)。G2(36 红)/ G9 锚点 / G11 CI 仍未达阈值。
|
|
|
+> **变更触发**:langgraph 2 红→0 红(**首次全绿**)→ 结果实质改善 → **已 push + 通知研发**(见 §9)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 基本信息
|
|
|
+
|
|
|
+| 项目 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 汇报人 | `cfc-tester`(测试负责人) |
|
|
|
+| 汇报周期 | 2026-11-11(第 147 轮,跑测窗口 15:43–16:05) |
|
|
|
+| 负责模块/单元 | cfc-backend(采信 R146) · cfc-frontend(Jest 实跑) · cfc-web(Jest 实跑) · cfc-langgraph(251 实派全绿) · 浏览器 E2E(admin@189、frontend·shop·health·dx@本机) · 根级黑盒(实跑) |
|
|
|
+| 执行档 | review(离线;未装依赖、未启停服务、未改生产代码) |
|
|
|
+
|
|
|
+### 0.1 测试用例建设与执行
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **本轮新增测试用例数** | `0` 个 | SRS/specs/API_REFERENCE/test-cases 窗口**零变更**(`git diff df4c2ab45..origin/cfclub` 仅版本号 + docs)→ G12 合规 |
|
|
|
+| **本轮验证执行测试数** | `3782` 个 | 后端 2946(采信)+ 前端 616 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
|
|
|
+| **用例通过率** | `98.57%`(3728/3782) | 剔 skip 口径 **99.04%**(3728/3764);红 36(后端 17 + 前端 3 + 根级 16 + langgraph 0) |
|
|
|
+| **新增覆盖资产** | `0` 项 | 无 SRS 变更、无新契约文件 |
|
|
|
+
|
|
|
+### 0.2 会话与任务分发
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **分派任务数** | `2` 个 | ① 189:admin-desktop E2E(1.2m,5/5);② 251:langgraph pytest(506.90s,**51/51 全绿**);其余本机直跑 |
|
|
|
+| **恢复智能体会话数** | `0` 个 | 无中断/重建 |
|
|
|
+| **当前在用会话数** | `3` 个 | 本机(done)/ 189=shell(done, EXIT=0)/ 251=shell(done, pytest 正常收尾) |
|
|
|
+
|
|
|
+### 0.2b 各会话当前工作状态
|
|
|
+
|
|
|
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
|
|
|
+|----------|---------|----------|----------|---------------|----------|------|
|
|
|
+| 本机 | localhost | done | 浏览器 fe/shop/health/dx + Jest×3 + 根级 | — | `d:\cfc` | fe 48.1s、shop 4.7s、health 4.0s;Jest 33.8s/33.2s/9.4s |
|
|
|
+| 189:4090 | shell 直连 | done | admin-desktop E2E | — | `C:\code\cfc\tests` | **5/5 通过(1.2m,EXIT=0)** |
|
|
|
+| 251:4096 | shell 直连(tee 落盘) | done | langgraph pytest | 506.90s | `/sc-data/cfc/cfc-langgraph` | **51/51 全绿(首次)**;HEAD `c21934790` = origin 最新 |
|
|
|
+| 204:4090 | — | unknown(000) | 失联 | — | — | B-95 第 18 轮 |
|
|
|
+
|
|
|
+### 0.3 问题处置
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **新测试发现问题数** | `0` 个 | 无新红、无新 B-* 登记 |
|
|
|
+| **已解决测试相关问题数** | `0` 个 | 无测试侧自闭环(零 SRS 变更) |
|
|
|
+| **待解决测试相关问题数** | `8` 类 | 后端 17 存量红 · 前端 3 预期 RED · 根级 16 环境红 · dx 2 端点 404(B-DX-1 第 9 轮)· 204 失联(B-95 第 18 轮)· admin 鉴权门缺失(B-142-1 第 6 轮)· nutrition_age_dosage 建表失败(B-145-1 第 3 轮)· B-134-4 兜底缺陷(本轮未触发) |
|
|
|
+
|
|
|
+### 0.4 本轮 git 提交与推送证据
|
|
|
+
|
|
|
+| 提交 sha | 关联键 | 阶段 | 触及文件 | 目标分支 | 已推送远端 | 备注 |
|
|
|
+|----------|--------|------|----------|----------|------------|------|
|
|
|
+| 见 §9 | R147 报告 + 通知 + 台账更新 | 测试闭环 | `docs/tdd/**` + `tests/e2e/_automation_reachability_result.json` | `cfclub` | 是 | 结果变化触发(langgraph 2→0 红首次全绿) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 历史审查记录(仅作对照,不作为本轮结论依据)
|
|
|
+
|
|
|
+| 轮次 | 时间 | 后端全量 | langgraph | 浏览器 | 前端 Jest | 结论 |
|
|
|
+|---|---|---|---|---|---|---|
|
|
|
+| R144 | 11-11 11:43 | 采信 R142 | 251 实派 36 过 / 7 红 / 43 例 | 28/28 + dx 2 skip | 采样 601/3/12 | 有条件通过 |
|
|
|
+| R145 | 11-11 13:25 | 347/2946/2925 过/99.29%/17 红(实跑) | 251 实派 45 过 / 6 红 / 51 例 | **28/28 + dx 2 skip(189 双节点恢复)** | 601 过/3 红/12 跳 | 有条件通过 |
|
|
|
+| R146 | 11-11 14:42 | 347 类 / 2946 例 / 2925 过 / 99.29%(实跑 44m)/ 17 红 | 251 实派 49 过 / 2 红 / 51 例 | **28/28 + dx 2 skip(189 5/5)** | 601 过 / 3 红 / 12 跳(实跑) | 有条件通过 |
|
|
|
+| **R147(本轮)** | 11-11 15:56 | **采信 R146(2946/2925/17 红,零源码变更)** | **251 实派 51 过 / 0 红 / 51 例(首次全绿)** | **28/28 + dx 2 skip(189 5/5)** | **601 过 / 3 红 / 12 跳(实跑)** | **有条件通过** |
|
|
|
+
|
|
|
+**本轮变化(对照 R146)**
|
|
|
+
|
|
|
+| 项 | R146 | R147 | 判定 |
|
|
|
+|---|---|---|---|
|
|
|
+| 后端 | 347/2946/2925 过/17 红(44m 实跑) | 采信 R146(窗口零源码变更) | 零漂移(17 红逐类逐例同集合,第 7 次) |
|
|
|
+| langgraph | 51 例 / 49 过 / 2 红(ConnectError 上游) | **51 例 / 51 过 / 0 红(506.90s)** | **+2 过 / −2 红,首次全绿,实质改善** |
|
|
|
+| 浏览器 admin 节点 | 189 实派 5/5 | **189 实派 5/5(1.2m)** | G10 双节点维持 |
|
|
|
+| 前端 Jest | 601/3/12 | **601/3/12(实跑)** | 零漂移 |
|
|
|
+| 全量通过率 | 98.52%(3782/3726) | **98.57%(3782/3728)** | **+0.05pp(langgraph 改善驱动)** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 项目画像(简版,SRS 口径)
|
|
|
+
|
|
|
+| 维度 | 本轮事实 |
|
|
|
+|---|---|
|
|
|
+| 业务定位 | 家庭教育成长平台(五维能量 · 健康报告 · 测评订单 · 家庭邀请 · 商城 · AI 管家) |
|
|
|
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus(Java 8,`9082`)· uni-app 小程序 Vue2 · Vue2+Element UI 管理端 · FastAPI+LangGraph+ChromaDB(`9000`) |
|
|
|
+| 模块结构 | `cfc-backend`(347 测试类 / 366 控制器)· `cfc-frontend`(40 套件 / 616 例)· `cfc-web`(17 套件 / 116 例)· `cfc-langgraph`(51 例)· `tests/`(浏览器 30 + 根级黑盒 23) |
|
|
|
+| 关键路径 | 登录鉴权(JWT + `/api/**` 拦截)→ 家庭/成员 → 五维能量 → 健康报告上传解析 → 健康方案 → 商城订单/支付 → AI 对话/分析 |
|
|
|
+| 质量目标 | 全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
|
|
|
+| 风险点 | ① `/api/admin/**` 鉴权门缺失(B-142-1);② langgraph 依赖 251 LLM 上游稳定性(本轮恢复,B-142-2 疑似销号待复验);③ `nutrition_age_dosage` 建表失败(B-145-1);④ 204 节点失联、dx 端点未部署 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
|
|
|
+
|
|
|
+| # | 测试类型 | 状态 | 证据(本轮) |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | ✅ 已实测 | 后端 2946 例(采信 R146 44m 实跑);web 116 实跑;fe 616 实跑 |
|
|
|
+| 2 | 组件测试 | ✅ 已实测 | fe 40 套件 / web 17 套件(shallowMount 组件用例) |
|
|
|
+| 3 | 接口 API 测试 | ✅ 已实测 | 后端 MockMvc/直调覆盖 366 控制器面;langgraph 51 例(251 实派全绿) |
|
|
|
+| 4 | 集成测试 | ✅ 已实测(有红) | `integration.*`:EnergySystemFlowTest 6F、DimensionRegistryMapContractTest 3F、GuideModuleIntegrationTest 1E(采信 R146) |
|
|
|
+| 5 | 系统/端到端 E2E | ✅ 已实测 | 浏览器 30 例:**189 admin 5/5** + 本机 fe 6/6、shop 4/4、health 13/13、dx 2 skip |
|
|
|
+| 6 | 冒烟测试 | ✅ 已实测 | 浏览器 28 通过 + 后端 2925 过 + Jest 717 构成本轮冒烟面 |
|
|
|
+| 7 | 回归测试 | ✅ 已实测 | 后端存量 17 红逐类同集合(**零漂移第 7 次**);web 116、fe 601、根级 23 零漂移 |
|
|
|
+| 8 | 探索性测试 | ⚠️ 待核实 | 无 charter 记录(沿用历轮结论) |
|
|
|
+| 9 | 验收 UAT / BDD | ⚠️ 待核实 | 无 cucumber/gherkin 执行证据(`*.feature` = 0) |
|
|
|
+| 10 | 性能测试 | ⛔ 未授权未执行 | 压测属 execute 档,需联网显式授权(仅记录真实耗时) |
|
|
|
+| 11 | 可靠性测试 | ✅ 已实测 | 后端 44m 无中断、**347/347 XML 无沉默**(采信);langgraph 506.90s 正常收尾(B-126 未复现,第 8 轮) |
|
|
|
+| 12 | 安全测试(SAST/DAST/SCA/渗透) | ⛔ 未授权未执行 | 仅鉴权契约面:线上 **5/5 匿名 POST → 401**(G8 ✅);**B-142-1 复核:`/api/admin/families/overview` 匿名 POST → HTTP 200 + code:400**(延续第 6 轮) |
|
|
|
+| 13 | 兼容性测试 | ⚠️ 待核实 | 仅 Chromium 单引擎(1440×900 / 375×812) |
|
|
|
+| 14 | 可用性测试 | ⚠️ 待核实 | 无真实用户可用性证据 |
|
|
|
+| 15 | 无障碍测试 | ⚠️ 待核实 | 无 axe/WCAG 扫描 |
|
|
|
+| 16 | 覆盖率度量 | ⚠️ 已实测(低) | web 语句 ≈10%(17 套件);后端 **JaCoCo 未接入**(pom 中 jacoco=0)→ 无行覆盖 |
|
|
|
+| 17 | 变异测试 | ⛔ 未发现 | 无 PIT / mutation 资产(pitest=0) |
|
|
|
+| 18 | 契约测试 | ✅ 已实测 | health 13/13、shop 4/4、dx 2(skip=404);后端契约类 DimensionRegistryMap 3 红(待裁决)、WechatLoginContract 1 红、TeamProfitCronContract 1 红 |
|
|
|
+| 19 | QA 流程 | ⚠️ 待核实 | 147 轮闭环可追溯;门禁未脚本化(人工判读) |
|
|
|
+| 20 | 覆盖率门禁/CI | ⛔ 未发现 | `.github/workflows` 不存在(CI=0)→ 无 CI 全量 job(G11 ❌) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 本轮实测明细
|
|
|
+
|
|
|
+### 4.1 后端全量(采信 R146,44 分钟实跑;窗口零源码变更)
|
|
|
+
|
|
|
+```
|
|
|
+基线 df4c2ab45..origin/cfclub:仅 cfc-web 版本号 bump + CHANGELOG + docs —— 后端源码零 diff
|
|
|
+R146 实跑证据:Tests run: 2946, Failures: 16, Errors: 1, Skipped: 4(BUILD FAILURE:仅测试红)
|
|
|
+```
|
|
|
+
|
|
|
+| 指标 | 值 |
|
|
|
+|---|---|
|
|
|
+| 测试类 / 用例 | **347 类 / 2946 例** |
|
|
|
+| 通过 / 红 / 跳过 | **2925 / 17 / 4** |
|
|
|
+| 通过率 | **99.29%**(剔 skip 99.42%) |
|
|
|
+| 产物完整性 | `target/surefire-reports` **347/347 XML**(无静默丢失) |
|
|
|
+| 编译 | testCompile **353 源 0 错**(main 2121 源 0 错) |
|
|
|
+| **17 红归因** | 装置/契约待裁决 10(DimensionRegistryMapContract 3 + Orchestration 2 + Payment 2 + WechatLogin 2 + TeamProfitCron 1)+ 集成 7(EnergySystemFlow 6F+1S、GuideModule 1E)→ **零回归(第 7 次)** |
|
|
|
+
|
|
|
+### 4.2 浏览器自动化(用户核心指令)— 双节点 ✅
|
|
|
+
|
|
|
+| 套件 | 节点 | 例数 | 结果 | 耗时 | 备注 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| admin-desktop | **189** | 5 | **5/5 通过** | 1.2m | `TC-A-U01~U05` 全绿(登录 6.1s、核心菜单 56.3s);EXIT=0 |
|
|
|
+| frontend-mobile | 本机 | 6 | **6/6 通过** | 48.1s | 游客浏览/五维沙盘/TabBar/鉴权引导 |
|
|
|
+| shop-api | 本机 | 4 | **4/4 通过** | 4.7s | 价格排序契约(S1) |
|
|
|
+| health-contract | 本机 | 13 | **13/13 通过** | 4.0s | 华为/小米/健康方案 鉴权 401 保障 |
|
|
|
+| dx-bridge | 本机 | 2 | **2 skip** | — | `bridge/{list,sync-status}` → 404(B-DX-1 第 9 轮) |
|
|
|
+| **合计** | 双节点 | **30** | **28/28 过 + 2 skip** | **~2m** | **G10 双节点维持** |
|
|
|
+
|
|
|
+### 4.3 langgraph pytest(251 实派)✅ **首次全绿(本轮最大改善)**
|
|
|
+
|
|
|
+| 类别 | 例数 | 结果 | 根因 |
|
|
|
+|---|---|---|---|
|
|
|
+| 全量(`--ignore=tests/qna --ignore=tests/test_chat.py`) | **51** | **51/51 全绿(506.90s)** | R146 的 2 红(auto_tag ConnectError)**本轮全部转绿**——LLM 上游恢复 |
|
|
|
+| non-LLM 面 | 39 | 39/39 过 | 代码层面零回归 |
|
|
|
+| auto_tag(LLM 依赖) | 4 | **4/4 过**(R146:2/4) | 上游连接恢复,无 ConnectError/401/429 日志 |
|
|
|
+| intent(LLM 依赖) | 5 | **5/5 过** | 连续第 2 轮全绿 |
|
|
|
+| qna / test_chat | — | 排除 | `--ignore=tests/qna --ignore=tests/test_chat.py`(B-141-1 收集期缺陷) |
|
|
|
+
|
|
|
+**关键证据(251 日志实测)**
|
|
|
+- pytest 汇总:`51 passed, 8 warnings in 506.90s (0:08:26)` —— **无 FAILED 行**
|
|
|
+- 日志零 `ConnectError` / `Authentication Fails` / `429` —— B-142-2 红例首次清零(疑似销号,待下轮复验确认后正式销号)
|
|
|
+- 节点 HEAD `c21934790` = origin 最新(窗口源码零变更)→ 改善归因**环境/上游恢复**,非代码修复
|
|
|
+- `LG_EXIT=124` 为 timeout 管道噪音(pytest 完整输出 51 passed 后 shell 才收尾,R139/143 同款怪癖);进程正常退出、无挂起特征 → **B-126 连续观察第 8 轮未复现**
|
|
|
+
|
|
|
+### 4.4 其余套件(实跑)
|
|
|
+
|
|
|
+| 套件 | 结果 | 耗时 | 备注 |
|
|
|
+|---|---|---|---|
|
|
|
+| cfc-web Jest | **116/116**(17 套件) | 33.8s | 零漂移 |
|
|
|
+| cfc-frontend Jest | **616:601 过 / 3 红 / 12 跳** | 33.2s | 3 红为 S-cfc-132/133 预期 RED(`signature.consignee` 2 + `growthHistory.dayGroupView` 1) |
|
|
|
+| 根级黑盒 Jest | **23:7 过 / 16 红** | 9.4s | 16 红全 `ECONNREFUSED 127.0.0.1:9082`(B-36 第 43 轮零漂移) |
|
|
|
+
|
|
|
+### 4.5 全量口径汇总
|
|
|
+
|
|
|
+| 套件 | 用例 | 通过 | 红 | 跳过 | 通过率 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| cfc-backend | 2946 | 2925 | 17 | 4 | 99.29% |
|
|
|
+| cfc-frontend | 616 | 601 | 3 | 12 | 97.56% |
|
|
|
+| cfc-web | 116 | 116 | 0 | 0 | 100% |
|
|
|
+| 根级黑盒 | 23 | 7 | 16 | 0 | 30.43% |
|
|
|
+| cfc-langgraph | 51 | **51** | **0** | 0 | **100%** |
|
|
|
+| 浏览器 E2E | 30 | 28 | 0 | 2 | 93.33% |
|
|
|
+| **合计** | **3782** | **3728** | **36** | **18** | **98.57%**(剔 skip 99.04%) |
|
|
|
+
|
|
|
+### 4.6 线上鉴权与可达性
|
|
|
+
|
|
|
+| 项 | 结果 |
|
|
|
+|---|---|
|
|
|
+| 匿名 POST 鉴权面 | `/api/mind/fortune` `/api/energy/overview` `/api/health/plan/list` `/api/huawei-health/status` `/api/xiaomi-health/status` → **5/5 = 401**(G8 ✅,B-69 销号第 10 轮维持) |
|
|
|
+| admin 鉴权门(B-142-1 复核) | `POST /api/admin/families/overview` 匿名 → **HTTP 200**(body `code:400`,拦截器放行、参数校验先返回)——**延续第 6 轮** |
|
|
|
+| 页面 | `/admin` 302→**200**、`/frontend` 302→**200** |
|
|
|
+| dx 端点 | `bridge/list` 404、`bridge/sync-status` 404(B-DX-1 第 9 轮) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 门禁结论(⚠️ 有条件通过)
|
|
|
+
|
|
|
+| 门禁 | 指标 | 阈值 | 本轮 | 结果 |
|
|
|
+|---|---|---|---|---|
|
|
|
+| **G1 全量通过率** | 3728/3782 | ≥ 98% | **98.57%** | ✅ |
|
|
|
+| **G2 零未归因红** | 36 红(17 存量 + 3 预期 + 16 环境 + lg 0) | 0 | 36,全部已归因 | ❌ |
|
|
|
+| **G3 前端 Jest** | 601/3/12 | 0 非预期红 | 3 预期 RED(有台账) | ⚠️ |
|
|
|
+| **G4 管理端** | 116/116 | 0 红 | 0 红 | ✅ |
|
|
|
+| **G5 编译/产物完整性** | 353 源 0 错;347/347 XML(采信) | 全绿 | 全绿 | ✅ |
|
|
|
+| **G6 浏览器 E2E** | 28/28 + 2 skip | 100% 可执行 | **100%** | ✅ |
|
|
|
+| **G7 langgraph** | **51/51 全绿** | 0 红 | **0 红(首次全绿)** | ✅ |
|
|
|
+| **G8 鉴权** | 5/5 = 401 | 100% | 100%(admin 面另计 B-142-1) | ✅ |
|
|
|
+| **G9 场景锚点** | 101/347 | ≥ 95% | **29.1%** | ❌ |
|
|
|
+| **G10 双节点** | 189 admin 5/5 + 251 pytest 51 例 | 双节点连通 | **双节点均实派成功** | ✅ |
|
|
|
+| **G11 CI 全量门禁** | `.github/workflows` = 0 | 有 | 无 | ❌ |
|
|
|
+| **G12 SRS 合规** | 0 新增用例 | 0 抖动 | 0 | ✅ |
|
|
|
+| **综合** | — | — | — | **⚠️ 有条件通过** |
|
|
|
+
|
|
|
+**通过条件(复评门槛)**
|
|
|
+1. G2 清零:后端 17 存量红逐类闭环;根级 16 红需 9082 常驻或改为可跳过的门控用例
|
|
|
+2. G9 提升:SRS 池 795 文档用例脚本化落地,锚点 ≥95%
|
|
|
+3. G11:CI 接入后端全量 + 前端 Jest + 浏览器 E2E
|
|
|
+4. G7 维持:langgraph 连续 2 轮 51/51 后正式销号 B-142-2
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 五要素问题清单
|
|
|
+
|
|
|
+### 问题 1 · B-145-1(第 3 轮,P1)`nutrition_age_dosage` 建表 SQL 无效,表从未创建
|
|
|
+
|
|
|
+1. **问题描述**:后端每次启动 `DatabaseInitializer` 执行 `schema.sql` 时,`nutrition_age_dosage` 建表语句报 `SQLSyntaxErrorException: Key column 'product_id' doesn't exist in table`,该表在任何环境**从未创建成功**。本轮为上市后第 3 轮挂账,未见修复提交。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5354`(`INDEX idx_product (product_id)`),实体 `com.etotem.cfc.entity.NutritionAgeDosage` 无 `productId` 字段。
|
|
|
+3. **最优修改方案**:删除该行 `INDEX idx_product (product_id)`;若产品维度确需保留,则补 `product_id BIGINT` 列 + 实体字段 + 迁移(`ensureColumn("nutrition_age_dosage","product_id","BIGINT NULL")`)并同步 schema.sql。
|
|
|
+4. **修改目的**:让 DDL 可执行、表能被创建,消除「静默跳过建表 → 运行期 500」的隐藏故障面;对应 G5(产物/初始化完整性)。
|
|
|
+5. **能否闭环**:能。复测方式:空库执行 `mvn -o -B clean test` 观察启动段无 `SQLSyntaxErrorException`,且 `SHOW TABLES LIKE 'nutrition_age_dosage'` 命中;通过标准 = 启动日志零 DDL 异常 + 相关 Service 用例转绿。
|
|
|
+
|
|
|
+### 问题 2 · B-142-1(第 6 轮,P1 安全)`/api/admin/**` 鉴权门缺失
|
|
|
+
|
|
|
+1. **问题描述**:匿名 `POST /api/admin/families/overview` 返回 HTTP 200(body `code:400`),请求已穿过 `JwtInterceptor` 到达控制器;对照组 `/api/energy/overview` 匿名 401。连续 6 轮复核成立。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java:105-130`(`LOGIN_REQUIRED_PATHS` 未含 `/api/admin/`)。
|
|
|
+3. **最优修改方案**:`LOGIN_REQUIRED_PATHS` 增加 `/api/admin/` 前缀,并对 admin 族补角色校验(`role != admin → 403`);补契约用例 `AdminAuthGateTest`(匿名 → 401/403)。
|
|
|
+4. **修改目的**:封堵管理端数据面的未授权访问入口(纵深防御,不依赖单层校验)。
|
|
|
+5. **能否闭环**:能。复测方式:§4.6 匿名 POST 期望 401/403;通过标准 = 0 个 200/400 响应 + 新契约用例全绿。
|
|
|
+
|
|
|
+### 问题 3 · B-142-2(第 6 轮,P0 运维)251 LLM 上游连接故障 —— 本轮红例清零,疑似销号
|
|
|
+
|
|
|
+1. **问题描述**:R139~R146 期间 langgraph 红例由 LLM 上游故障(429 额度 → ConnectError 连接失败)驱动;**本轮 51 例全绿、日志零 ConnectError/429/401**——上游已恢复,B-142-2 的失败面未再触发。
|
|
|
+2. **测试 bug 点**:历史失败点 `cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_valid_format|content_relevance`;根因日志 `middleware.py:113 ... ConnectError`(R146)。
|
|
|
+3. **最优修改方案**:运维维持 251→LLM 上游链路与额度稳定;测试侧对上游故障增加 `pytest.mark.env_skip` 显式标注环境跳过,避免「环境红」与「代码红」混同(延续 R146 建议)。
|
|
|
+4. **修改目的**:让 G7 的绿具备可判定性与稳定性,防止偶发环境抖动假红。
|
|
|
+5. **能否闭环**:能。复测方式:251 复跑 `pytest -q --ignore=tests/qna --ignore=tests/test_chat.py`;**通过标准 = 连续 2 轮 51/51 零 ConnectError/429 → 正式销号 B-142-2**(本轮为首轮全绿)。
|
|
|
+
|
|
|
+### 问题 4 · B-134-4(第 10 轮,P1)`intent_classifier` 上游故障静默兜底伪装成正常分类
|
|
|
+
|
|
|
+1. **问题描述**:分类失败(429/401/ConnectError)时 `intent_classifier.py:62` 捕获异常后「默认 chat」,把服务不可用伪装成分类结果;本轮 intent 5/5 全绿(上游恢复)但兜底缺陷仍存在,上游一故障就会假绿。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/app/agents/intent_classifier.py:62`。
|
|
|
+3. **最优修改方案**:兜底改为「显式抛错 + 上游标记」(`raise IntentUnavailable` 或返回值带 `degraded=true`),由路由层决定降级;测试侧对 `degraded` 断言。
|
|
|
+4. **修改目的**:消除静默兜底造成的假绿/假红,让 G7 失败可归因。
|
|
|
+5. **能否闭环**:能。复测方式:注入 429 桩后跑 `test_intent.py`;通过标准 = 5/5 断言命中预期语义,不再「默认 chat」。
|
|
|
+
|
|
|
+### 问题 5 · B-DX-1(第 9 轮,P2 部署)dx-bridge 两端点 404
|
|
|
+
|
|
|
+1. **问题描述**:`POST /api/health/data-sources/bridge/list` 与 `/sync-status` 线上恒 404,2 条鉴权契约用例长期 skip,SRS §3.3/§3.4 契约无法验证。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/dx-health-bridge-auth.spec.js`(TC-DX-U01/U02)。
|
|
|
+3. **最优修改方案**:按 TR-24 部署两端点(或明确下线并从 SRS 摘除);端点上线后 skip 分支自动转 401/403 断言(现有实现已支持)。
|
|
|
+4. **修改目的**:消除「用例存在但永不执行」的覆盖缺口。
|
|
|
+5. **能否闭环**:能。复测方式:`npx playwright test -c playwright.config.live.js --project=dx-bridge`;通过标准 = 2/2 通过(非 skip)。
|
|
|
+
|
|
|
+### 问题 6 · B-95(第 18 轮,P2 运维)`192.168.16.204:4090` 失联
|
|
|
+
|
|
|
+1. **问题描述**:204 节点 4090 端口连续 18 轮 `000`,无法承担任何派发任务;当前仅 189/251 可用。
|
|
|
+2. **测试 bug 点**:无代码缺陷,节点可用性。
|
|
|
+3. **最优修改方案**:运维恢复 204 服务或在节点清单中正式退役;测试侧节点清单固化为 189/251(已生效)。
|
|
|
+4. **修改目的**:保证「每节点单任务」并发能力与派发拓扑可预期。
|
|
|
+5. **能否闭环**:能。复测方式:`curl 192.168.16.204:4090` → 200;通过标准 = 节点重新出现在派发清单且实派成功。
|
|
|
+
|
|
|
+### 问题 7 · B-36(第 43 轮,P3 环境)根级黑盒 16 红
|
|
|
+
|
|
|
+1. **问题描述**:根级 `tests/` Jest 23 例中 16 例因 `ECONNREFUSED 127.0.0.1:9082` 失败——本地后端未常驻,用例属环境门控型。连续 43 轮零漂移。
|
|
|
+2. **测试 bug 点**:`tests/integration/*.spec.js`。
|
|
|
+3. **最优修改方案**:加 `beforeAll` 探活,未启动则 `describe.skip` 并打印原因(避免计入红例);或在闭环脚本中先拉起 9082。
|
|
|
+4. **修改目的**:让「环境未就绪」与「功能失败」在度量上可区分,G2 才有清零可能。
|
|
|
+5. **能否闭环**:能。复测方式:`cd tests && npx jest`;通过标准 = 9082 未启动时 16 例为 skip 而非 fail,启动后 23/23 全绿。
|
|
|
+
|
|
|
+### 问题 8 · B-138-3(第 5 轮,P3 效率)后端 3 个超慢类
|
|
|
+
|
|
|
+1. **问题描述**:`AuthControllerTest` / `ActivityControllerTest` / `ArticleControllerTest` 三慢类合计占全量大头(R145 实测 13.1min / 1:09h 为前值;R146 全量 44m 仍受此影响)。
|
|
|
+2. **测试 bug 点**:上述三类(Spring 上下文重复加载 + 无谓等待)。
|
|
|
+3. **最优修改方案**:合并为同一 `@SpringBootTest` 上下文(`@DirtiesContext` 复核)、去掉 `Thread.sleep`、外部 HTTP 调用加超时与桩。
|
|
|
+4. **修改目的**:缩短全量反馈周期。
|
|
|
+5. **能否闭环**:能。复测方式:跑这 3 类计时;通过标准 = 合计 < 180s 且用例数不减少。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 覆盖缺口清单(本轮)
|
|
|
+
|
|
|
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|---|---|---|---|---|---|
|
|
|
+| G-147-1 | 场景锚点 | 347 唯一 TC 中仅 **101(29.1%)** 在代码中可定位 | 大量 SRS 场景无自动化凭据,回归靠人工 | 按 SRS 池 795 文档用例逐条挂 `TC-*` 注释(e2e-live 优先) | P1 | 每轮提升 ≥3pp,达 95% 封板 |
|
|
|
+| G-147-2 | 数据库初始化 | `nutrition_age_dosage` 建表失败(B-145-1,第 3 轮挂账) | 新库部署功能缺失且无告警 | 增加「启动后表清单断言」用例(对比 schema.sql CREATE TABLE 清单与实库) | P0 | 该用例转绿即闭环 |
|
|
|
+| G-147-3 | 性能 | 未授权压测;仅有单例耗时 | 无法判断容量与劣化 | 授权后对 `/api/energy/overview` 等只读端点做 50 并发 60s 基线 | P2 | 需用户显式授权 execute 档 |
|
|
|
+| G-147-4 | 探索性测试 | 无 charter | 边界问题发现依赖偶发 | 每轮 30min 时间盒探索,记 charter + 缺陷 | P3 | 台账新增 charter 记录 |
|
|
|
+| G-147-5 | CI | 无 workflow | 门禁靠人工,易漏 | GitHub Actions:后端 `mvn -o -B test` + Jest ×3 + Playwright live | P1 | workflow 合入并跑绿 |
|
|
|
+| G-147-6 | 兼容性/无障碍 | 仅 Chromium | 小程序真机与低端机风险 | 增加 WebKit + 真机回归;axe 扫描关键页 | P3 | 双引擎全绿 + axe 0 critical |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 下轮前置(R148)
|
|
|
+
|
|
|
+1. **运维(P0)**:维持 251→LLM 上游链路与额度稳定,确保 langgraph 51/51 可复现(B-142-2 首轮清零,待第 2 轮复验后正式销号)
|
|
|
+2. **研发(P0)**:修 `schema.sql:5354` 无效索引(B-145-1,第 3 轮),并补「表清单一致性」启动断言
|
|
|
+3. **研发(P1)**:`/api/admin/` 纳入 `LOGIN_REQUIRED_PATHS` + admin 角色校验(B-142-1 第 6 轮)
|
|
|
+4. **研发(P1)**:`intent_classifier` 兜底改显式降级标记(B-134-4 第 10 轮)
|
|
|
+5. **部署(P2)**:dx 两端点上线(B-DX-1 第 9 轮);204 节点恢复或退役(B-95 第 18 轮)
|
|
|
+6. **测试(P1)**:根级黑盒加探活 skip(B-36),使 G2 可清零;SRS 池锚点脚本化(G-147-1)+ CI 接入(G-147-5)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 变更触发与推送(结果有变)
|
|
|
+
|
|
|
+- **判定**:langgraph 由 R146 的 2 红降至 **0 红(51/51 首次全绿)**、全量通过率 98.52%→**98.57%** → **测试结果实质变化**,触发用户规则「结果有变化时提交远程并通知研发」。
|
|
|
+- **执行**:`git add docs/tdd/** tests/e2e/_automation_reachability_result.json` → commit → `git push origin cfclub`(push 前先 fetch;远端已含 `7f4e61dee`/`c21934790`,rebase 或 fast-forward 对齐后再推)。
|
|
|
+- **定性**:36 红**零产品代码回归**(后端 17 红与 R146 逐类逐例一致;langgraph 0 红;根级 16 红为 9082 未常驻;前端 3 红为已登记预期 RED)。
|
|
|
+- **通知通道**:Agent Mail 仍未开通 → 以 `notice-2026-11-11-R147-研发通知.md` + `blockers.md` + 推送为通知载体。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. 教训沉淀
|
|
|
+
|
|
|
+- **langgraph 上游故障存在「自动恢复」窗口,红例清零≠修复落地——须复验确认后再销号**:R146 尚 2 红(ConnectError),R147 即 51/51 全绿、日志零故障——上游连接是易变因素;按既定纪律,B-142-2 不立即销号,待连续 2 轮全绿后再正式销号,避免把「环境抖动」误记为「修复完成」。
|
|
|
+- **51 例全绿轮仍保留 LG_EXIT=124 管道噪音**:`timeout 650 ... | tee | tail` 形态下,pytest 已完整打印 `51 passed` 汇总后 shell 侧才报 124——判据以 pytest 汇总行为准,EXIT 仅作参考(R139/143 同款)。
|
|
|
+- **零源码变更窗口 = 实跑与采信的合理边界**:后端 44m 全量在 R146 已实跑、窗口零 diff,本轮采信;浏览器/langgraph/Jest 均轻量(<9min)全部实跑——平衡证据新鲜度与轮次耗时。
|
|
|
+- **窗口基线比对要用 origin 而非 HEAD**:本轮 HEAD 停在 df4c2ab45 但 origin 已推进(bump + 研发汇报),fetch 后明确「窗口仅版本号 + docs」才能放心比较结论。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+*测试负责人:cfc-tester · 2026-11-11 第 147 轮闭环*
|