|
|
@@ -0,0 +1,337 @@
|
|
|
+# 测试负责人工作汇报(第 148 轮 · 2026-11-11 GMT+8)
|
|
|
+
|
|
|
+> 角色:cfc-tester(测试负责人)|执行档:**review(离线;内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)**
|
|
|
+> 基线 HEAD:`ffa97bf02`(跑前 = 跑后,零漂移)。窗口 `c9d6192a5..ffa97bf02` 共 8 文件变更,**排除 docs/ 与 cfc-web 构建元数据后为零**(`git diff --name-only` 实证)→ 后端本轮**强制实跑**(R147 为采信 R146)。
|
|
|
+> 节点分工:`189:4090` = 200 → **admin-desktop 实派 5/5**|`251:4096` = 200 → **langgraph pytest 实派 51 例**|`204:4090` = 000(B-95 第 19 轮)|本机 = fe/shop/health/dx + 三套 Jest + 根级黑盒
|
|
|
+> 结论:⚠️ **有条件通过** —— 后端 99.29%(17 红,与 R146/R145 逐类逐例一致 → **零回归第 8 次**);langgraph **50/51**(1 红为 LLM 上游 `ConnectError`,B-142-2 未完成第 2 轮绿 → **不销号**);浏览器 **28/28 + dx 2 skip**;全量 **3782 例 / 3727 过 = 98.55%**。
|
|
|
+> **变更触发**:langgraph 上轮 51/51 → 本轮 50/51(净 -1 过),全量 98.57% → 98.55% → **已 push + 通知研发**(见 §9)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 基本信息(测试负责人模板)
|
|
|
+
|
|
|
+| 项目 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 汇报人 | `cfc-tester`(测试负责人) |
|
|
|
+| 汇报周期 | 2026-11-11(第 148 轮,跑测窗口 16:40–17:36) |
|
|
|
+| 负责模块/单元 | cfc-backend(全量实跑) · cfc-frontend(Jest 实跑) · cfc-web(Jest 实跑) · cfc-langgraph(251 实派) · 浏览器 E2E(admin@189 / frontend·shop·health·dx@本机) · 根级黑盒(实跑) |
|
|
|
+| 执行档 | review(离线;未装依赖、未启停服务、未改生产代码) |
|
|
|
+
|
|
|
+### 0.1 测试用例建设与执行
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **本轮新增测试用例数** | `0` 个 | `docs/superpowers/specs` / `tests/test-cases` / 场景池在窗口 `c9d6192a5..ffa97bf02` **零变更**(`git diff --name-only` 空)→ G12 合规,无需因变更更新用例 |
|
|
|
+| **本轮验证执行测试数** | `3782` 个 | 后端 2946 + 前端 616 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
|
|
|
+| **用例通过率** | `98.55%`(3727/3782) | 剔 skip 口径 **99.02%**(3727/3764);红 37 = 后端 17 + 前端 3 + 根级 16 + langgraph 1 |
|
|
|
+| **新增覆盖资产** | `0` 项 | 无 SRS 变更、无新契约文件;本轮无资产入库 |
|
|
|
+
|
|
|
+### 0.2 会话与任务分发
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **分派任务数** | `2` 个 | ① 189:admin-desktop E2E(1.3m,5/5,`EXIT=0`);② 251:langgraph pytest(292.22s,50/51);其余本机直跑 |
|
|
|
+| **恢复智能体会话数** | `0` 个 | 无中断/重建 |
|
|
|
+| **当前在用会话数** | `3` 个 | 本机(done)/ 189 = shell(done)/ 251 = shell(done) |
|
|
|
+
|
|
|
+### 0.2b 各会话当前工作状态
|
|
|
+
|
|
|
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 耗时 | 工作目录 | 备注 |
|
|
|
+|----------|---------|----------|----------|------|----------|------|
|
|
|
+| 本机 | localhost | done | 浏览器 fe/shop/health/dx + Jest×3 + 根级 + 后端全量 | mvn 51:57 | `d:\cfc` | fe 6/6 (56.6s)、shop 4/4 (13.5s)、health 13/13 (8.5s,首跑 1 例 502 复跑转绿) |
|
|
|
+| 189:4090 | `sh_1c9c668a4…` | done | admin-desktop E2E | 81s | `C:\code\cfc\tests` | **5/5(EXIT=0)**;spec blob `4703d73fb` = 本机 |
|
|
|
+| 251:4096 | shell 直连(`setsid nohup` + 落盘) | done | langgraph pytest | 292.22s | `/sc-data/cfc/cfc-langgraph` | **50/51**;节点 HEAD `ffa97bf02` = 本机 |
|
|
|
+| 204:4090 | — | unknown(000) | 失联 | — | — | B-95 第 19 轮 |
|
|
|
+
|
|
|
+### 0.3 问题处置
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **新测试发现问题数** | `1` 个 | **B-148-1(P2 运维)**:health 套件首跑 `TC-H-U01` 收到 **502**(复跑 13/13 全绿、直连 2/2 = 401)→ 网关/上游瞬抖,非鉴权缺陷;记观察项 |
|
|
|
+| **已解决测试相关问题数** | `0` 个 | 本轮无测试侧自闭环(零 SRS 变更、零装置类红) |
|
|
|
+| **待解决测试相关问题数** | `9` 类 | 后端 17 存量红 · 前端 3 预期 RED · 根级 16 环境红 · langgraph 1 环境红(ConnectError)· dx 2 端点 404(B-DX-1 第 10 轮)· 204 失联(B-95)· admin 鉴权门缺失(B-142-1 第 7 轮)· nutrition_age_dosage 建表失败(B-145-1 第 4 轮)· B-134-4 兜底伪装(本轮未触发) |
|
|
|
+
|
|
|
+### 0.4 本轮 git 提交与推送证据
|
|
|
+
|
|
|
+| 提交 sha | 关联键 | 阶段 | 触及文件 | 目标分支 | 已推送远端 | 备注 |
|
|
|
+|----------|--------|------|----------|----------|------------|------|
|
|
|
+| 见 §9 | R148 报告 + 通知 + 台账追加 | 测试闭环 | `docs/tdd/**` + `tests/e2e/_automation_reachability_result.json` | `cfclub` | 是 | 结果变化触发(langgraph -1 过、全量 98.57% → 98.55%) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 项目画像(本轮复核)
|
|
|
+
|
|
|
+| 维度 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 业务定位 | 家庭教育「浠艾福(XAF)」:家长端 / 孩子端 / 成长规划师端三视角 + 五维能量(身/心/智/行/富)+ 健康报告解析 + 商城 + 管理后台 |
|
|
|
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus(Java 8,`cfc-backend`,9082)· uni-app 小程序 Vue2(`cfc-frontend`)· Vue2 + Element UI(`cfc-web`,8082)· Python FastAPI + LangGraph(`cfc-langgraph`,9000)· 独立商城(`dan/danshop`,8888) |
|
|
|
+| 模块结构 | 后端 366 控制器 / 347 测试类 · 前端 40 套件 616 例 · 管理端 17 套件 116 例 · langgraph 51 例 · `tests/` 浏览器 30 + 根级黑盒 23 |
|
|
|
+| 关键路径 | 微信登录/建档 → 家庭与成员 → 五维能量 → 健康报告上传与解析 → 健康方案 → 任务编排 → 测评订单 → 支付/会员 → 管理端审核与配置 |
|
|
|
+| 测试现状 | 后端 347 类全量可跑(`-o -B clean test` 51:57);三套 Jest 全量可跑;浏览器 live 30 例;CI(`.gitlab-ci.yml`)存在但**后端全量为非阻塞**(阻断作业用 `-Dtest=!${OBSERVED}` 排除红类)→ G11 仍不达标 |
|
|
|
+| 质量目标 | 全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
|
|
|
+| 风险点 | ① 17 存量红长期挂账(EnergySystem 6 全 500 / 契约 3 / 支付会员 3 / 编排 2 / 平台费截断 1 / 分佣冷静期 1 / 微信登录 2);② 17 红中「产品类」已跨 8 轮零漂移 → 缺研发修复排期;③ `/api/admin/**` 鉴权门缺失 7 轮未修 |
|
|
|
+| 历史审查记录 | 上次 R147(16:05,HEAD `df4c2ab45`→`c21934790`):**有条件通过** 98.57%(3782/3728),langgraph **首次全绿 51/51**、后端采信 R146 99.29%。**本次为该对象第 148 次审查,非首次**;R147 遗留待复验项 = B-142-2(langgraph 51/51 疑似销号,需第 2 轮绿)。**本轮复验结果:50/51(1 红 ConnectError)→ 未达连续 2 轮绿 → 不销号**。历史结论仅作对照,本轮全部指标重新取证。 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 20 类测试覆盖矩阵(三态 + 证据)
|
|
|
+
|
|
|
+> 「未发现」仅表示本轮扫描未命中,「待核实」表示证据不足或扫描受限;不得读作「项目没做」。
|
|
|
+
|
|
|
+| # | 测试类型 | 层次 | 判定 | 证据 |
|
|
|
+|---|----------|------|------|------|
|
|
|
+| 1 | 单元测试 | 功能层次 | 已发现 | `cfc-backend/src/test/java/**/unit` + service/controller 单测(347 类 / 2946 例实跑);前端 `__tests__/pages/**` 601 过 |
|
|
|
+| 2 | 组件测试 | 功能层次 | 已发现 | `cfc-frontend/__tests__/components/**`、`cfc-web/src/__tests__/views/**`(116 过);3 例预期 RED(健康方案摘要 / 收货人编辑 / 成长日分组) |
|
|
|
+| 3 | 集成测试 | 功能层次 | 已发现 | `integration/**`:`EnergySystemFlowTest` 6、`GuideModuleIntegrationTest` 1(E)、`OrchestrationIntegrationTest` 1 |
|
|
|
+| 4 | 契约测试 | 功能层次 | 已发现 | `DimensionRegistryMapContractTest` 3、`UserServiceWechatLoginContractTest` 1、`TeamProfitCronContractTest` 1、`tests/test-cases/*.md` 347 唯一 TC |
|
|
|
+| 5 | 接口 API 测试 | 功能层次 | 已发现 | `tests/playwright.config.api*.js` + `tests/e2e/api/**`(含 generated);线上 POST 鉴权探针 5/5 = 401 |
|
|
|
+| 6 | 冒烟测试 | 功能保障 | 已发现 | `playwright.config.smoke.js`、`tests/e2e-live/frontend-live.spec.js` TC-F-U01(首页可渲染)每轮执行 |
|
|
|
+| 7 | 回归测试 | 功能保障 | 已发现 | 本轮后端全量 347 类实跑 + 三套 Jest + 浏览器 30 例 = 全量回归;与 R146/R145 逐类逐例零漂移(第 8 次) |
|
|
|
+| 8 | 验收测试(UAT) | 功能保障 | 待核实 | `tests/test-cases/{parent,child,teacher,admin,vendor,guest,butler}.md` 有验收口径,但**无 UAT 执行记录/签署**;线上 admin 5/5 属技术验收非业务 UAT |
|
|
|
+| 9 | BDD / 场景规格 | 功能保障 | 待核实 | 场景池 215 条、被 TC 覆盖 155(72.1%)、spec 字面命中 33(15.3%);**无 Gherkin feature 文件**(`grep -c "Feature:"` 为空) |
|
|
|
+| 10 | 探索性测试 | 功能保障 | 未发现 | 无探索性会话章程/记录(仓库内零 charter 文档);本自动化未做人工探索 |
|
|
|
+| 11 | 性能测试 | 非功能 | 未发现 | 无 k6/JMeter/Gatling 脚本;仅有 `SLOW_REQUEST` 日志(本轮 14.99s chat)作被动感知;压测需联网未授权 |
|
|
|
+| 12 | 可靠性测试 | 非功能 | 待核实 | 有熔断/兜底代码(`AiGateway`)与 `OrchestrationPollingJob` 轮询,但**无故障注入/长稳测试**;本轮 langgraph `ConnectError` → 500 暴露兜底不足(1 例) |
|
|
|
+| 13 | 安全测试 | 非功能 | 已发现(含缺陷) | 线上匿名鉴权探针 5/5 = 401(mind/energy/health-plan/huawei/xiaomi);**`/api/admin/families/overview` 匿名 200 + code:400(B-142-1 第 7 轮)**;`SECURITY_REVIEW_2026-11.md` 存在;SAST 无流水线集成 |
|
|
|
+| 14 | 兼容性测试 | 非功能 | 未发现 | 无多浏览器/多设备矩阵(`playwright.config.live.js` 仅 chromium 单通道:admin-desktop / frontend-mobile 两种视口) |
|
|
|
+| 15 | 可用性测试 | 非功能 | 未发现 | 无真实用户可用性评估记录 |
|
|
|
+| 16 | 无障碍测试 | 非功能 | 未发现 | 无 axe-core / WCAG 规则集;浏览器用例未断言 aria 属性 |
|
|
|
+| 17 | 测试覆盖率 | 度量 | 已发现(含缺口) | 前端 `test:coverage` 可跑(管理端已产出 10.09/6.12/7.50/9.97);**后端 `pom.xml` 无 jacoco / pitest(`grep -c` = 0)** → 后端行覆盖无凭据 |
|
|
|
+| 18 | 变异测试 | 度量 | 未发现 | 无 PIT / Stryker 配置与报告 |
|
|
|
+| 19 | 质量指标与缺陷度量 | 度量 | 已发现 | `docs/tdd/test/blockers.md`(B-* 台账 721 行)、`automation-status.md`、`test_attr.py` 三层归因(装置/产品/数据) |
|
|
|
+| 20 | QA 流程与 CI/CD 门禁 | 流程 | 部分已发现 | `.gitlab-ci.yml` 存在(build/test/observed 多作业),但**后端全量为非阻断**、langgraph / Playwright 仅在 observed 作业 → G11 ❌ |
|
|
|
+
|
|
|
+**矩阵小结**:已发现 11 类、待核实 3 类(UAT / BDD / 可靠性)、未发现 6 类(探索性 / 性能 / 兼容性 / 可用性 / 无障碍 / 变异)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 测试方案(本轮执行口径)
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|----|------|
|
|
|
+| 目标 | 全量用例可跑、红例可归因、SRS 零变更即零新增、双节点派发可用 |
|
|
|
+| 范围 | 后端全量(强制实跑)· 三套 Jest · 浏览器 live 30 · langgraph 51 · 根级 23 · 线上鉴权 5 探针 · 路由/根路径 3 探针 |
|
|
|
+| 执行档 | review(离线白名单);压测/漏洞库扫描需联网 → 未授权未执行 |
|
|
|
+| 排除项 | ① `tests/qna`(B-141-1:`from src.qna import` 缺模块,收集期中断);② `tests/test_chat.py`(口径与历轮一致,避免 LLM 抖动污染计数);③ dx-bridge 2 例(端点 404 → 设计为 skip) |
|
|
|
+| 节点约束 | 每节点单任务:189 仅 admin-desktop;251 仅 langgraph pytest;本机承担其余 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 执行结果
|
|
|
+
|
|
|
+### 4.1 后端全量(实跑 · `mvn -o -B clean test`,JDK 1.8.0_25 + Maven 3.6.1)
|
|
|
+
|
|
|
+| 指标 | 数值 |
|
|
|
+|------|------|
|
|
|
+| 耗时 | **51:57**(主源 2121 编译 + 353 测试源 0 错) |
|
|
|
+| 类 / 例 | **347 类 / 2946 例** |
|
|
|
+| 通过 | **2925** |
|
|
|
+| 失败 / 错误 / 跳过 | 16 F + 1 E + 4 S |
|
|
|
+| 通过率 | **99.29%**(剔 skip 99.42%) |
|
|
|
+| 产物完整性 | 347/347 XML 全产出、`*.dump` = 0、`target/classes` 2330 |
|
|
|
+| 恒等式 | `@Test 2935 − @Disabled 4 + 参数化净增 15 = 2946` ✅ 误差 0 |
|
|
|
+| 与 R146/R145 对比 | 类/例/红完全一致,**红类集合差集为空 → 零漂移第 8 次** |
|
|
|
+
|
|
|
+**17 红三层归因(10 类)**
|
|
|
+
|
|
|
+| 桶 | 数量 | 明细 |
|
|
|
+|----|------|------|
|
|
|
+| B 产品 | 14 | EnergySystem 6(5×500 + 1×5001)· Orchestration 2 · UserServiceWechatLogin 2 · MembershipPay 1 · PaymentORD 1 · TeamProfitCron 1 |
|
|
|
+| 契约待裁决 | 3 | DimensionRegistryMapContractTest 3(P-9 第 10 轮) |
|
|
|
+| C 数据 | 1 | GuideModuleIntegrationTest(`MysqlDataTruncation` 平台费超列宽) |
|
|
|
+
|
|
|
+### 4.2 其余套件
|
|
|
+
|
|
|
+| 套件 | 结果 | 备注 |
|
|
|
+|------|------|------|
|
|
|
+| cfc-web(Jest) | **116/116**(17 套件,26.7s) | 零漂移 |
|
|
|
+| cfc-frontend(Jest) | **616:601 过 / 3 红 / 12 跳**(27.1s) | 3 红全为 S-cfc-30/52/53 契约(预期 RED,组件未交付) |
|
|
|
+| 根级黑盒(tests/jest.config.js) | **23:7 过 / 16 红**(8.7s) | 16 红全 `ECONNREFUSED 127.0.0.1:9082`(本机后端未起)→ B-36 第 44 轮 |
|
|
|
+| langgraph@251(pytest) | **51:50 过 / 1 红**(292.22s) | 1 红:`test_auto_tag_short_content` → `chat` 返回 500,根因 `ConnectError('All connection attempts failed')` |
|
|
|
+| 浏览器 live@本机 | fe **6/6**(56.6s) · shop **4/4**(13.5s) · health **13/13**(8.5s,复跑) | health 首跑 1 例 502(B-148-1) |
|
|
|
+| 浏览器 live@189 | admin **5/5**(81s,`EXIT=0`) | spec blob `4703d73fb` = 本机 → 结论可比 |
|
|
|
+| dx-bridge | 2 skip | 端点 404(B-DX-1 第 10 轮) |
|
|
|
+
|
|
|
+### 4.3 线上探针
|
|
|
+
|
|
|
+| 探针 | 结果 |
|
|
|
+|------|------|
|
|
|
+| 匿名 `POST /api/mind/fortune` | 401 |
|
|
|
+| 匿名 `POST /api/energy/overview` | 401 |
|
|
|
+| 匿名 `POST /api/health/plan/list` | 401 |
|
|
|
+| 匿名 `POST /api/huawei-health/auth-url` | 401(2/2;浏览器首跑曾 502) |
|
|
|
+| 匿名 `POST /api/xiaomi-health/auth-url` | 401 |
|
|
|
+| 匿名 `POST /api/admin/families/overview` | **200 + `{"code":400,"message":"请求参数格式错误"}`** → B-142-1 |
|
|
|
+| `/admin` `/frontend` `/` | 302 / 302 / 404 |
|
|
|
+| `251:4096` / `189:4090` / `204:4090` | 200 / 200 / **000** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 覆盖缺口清单
|
|
|
+
|
|
|
+| 编号 | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|------|----------|------|------|--------------|--------|----------|
|
|
|
+| G-148-1 | 场景锚点(G9) | 唯一 TC **347**,脚本口径锚点 **104(30.0%)**;严格口径(仅测试资产、排除 generated)**65(18.7%)** | SRS 场景无自动化凭据,回归靠人工 | 按 `tests/test-cases/*.md` 逐条在 e2e-live / 契约测试内挂 `TC-*` 注释,优先 `parent.md`/`admin.md` | P1 | 每轮提升 ≥3pp,达 95% 封板 |
|
|
|
+| G-148-2 | 场景-用例映射 | 场景 215,被 TC 覆盖 155(72.1%);spec 字面 33(15.3%) | 60 条场景无用例,需求变更易漏测 | 先补 07-five-dimension / 08-butler 两域剩余场景的 TC 条目(各 17 / 10 条) | P1 | 映射率 ≥90% |
|
|
|
+| G-148-3 | 异常流覆盖 | TC 837 条,异常流 498(59.5%) | 异常分支漏测 | 对支付/会员/健康解析三条链路补异常流用例(超时、重复回调、非法载荷) | P2 | 异常流占比 ≥70% |
|
|
|
+| G-148-4 | 后端覆盖率凭据 | `pom.xml` 无 jacoco / pitest(grep = 0) | 无行/分支覆盖数据,无法判「测了但没断言」 | pom 增 jacoco 插件(离线可用),生成 `target/site/jacoco` | P1 | 每轮产出覆盖率报告并入库 |
|
|
|
+| G-148-5 | 变异测试 | 无 PIT / Stryker | 断言强度未知(`assertNotNull` 类弱断言可能放过缺陷) | 对 `service/**` 抽样 3 个包做 PIT(离线 mvn 插件) | P2 | 变异杀灭率 ≥60% |
|
|
|
+| G-148-6 | 性能/可靠性 | 无压测脚本、无故障注入 | 上游故障时 `chat` 直返 500(本轮 1 例实证) | ① 对 `/api/v1/chat` 做上游断开注入,断言降级响应而非 500;② 记录 P95 基线 | P1 | 故障注入用例 ≥6 条并全绿 |
|
|
|
+| G-148-7 | 兼容性/无障碍 | 仅 chromium 单通道、无 axe | 多设备/读屏不可用风险 | 增 `--project=webkit/mobile-safari` 与 axe-core 断言(需联网装浏览器 → 未授权) | P2 | 兼容矩阵 ≥3 引擎 |
|
|
|
+| G-148-8 | CI 全量门禁(G11) | `.gitlab-ci.yml` 后端全量为非阻断(`-Dtest=!${OBSERVED}`) | 红例不阻断合并 → 长期挂账 17 红 | 红例清零后把 `backend-observed-junit` 转 blocking;先加「新增红例即失败」基线条 | P0 | CI 阻断全量后端 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 域结论表
|
|
|
+
|
|
|
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
|
|
|
+|----------|----------|------|----------|
|
|
|
+| 单元·组件级 | 苏雅 | ⚠️ 有条件通过 | 后端 2925/2946(99.29%)、前端 601/616;3 例预期 RED;后端无 jacoco/pitest |
|
|
|
+| 集成·接口级 | 柯砚 | ❌ 不通过 | 集成红 8(EnergySystem 6 + Orchestration 2)、契约红 3、数据截断 1;线上鉴权 5/5 = 401 但 `/api/admin/**` 缺门 |
|
|
|
+| 系统·验收级 | 白樾 | ⚠️ 有条件通过 | 浏览器 28/28 + 2 skip;UAT 无签署记录;dx-bridge 2 端点 404 |
|
|
|
+| 测试保障级 | 闻朔 | ⚠️ 有条件通过 | 冒烟/回归齐备(每轮全量);探索性测试无章程;B-36 根级 16 红环境型 |
|
|
|
+| 性能·可靠性 | 骆骋 | ❌ 未实测(降级) | 无压测脚本;langgraph `ConnectError` → 500 暴露无降级;压测需联网未授权 |
|
|
|
+| 安全 | 关屿 | ⚠️ 有条件通过 | 5/5 探针 401;**B-142-1 admin 鉴权门缺失第 7 轮**;SAST 未入流水线 |
|
|
|
+| 兼容·体验 | 阮清 | ⚠️ 有条件通过 | 双视口(desktop/mobile)可跑;无多引擎/无障碍断言 |
|
|
|
+| 流程·度量·代码 | 何序 | ⚠️ 有条件通过 | 台账/归因齐备;CI 后端全量非阻断;7 轮未修项仍挂账 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 五要素问题清单
|
|
|
+
|
|
|
+### 问题 1|`/api/admin/**` 鉴权门缺失(B-142-1,第 7 轮)
|
|
|
+1. **问题描述**:匿名 `POST /api/admin/families/overview` 返回 HTTP 200 + `code:400`,而同窗口对照组 `/api/energy/overview`、`/api/health/plan/list`、`/api/mind/fortune` 均 401。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java`(放行清单未覆盖 `/api/admin/families/**`);用例 `tests/e2e-live/health-contract.spec.js:41` 同类契约未覆盖 admin 域。
|
|
|
+3. **最优修改方案**:把 `/api/admin/**` 纳入拦截器保护(仅保留登录/验证码等 8 个公开路径),并在 `tests/e2e-live/` 增 `admin-auth-contract.spec.js` 断言 401。
|
|
|
+4. **修改目的**:消除越权面,保证「未鉴权一律 401」全局不变式。
|
|
|
+5. **能否闭环**:能。复测:匿名 POST 该端点 → 401;回归跑 admin-desktop 5 例 + 契约 1 例全绿。
|
|
|
+
|
|
|
+### 问题 2|`nutrition_age_dosage` 建表恒失败(B-145-1,第 4 轮)
|
|
|
+1. **问题描述**:`schema.sql:5343` 建表体含 `INDEX idx_product (product_id)`,但该表无 `product_id` 列 → DDL 恒失败;`DatabaseInitializer` catch 后仍打印「数据表检查完成」,表从未创建。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5354`;`DatabaseInitializer.runMigrations()` 缺失该表存在性校验。
|
|
|
+3. **最优修改方案**:删除无效索引(或补 `product_id BIGINT` 列 + 外键语义),并在 `DatabaseInitializer` 增「建表失败即抛错」严格模式。
|
|
|
+4. **修改目的**:保证 schema 与运行库一致,避免功能静默不可用。
|
|
|
+5. **能否闭环**:能。复测:启动日志零 `SQLSyntaxErrorException`;`SHOW TABLES LIKE 'nutrition_age_dosage'` 命中;增 1 条 DDL 自检用例。
|
|
|
+
|
|
|
+### 问题 3|langgraph LLM 上游不可达导致 500(B-142-2,第 7 轮)
|
|
|
+1. **问题描述**:`tests/test_auto_tag.py::test_auto_tag_short_content` 断言 `chat` 200,实得 500;日志 `ConnectError('All connection attempts failed')`、`加载提示词 intent_classifier 失败`、`SLOW_REQUEST 14.99s`。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py:93`(断言硬编码 200,无降级分支);`app/middleware.py:113` 直接把上游异常抛成 500。
|
|
|
+3. **最优修改方案**:① 服务侧对 LLM 上游故障返回 503 + 结构化 `code`,并短时熔断;② 用例侧对「环境不可用」与「逻辑错误」分流(`pytest.mark.env`),环境红不计入逻辑门禁。
|
|
|
+4. **修改目的**:把「上游抖动」与「代码回归」解耦,避免每轮重复误判。
|
|
|
+5. **能否闭环**:能。复测:断开上游 → 断言 503(非 500);上游恢复 → 51/51 全绿连续 2 轮后销号。
|
|
|
+
|
|
|
+### 问题 4|`intent_classifier` 兜底把上游故障伪装成分类错误(B-134-4,第 11 轮)
|
|
|
+1. **问题描述**:`intent_classifier` 捕获异常后默认 `chat`,429/401 被伪装为「分类正确」;本轮上游 `ConnectError` 同样被吞(仅 middleware 记录)。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/app/intent_classifier.py:62`(`except → return "chat"` 无告警上抛)。
|
|
|
+3. **最优修改方案**:异常路径返回 `degraded=True` 并写结构化日志(含状态码),用例断言 `degraded` 而非仅断 intent。
|
|
|
+4. **修改目的**:让「降级」可见,避免红例被静默转绿。
|
|
|
+5. **能否闭环**:能。复测:注入 429 → 响应含 `degraded:true` 且日志带 429;正常路径 intent 5/5 绿。
|
|
|
+
|
|
|
+### 问题 5|EnergySystem 集成 6 红(全 500)
|
|
|
+1. **问题描述**:`EnergySystemFlowTest` 6 例中 5 例期望 200 实得 500,1 例期望 500 实得业务码 5001。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java`(overview/logs/exchange/task 四链路)。
|
|
|
+3. **最优修改方案**:先取 surefire 堆栈定位根因(跨 8 轮未变,疑 DB 初始化或能量账户缺失),再决定修产品或修夹具;若为数据前置缺失,用例侧补 `@Sql` 造数。
|
|
|
+4. **修改目的**:恢复五维能量核心链路可验证性(当前等于该链路零有效覆盖)。
|
|
|
+5. **能否闭环**:能。复测:该类 6/6 绿,且全量红数 17 → 11。
|
|
|
+
|
|
|
+### 问题 6|DimensionRegistryMap 契约 3 红(P-9 第 10 轮,待裁决)
|
|
|
+1. **问题描述**:`map_emptyLegacy_returnsNullData` 期望 `data=null` 实得 `""`;`map_missingLegacy_returnsBadRequest` 期望 400 实得 200;`map_unknownLegacy_returnsNullData` 期望 null 实得原值透传。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java`(3 例)。
|
|
|
+3. **最优修改方案**:由产品/研发就「缺参是否 400、未知 legacy 是否透传」拍板,按裁决要么改实现要么改契约断言(P-9 需给出书面结论)。
|
|
|
+4. **修改目的**:消除「契约未定 → 测试常红」的噪音,恢复红例可归因性。
|
|
|
+5. **能否闭环**:能。复测:该 3 例与裁决一致;红类数 10 → 9。
|
|
|
+
|
|
|
+### 问题 7|平台费字段截断(`MysqlDataTruncation`)
|
|
|
+1. **问题描述**:`GuideModuleIntegrationTest.testGuidePackageCreationFlow:63` 抛 `Data truncation: Out of range value`(平台费超列宽)。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java:63`;对应列定义在 `schema.sql` 分佣/平台费表。
|
|
|
+3. **最优修改方案**:列宽 `DECIMAL(10,2)` → `DECIMAL(18,4)`(或按金额上限评估),并同步 `schema.sql` 与迁移脚本。
|
|
|
+4. **修改目的**:金额计算不因列宽静默失败(财务类高风险)。
|
|
|
+5. **能否闭环**:能。复测:该类 1/1 绿;金额边界用例(1e8 级)新增 2 条。
|
|
|
+
|
|
|
+### 问题 8|前端 3 例预期 RED(S-cfc-30/52/53 契约)
|
|
|
+1. **问题描述**:`health-plan-summary.vue`、`consignee-edit.vue`、`growthHistory.dayGroupView` 契约测试引用的组件/方法未交付,3 例常红。
|
|
|
+2. **测试 bug 点**:`cfc-frontend/__tests__/pages/{health-plan,growth-main}/**`、`signature.consignee.test.js:172`。
|
|
|
+3. **最优修改方案**:研发按 S-cfc-30/52/53 交付组件;测试侧把 3 例标记 `test.todo` 或 `describe.skip`(带契约 ID),交付后解除。
|
|
|
+4. **修改目的**:让「预期 RED」与「真回归」在报表上可区分,避免污染 G3。
|
|
|
+5. **能否闭环**:能。复测:组件交付后 3 例转绿,前端 616/616。
|
|
|
+
|
|
|
+### 问题 9|根级黑盒 16 红(环境型,B-36 第 44 轮)
|
|
|
+1. **问题描述**:`tests/integration/*.spec.js` 16 例全 `ECONNREFUSED 127.0.0.1:9082`(本机未起后端)。
|
|
|
+2. **测试 bug 点**:`tests/jest.config.js` 的 baseURL 固定本机 9082,无 skip 条件或外部实例回退。
|
|
|
+3. **最优修改方案**:增「后端探活 → 不可达则 `describe.skip` 并输出 skip 原因」,或指向内网实例(`cfc.iwintrue.com`)。
|
|
|
+4. **修改目的**:避免 16 条环境红每轮刷屏,掩盖真实回归信号。
|
|
|
+5. **能否闭环**:能。复测:后端未起 → 输出 16 skip(带原因);起后端 → 16 通过。
|
|
|
+
|
|
|
+### 问题 10|网关瞬抖致健康契约首跑 1 红(B-148-1 新)
|
|
|
+1. **问题描述**:`TC-H-U01 POST /api/huawei-health/auth-url` 首跑收到 **502**(断言只允许 401/403);同一时刻直连 2/2 = 401,套件复跑 13/13 绿。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/health-contract.spec.js:51`(未区分「网关 5xx」与「鉴权放行」)。
|
|
|
+3. **最优修改方案**:断言前对 502/503 做 1 次重试(≤2 次,退避 1s),仍 5xx 则 `test.fixme` 并标注「网关不可用」;或断言集合加「5xx 视为环境不可用 → skip 并按环境红计数」。
|
|
|
+4. **修改目的**:区分部署/网关故障与鉴权缺陷,避免误报安全回归。
|
|
|
+5. **能否闭环**:能。复测:注入 502 → skip 且报告标注环境;正常 → 13/13 绿。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 门禁结论
|
|
|
+
|
|
|
+| 门禁 | 指标 | 阈值 | 实测 | 判定 |
|
|
|
+|------|------|------|------|------|
|
|
|
+| G1 | 全量通过率 | ≥98% | **98.55%**(3727/3782) | ✅ |
|
|
|
+| G2 | 零未归因红 | 0 | 37 红(已三层归因,但未清零) | ❌ |
|
|
|
+| G3 | 前端预期 RED | ≤3 | 3(S-cfc-30/52/53) | ⚠️ |
|
|
|
+| G4 | 管理端全绿 | 116/116 | 116/116 | ✅ |
|
|
|
+| G5 | 编译与产物完整性 | 0 错 / 全 XML | 2121+353 源 0 错;347/347 XML;dump 0 | ✅ |
|
|
|
+| G6 | 浏览器 live | 28/28 | 28/28 + 2 skip | ✅ |
|
|
|
+| G7 | langgraph | 0 红 | 50/51(1 红 ConnectError) | ❌ |
|
|
|
+| G8 | 线上鉴权 | 5/5 = 401 | 5/5 = 401(admin 域另计) | ✅ |
|
|
|
+| G9 | SRS 场景锚点 | ≥95% | 30.0%(脚本口径 104/347)/ 18.7%(严格口径) | ❌ |
|
|
|
+| G10 | 双节点派发 | 均可用 | 189 ✅ 5/5(81s)· 251 ✅ 51 例(292s) | ✅ |
|
|
|
+| G11 | CI 全量门禁 | 阻断 | 后端全量为 observed 非阻断 | ❌ |
|
|
|
+| G12 | SRS 变更合规 | 变更即更新 | 窗口零变更 → 零新增用例 | ✅ |
|
|
|
+
|
|
|
+**最终结论:⚠️ 有条件通过**
|
|
|
+
|
|
|
+- 通过依据:G1 98.55% ≥ 98%、G4/G5/G6/G8/G10/G12 达标;后端与 R146/R145 **逐类逐例零漂移(第 8 次)**,说明本轮无新增回归。
|
|
|
+- 保留条件:① G2 37 红须清零(其中 17 后端红已挂账 8 轮,需研发排期);② G7 langgraph 1 红须连续 2 轮绿后方可销号;③ G9 锚点、G11 CI 门禁属结构性缺口,需按 §5 逐项闭环。
|
|
|
+- **不放行结论**:G2/G9/G11 三项未达阈值,故不判「通过」;但因无新增回归、核心链路(登录/家庭/能量/健康/商城/后台)均可用,判「有条件通过」,可否上线由用户与研发团队决定。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 变更、提交与通知
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|----|------|
|
|
|
+| 变更判定 | **有变化**:langgraph 51/51 → **50/51**(-1 过,ConnectError 环境红);全量 98.57% → **98.55%**;新增 B-148-1;其余套件零漂移 |
|
|
|
+| 提交范围 | `docs/tdd/orchestration/report-test-2026-11-11-R148.md`、`docs/tdd/automation-run-2026-11-11-R148.md`、`docs/tdd/notice-2026-11-11-R148-研发通知.md`、`docs/tdd/test/blockers.md`(追加 R148 段)、`docs/tdd/test/automation-status.md`(附录 R148) |
|
|
|
+| 推送分支 | `origin/cfclub`(`--autostash` rebase 后推,核验 `git branch -r --contains`) |
|
|
|
+| 研发通知 | Agent Mail `GetMe` → 仍 `not_bound`(连接器 connected 但邮箱未开通,按纪律不重试)→ 以 `notice-2026-11-11-R148-研发通知.md` + `blockers.md` + 推送为通知载体 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录 A:本轮命令(可复现)
|
|
|
+
|
|
|
+```bash
|
|
|
+# 环境探针
|
|
|
+/d/jdk1.8.0_25/bin/java -version && /d/maven/apache-maven-3.6.1/bin/mvn -v # 1.8.0_25 / 3.6.1
|
|
|
+# 后端全量
|
|
|
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test # 51:57
|
|
|
+# 三套 Jest
|
|
|
+cd cfc-web && npx jest --silent # 116/116
|
|
|
+cd cfc-frontend && npx jest --silent # 616 = 601/3/12
|
|
|
+cd tests && npx jest -c jest.config.js --silent # 23 = 7/16
|
|
|
+# 浏览器(必须在 tests/ 内跑,否则 @playwright/test 双版本报 test.describe() called here)
|
|
|
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --reporter=list # 6/6
|
|
|
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --reporter=list # 4/4
|
|
|
+cd tests && npx playwright test -c playwright.config.health.js --reporter=list # 13/13
|
|
|
+node _r146_189.cjs admin # 189 admin-desktop 实派 5/5(81s,EXIT=0)
|
|
|
+node _r148_lg.cjs kick # 251 langgraph pytest 实派 51 例(292.22s,50 过)
|
|
|
+# 度量
|
|
|
+python docs/tdd/tools/test_report_metrics.py --repo-root . --scene --out-json _r148/metrics.json
|
|
|
+```
|
|
|
+
|
|
|
+## 附录 B:口径声明
|
|
|
+
|
|
|
+- 后端红数口径:`Tests run: 2946, Failures: 16, Errors: 1, Skipped: 4`(surefire 汇总,与 347 XML 逐类核对一致)。
|
|
|
+- 后端基线纯度:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleTagsContractTest.java` 为**未跟踪文件**(仍被编译执行)→ 本轮「347 类」含该文件,HEAD 纯度为 **346 类 / 2935 例**;历轮同口径,未影响可比性。
|
|
|
+- langgraph 口径:`--ignore=tests/qna --ignore=tests/test_chat.py`(B-141-1 阻断 + 历轮排除项),51 例。
|
|
|
+- 浏览器口径:28 过 + dx 2 skip = 30。
|
|
|
+- G9 两套口径并存(脚本 30.0% / 严格 18.7%),差异根因见 B-124;本轮判定取较宽的脚本口径仍远低于阈值。
|