|
|
@@ -0,0 +1,276 @@
|
|
|
+# 测试负责人工作汇报(R167 轮)
|
|
|
+
|
|
|
+> 本汇报按《测试负责人工作汇报模板》填写。R167 为**强制实跑轮**:上一轮(R166,08:35)受沙箱限制仅跑两端 Jest、其余维度引用 R165 权威值;本轮补齐后端全量(mvn)、双节点浏览器 E2E(189 实派 + 本机)、langgraph@251 实派、根级黑盒与线上鉴权探针,**所有维度均为本轮新实测**,不再引用历史值。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 基本信息
|
|
|
+
|
|
|
+| 项目 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 汇报人 | 测试负责人(自动化测试闭环任务) |
|
|
|
+| 汇报周期 | 2026年11月12日 08:38 ~ 09:5x(第 167 轮) |
|
|
|
+| 基线 | `cfclub @ 8e4d17e83`(跑前 = origin);跑测窗口内远端前进至 `fef17fd44`(仅 docs + cfc-web 构建元数据,**零功能源码**) |
|
|
|
+| 负责模块/单元 | 全站回归:cfc-backend JUnit 全量 + 管理端 admin + 小程序 H5 frontend(浏览器 E2E:189→admin、本机→admin/frontend/shop/health/dx)+ cfc-langgraph@251 + 前端/Web Jest + 根级黑盒 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、本轮工作数据汇总
|
|
|
+
|
|
|
+### 1.1 测试用例建设
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **本轮新增测试用例数*** | 0 个 | SRS/场景闸门零命中(窗口 `a9ca91323..fef17fd44` specs 201 份 / test-cases 15 份 / API_REFERENCE 全零变更),G12 合规 |
|
|
|
+| **本轮验证执行测试数*** | 3889 个(全部本轮实跑) | 后端 JUnit 3045 + 前端 Jest 624 + 管理端 Jest 116 + 浏览器 E2E 30(28 过 + 2 跳)+ langgraph 51 + 根级黑盒 23 |
|
|
|
+| **用例通过率** | 98.23%(3820/3889;剔除 skip 98.68%) | 红 51 / 跳 18,明细见 §5.2;红例含预期 RED 与已知存量,门禁见 §5.1 |
|
|
|
+
|
|
|
+### 1.2 会话与任务分发
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **分派任务数*** | 2 个 | R167-1 → `opencode-189`(admin-desktop,首跑 + 复跑共 2 次派发);R167-2 → `opencode-251`(langgraph pytest kick+read)。本机承担 fe/shop/health/dx/admin 串行执行 |
|
|
|
+| **恢复智能体会话数*** | 1 个 | 189 admin 首跑 2 例失败(account-roles 502),复跑取回 5/5 → 判定节点侧瞬态,非用例回归 |
|
|
|
+| **当前在用会话数** | 0 个 | 全部任务收尾,无残留浏览器任务(符合「每节点仅一任务」约束) |
|
|
|
+
|
|
|
+### 1.2b 各会话当前工作状态列表
|
|
|
+
|
|
|
+| 会话标签 | 会话 ID/地址 | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
|
|
|
+|----------|--------------|----------|----------|---------------|----------|------|
|
|
|
+| `opencode-189` | 192.168.16.189:4090 | done | admin-desktop UI E2E | 已完成(首跑 28s + 复跑 73s) | `C:\code\cfc\tests` | 首跑 3/5(account-roles 502)→ 复跑 **5/5 EXIT=0**;spec blob `4703d73fb` = 本机 |
|
|
|
+| `opencode-251` | 192.168.16.251:4096 | done | langgraph pytest 51 例 | 已完成(165.32s) | `/sc-data/cfc/cfc-langgraph` | **47 过 / 4 红**;节点 HEAD `fef17fd44`(tests 目录零差异,结论可比) |
|
|
|
+| `local-browser` | 本机进程 | done | admin / frontend / shop / health / dx | 已完成(1.8m + 58.1s + 18.2s + 13.9s + 跳过) | `d:\cfc\tests` | 28 过 + 2 跳(dx 404);Chromium 二进制在 `%LOCALAPPDATA%\ms-playwright`(R166「无 Chromium」为探测路径错误) |
|
|
|
+| `local-mvn` | 本机进程 | done | cfc-backend 全量 | 已完成(60:00(08:44→09:44)) | `d:\cfc\cfc-backend` | 13 红类:存量 17 例(EnergySystem 6 / DimensionRegistryMap 3 / Orchestration 2 / WechatLogin 2 / MembershipPay 1 / PaymentORD 1 / TeamProfitCron 1 / GuideModule 1)**第 15 次零漂移** + 预期 RED 6 例(S-cfc-147 DanAssessment 4 / S-cfc-151 TaskReview 2)+ 未入库文件 5 errors(GrowthPublicEndpointMappingTest,B-162-1);361/361 XML 全产出、2121+367 源 0 编译错、dump 0 |
|
|
|
+| `local-jest` | 本机进程 | done | cfc-frontend + cfc-web + 根级 | 已完成(42.2s / 40.2s / 5.0s) | `d:\cfc\cfc-frontend`、`cfc-web`、`tests` | fe 609/3/12、web 116/116、根级 7/16(9082 未起,B-36) |
|
|
|
+
|
|
|
+### 1.3 问题处置
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **新测试发现问题数*** | 3 个 | B-167-1(189 节点 account-roles 502 瞬态)· B-167-2(251 live chat/analyze 120s 零字节)· B-167-3(R166 沙箱误判「无 Chromium」被本轮实测推翻) |
|
|
|
+| **已解决测试相关问题数*** | 2 个 | **B-142-1 闭环**(`/api/admin/families/overview` 匿名由「200 + code:400」转为 **401**,6 端点全 401)· B-51 类「本机无 Chromium」误判消除(改为探测路径口径) |
|
|
|
+| **待解决测试相关问题数** | 6 个(P0×1 / P1×3 / P2×2) | ① B-142-2 langgraph LLM 配额(P0);② B-156-1 建表 SQL 无效(P1);③ B-162-1 未入库测试文件(P1);④ B-152-1/2 CI 排除清单双向失真(P1);⑤ B-167-2 live LLM 挂死(P2,与①同源);⑥ B-36 根级 16 红(P2) |
|
|
|
+
|
|
|
+### 1.4 本轮 git 提交与推送证据(真理证据)
|
|
|
+
|
|
|
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
|
|
|
+|----------|-----------------|------|--------------|----------|------------|------|
|
|
|
+| (待提交) | 全站巡检 R167 | 汇报 | 测试文档(docs/tdd + 台账)+ 归档 2 份游离报告 | cfclub | (待推送) | 结果有变化(B-142-1 闭环 / langgraph 41→47 / 新增 3 条 blocker)→ 按规则提交并通知研发 |
|
|
|
+
|
|
|
+### 1.5 状态机阶段分布(全局进度)
|
|
|
+
|
|
|
+| 阶段 | 键数 | 备注 |
|
|
|
+|------|------|------|
|
|
|
+| UNTRACKED | 0 | 需求侧 ⏳ 0 键 |
|
|
|
+| RED | 0 | 测试侧无待写红单测键 |
|
|
|
+| YELLOW | 63 | 研发侧口径(引 R143 研发负责人汇报):等待实现/待测试 mark-green |
|
|
|
+| GREEN | 8 | 已实现待部署归集 |
|
|
|
+| DONE | 15 | 已归档 |
|
|
|
+| 合计 | 86 | RED0/YELLOW63/GREEN8/DONE15,本轮零流转 |
|
|
|
+
|
|
|
+### 1.6 数据源健康度
|
|
|
+
|
|
|
+| 数据源 | 读取键数 | 是否正常 | 备注 |
|
|
|
+|--------|----------|----------|------|
|
|
|
+| 需求侧(SRS) | 201 份 specs | 正常 | 窗口零变更 |
|
|
|
+| 用例台账(test-cases) | 15 份 / 356 唯一 TC | 正常 | 1774 行,未改写 |
|
|
|
+| 场景(SC) | 164 个唯一 ID | 正常 | 被 TC 引用 92 个(56.1%) |
|
|
|
+| 执行结果回填 | 3889 例 | 正常 | 全维度本轮实跑,无引用值 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、向研发提出的改进建议
|
|
|
+
|
|
|
+| 序号 | 建议标题 | 问题描述 | 根因分析 | 建议方案 | 优先级 | 状态 |
|
|
|
+|------|----------|----------|----------|----------|--------|------|
|
|
|
+| 1 | langgraph 上游 LLM 配额(B-142-2 第 15+ 轮) | 51 例 47 过 / 4 红(auto_tag 3 + intent 1),日志 `429 AgnesAI free limit` ×2、`401 ****ab12 invalid` ×1;同窗口 `/health` 200/24ms 但 `chat`/`analyze` **120s 零字节**(B-167-2) | 免费额度耗尽 → 客户端长退避挂死;`intent_classifier.py:62` 捕获异常后静默兜底 chat,把 429 伪装成「分类错误」 | 运维轮换有效 key + 升级额度;`intent_classifier` 兜底前必须记录上游状态码并对 429/401 显式抛错,禁止静默降级 | P0 | 待处理 |
|
|
|
+| 2 | `nutrition_age_dosage` 建表恒失败(B-156-1 第 3 轮) | `schema.sql:5345-5354` 建表列清单无 `product_id`,却声明 `INDEX idx_product (product_id)` → 每次上下文启动 `SQLSyntaxErrorException`,`DatabaseInitializer` catch 后仍打「数据表检查完成」 | DDL 与列定义不一致 + 初始化异常被静默吞掉 | 删该 INDEX 或补 `product_id BIGINT` 列;`DatabaseInitializer` 对建表失败须 fail-fast 或至少 ERROR 级日志 | P1 | 待处理 |
|
|
|
+| 3 | 未入库测试文件污染全量口径(B-162-1 第 3 轮) | `GrowthPublicEndpointMappingTest`(5 例)`git ls-files` 零命中,仅存在于主工作区,占 396.4s 且 5 errors 计入红例 | 工作区遗留测试资产未 add/commit(与 B-23/B-26 同源) | 确认归属:有效则入库、无效则删除;跑测前用 `git status --short src/test` 断言干净 | P1 | 待处理 |
|
|
|
+| 4 | CI 排除清单双向失真(B-152-1/2 第 4 轮) | `.gitlab-ci.yml:61` `BACKEND_OBSERVED_CLASSES`(33 类)与本轮实测红类做双向差集:漏拦当前红类、并含大量已绿类 | 清单按「某轮快照」人工维护,无自动对表 | 每次全量后由脚本生成 `red-classes.txt` 并 diff CI 清单,差集非空即失败 | P1 | 待处理 |
|
|
|
+| 5 | 契约批次剩余红例(S-cfc-147/151) | DanAssessmentRecordCreate 4 红 + TaskReviewScP11 3 红(声明内预期 RED) | 必填守卫/材料有效性/成员-家庭归属、审查者角色与横向越权未实现 | 按 TDD 推进至 GREEN;`TaskController.reviewTask` 已补 3 参重载,余 2 参入口语义待收敛 | P1 | 待处理 |
|
|
|
+| 6 | 后端历史存量 17 红(第 15 次零漂移) | EnergySystemFlow 6 / DimensionRegistryMap 3 / Orchestration 2 / WechatLogin 2 / MembershipPay 1 / PaymentORD 1 / TeamProfitCron 1 / GuideModule 1 | 历史契约/逻辑缺口长期未闭环 | 按缺陷台账逐类闭环,Energy 6 首攻(收益最大) | P2 | 待处理 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、本轮阻塞与风险
|
|
|
+
|
|
|
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
|
|
|
+|--------|----------|----------|----------|----------|
|
|
|
+| 189 节点 `account-roles` 502(B-167-1) | admin 登录链路 E2E | 环境/网络 | 首跑 2 例红 → 本机直连 4/4=200、189 复跑 5/5 → 判节点侧网关瞬态,已给用例加「502 退避重试」建议 | 运维排查 189 出网链路 |
|
|
|
+| 251 live LLM 挂死(B-167-2) | langgraph 在线对话/解析 | 运维/AI | `/health` 200 而 `chat`/`analyze` 120s 零字节,与 pytest 429 同源 | 升级配额/轮换 key |
|
|
|
+| `nutrition_age_dosage` 建表失败(B-156-1) | 后端 schema 初始化 | 研发(P1) | 延续第 3 轮未修 | 研发修 schema.sql |
|
|
|
+| 后端未入库测试文件(B-162-1) | 全量口径漂移 | 测试(P1) | 延续;本轮仍在编译执行(5 errors/396s) | 确认入库或删除 |
|
|
|
+| 204 节点失联(B-95) | 204:4090 浏览器节点 | 运维 | 本轮探活 000;189/251 在线 | 运维恢复 204 |
|
|
|
+| 根级 16 红(B-36) | 根级黑盒套件 | 测试/环境 | 9082 未启动,全 `fetch failed`;连续第 51 轮 | 提供常驻 9082 或改用 mock |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、下轮工作计划
|
|
|
+
|
|
|
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
|
|
|
+|--------|--------------|----------|------|
|
|
|
+| 后端全量随源变更实跑维持 | 每轮 | — | 零源码变更轮可采信,但连续采信不超过 2 轮 |
|
|
|
+| langgraph 实跑复验 + live 端点复探 | 每轮 | 运维升级额度/轮换 key | 429 消除后目标 51/51,连续 2 轮销号 B-142-2 |
|
|
|
+| 契约批次 S-cfc-147/151 红例跟进 | 每轮 | 研发 TDD 推进 | 7 红转黄/转绿 |
|
|
|
+| 锚点补齐(G9/G14) | 2 轮内 | 测试侧 | 优先 0 锚点台账:vendor 0/17、health-datasource-bridge 0/17、deep-dive-plan-activation 0/6 |
|
|
|
+| 浏览器 30 例(含 dx)在 204 恢复后三节点分摊 | 每轮 | 204 在线 | 现由 189 + 本机双节点承担 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、门禁结论与证据
|
|
|
+
|
|
|
+### 5.1 门禁结论
|
|
|
+
|
|
|
+**⛔ 不通过(有条件)**。双目标仍未完全达成:① 所有用例通过 ❌(红 51 例:后端 28 + langgraph 4 + 前端 3 预期 RED + 根级 16);② 覆盖全部 SRS+场景含异常流 ❌(严格可执行锚点 66/356 = 18.5%,场景被 TC 映射 92/164 = 56.1%)。
|
|
|
+
|
|
|
+**本轮最大正向**:**B-142-1 `/api/admin/**` 鉴权门闭环** —— 6 个匿名 POST 端点全部 401(历轮 `/api/admin/families/overview` 长期 200 + code:400);langgraph 由 41/10 回升至 **47/4**;189 与 251 双节点派发全通(G10 ✅)。
|
|
|
+
|
|
|
+**复评条件**:① langgraph 连续 2 轮 51/51;② 后端红例降至 ≤10(先闭环 EnergySystemFlow 6);③ 严格锚点 ≥40%;④ CI 排除清单双向差集为空。
|
|
|
+
|
|
|
+### 5.2 实测明细(证据)
|
|
|
+
|
|
|
+| 维度 | 用例集 | 结果 | 用时 | 说明 |
|
|
|
+|------|--------|------|------|------|
|
|
|
+| **后端全量** | `cd cfc-backend && mvn -o -B clean test`(JDK1.8.0_25 + Maven 3.6.1) | **361 类 / 3045 例 / 3013 过 / 22F + 6E + 4S = 98.95%**(剔 skip 99.05%) | 60:00(08:44→09:44) | 13 红类:存量 17 例(EnergySystem 6 / DimensionRegistryMap 3 / Orchestration 2 / WechatLogin 2 / MembershipPay 1 / PaymentORD 1 / TeamProfitCron 1 / GuideModule 1)**第 15 次零漂移** + 预期 RED 6 例(S-cfc-147 DanAssessment 4 / S-cfc-151 TaskReview 2)+ 未入库文件 5 errors(GrowthPublicEndpointMappingTest,B-162-1);361/361 XML 全产出、2121+367 源 0 编译错、dump 0 |
|
|
|
+| **cfc-frontend Jest** | 42 套件 | **609 passed / 3 failed / 12 skipped(624)** | 42.2s | 3 红 = S-cfc-132/133 预期 RED(`RED-A7`、`AC-R1`、`AC-R2`,组件 `consignee-edit.vue`/`health-plan-summary.vue` 未交付) |
|
|
|
+| **cfc-web Jest** | 17 套件 | **116 passed(116)** | 40.2s | 连续多轮零漂移 |
|
|
|
+| 浏览器 admin@189 | `--project=admin-desktop` | **5 passed(复跑,EXIT=0)** | 1.2m | 首跑 3/5(account-roles 502,B-167-1);spec blob `4703d73fb` 与本机一致 |
|
|
|
+| 浏览器 admin(本机) | `--project=admin-desktop` | **5 passed** | 1.8m | 与 189 互为对照,证明 502 为节点侧 |
|
|
|
+| 浏览器 frontend(本机) | `--project=frontend-mobile` | **6 passed** | 58.1s | TC-F-U01~U06 |
|
|
|
+| 浏览器 shop(本机) | `--project=shop-api` | **4 passed** | 18.2s | 价格排序契约 |
|
|
|
+| 浏览器 health(本机) | `-c playwright.config.health.js` | **13 passed** | 13.9s | 华为/小米/健康方案鉴权契约全 401 |
|
|
|
+| 浏览器 dx(本机) | `--project=dx-bridge` | **2 skipped** | — | 端点 404(B-DX-1),不假绿 |
|
|
|
+| **langgraph@251** | `pytest -q --ignore=tests/qna --ignore=tests/test_chat.py` | **47 passed / 4 failed(51)** | 165.32s | 4 红全环境:`429 AgnesAI free limit` ×2 + `401 ****ab12` ×1;`EXIT=` 未落盘(B-126 复现) |
|
|
|
+| 根级黑盒(本机) | `cd tests && npx jest -c jest.config.js` | **7 passed / 16 failed(23)** | 5.0s | 9082 未启动,全 `fetch failed`(B-36 第 51 轮) |
|
|
|
+| 线上可达性 | GET `/admin` `/frontend` `/` | 302 / 302 / 404 | — | 与 R165 一致(B-141-3) |
|
|
|
+| 线上鉴权 | 6 个匿名 POST | **6/6 = 401** | — | mind/fortune、energy/overview、health/plan/list、huawei、xiaomi、**admin/families/overview** → B-142-1 闭环 |
|
|
|
+
|
|
|
+> **变更触发判定**:**已触发** —— B-142-1 闭环(鉴权语义变化)+ langgraph 41→47 + 新增 3 条 blocker + 2 份游离报告归档 → 提交远程并通知研发。
|
|
|
+
|
|
|
+### 5.3 20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
|
|
|
+
|
|
|
+| # | 类别 | 状态 | 证据(本轮实测) |
|
|
|
+|---|------|------|------------------|
|
|
|
+| 1 | 单元测试 | ✅ 已发现 | 后端 361 类 / 3045 例;前端 42 套 624 例;管理端 17 套 116 例 |
|
|
|
+| 2 | 测试覆盖率 | ⚠️ 待核实 | cfc-web 实测 10.08/6.06/7.48/9.95(Stmts/Branch/Func/Lines);后端 `pom.xml` 无 JaCoCo 插件(`grep -c jacoco` = 0)→ 后端覆盖率**未发现度量手段** |
|
|
|
+| 3 | 变异测试 | ❌ 未发现 | 三个模块 `pom.xml`/`package.json` 均无 pitest/stryker 配置 |
|
|
|
+| 4 | 集成测试 | ✅ 已发现 | `src/test/**/integration/**` 61 个类;本轮 GuideModule/EnergySystem 等实跑 |
|
|
|
+| 5 | 契约测试 | ✅ 已发现 | `*ContractTest.java` **107 个类**;本轮 13 红类中 5 个为契约类 |
|
|
|
+| 6 | 接口 API 测试 | ✅ 已发现 | health 套件 13 例(华为/小米/健康方案鉴权契约)+ shop 4 例排序契约 |
|
|
|
+| 7 | 系统/端到端 | ✅ 已发现 | Playwright 30 例(admin 5×2 节点、fe 6、shop 4、health 13、dx 2 跳) |
|
|
|
+| 8 | 验收 UAT | ❌ 未发现 | 无 UAT 计划/签收记录资产 |
|
|
|
+| 9 | BDD 规格 | ❌ 未发现 | 无 `.feature` 文件;场景以 Markdown 表述 |
|
|
|
+| 10 | 冒烟测试 | ✅ 已发现 | `tests/playwright.config.smoke.js` + `tests/e2e/ci-smoke.spec.js`(本质检未重跑) |
|
|
|
+| 11 | 回归测试 | ✅ 已发现 | CI `backend-observed-junit` / `tests-jest-observed` + 本轮全量回归 |
|
|
|
+| 12 | 探索性测试 | ❌ 未发现 | 无 charter/会话记录资产 |
|
|
|
+| 13 | 性能测试 | ❌ 未发现 | 无 k6/JMeter/Gatling 脚本;`ActivityControllerTest` 304s 类属单测耗时非压测 |
|
|
|
+| 14 | 可靠性测试 | ❌ 未发现 | 无故障注入/长稳/重试策略验证资产 |
|
|
|
+| 15 | 安全测试 | ❌ 未发现 | `.gitlab-ci.yml` 无 sast/gitleaks/dependency 作业(`grep -c` = 0);本轮仅有 6 端点匿名鉴权探针 |
|
|
|
+| 16 | 兼容性测试 | ❌ 未发现 | Playwright 仅 chromium 单浏览器;无设备/分辨率矩阵 |
|
|
|
+| 17 | 可用性测试 | ❌ 未发现 | 无可用性任务/问卷资产 |
|
|
|
+| 18 | 无障碍测试 | ❌ 未发现 | 无 axe/pa11y 配置与断言 |
|
|
|
+| 19 | QA 流程 | ✅ 已发现 | `blockers.md`(B-1~B-167 台账)+ `automation-status.md` + 研发/测试交接通知 |
|
|
|
+| 20 | 质量指标 | ⚠️ 待核实 | `docs/tdd/tools/test_report_metrics.py` 存在但**运行零 stdout**(B-124 第 6 轮),度量靠内联统计复算 |
|
|
|
+
|
|
|
+### 5.4 五要素问题清单
|
|
|
+
|
|
|
+**① langgraph 上游 LLM 配额导致 4 例环境红(B-142-2 / B-167-2)**
|
|
|
+- 问题描述:251 实派 51 例 47 过 4 红;日志 `429 AgnesAI free limit` ×2、`401 api key ****ab12 invalid` ×1;同窗口 `/health` 200/24ms 而 `POST /api/v1/chat`、`/api/v1/analyze` **120s 零字节**。
|
|
|
+- 测试 bug 点:`tests/test_auto_tag.py::test_auto_tag_endpoint_responds`、`test_auto_tag_valid_format`、`test_auto_tag_empty_content`、`tests/test_intent.py::test_classify_recommend`(断言取真实 LLM 返回,未隔离上游)。
|
|
|
+- 最优修改方案:对这 4 例注入 stub LLM client(`respx`/`monkeypatch` 拦截 `AgnesAI` 端点),保留 1 例真实链路用例并标 `@pytest.mark.live`;`intent_classifier.py:62` 兜底前记录上游状态码,429/401 显式抛出而非默认 `chat`。
|
|
|
+- 修改目的:把「配额波动」与「代码回归」解耦,使 G7 可判定;同时消除静默兜底掩盖的真实故障。
|
|
|
+- 闭环:stub 后 51/51 连续 2 轮全绿 → 销号 B-142-2;运维侧额度恢复后 `@live` 用例单跑通过。
|
|
|
+
|
|
|
+**② 未入库测试文件污染全量口径(B-162-1)**
|
|
|
+- 问题描述:`GrowthPublicEndpointMappingTest`(5 例)`git ls-files` 零命中,仅存于主工作区;本轮耗 396.4s、5 errors 全计入红例。
|
|
|
+- 测试 bug 点:`cfc-backend/src/test/java/com/etotem/cfc/config/GrowthPublicEndpointMappingTest.java`(未跟踪);断言依赖 `ServletRequestPathUtils.PATH` 请求属性,在 standalone MockMvc 下恒缺失。
|
|
|
+- 最优修改方案:确认归属——有效则以 `MockMvcBuilders.webAppContextSetup` 或显式 `ServletRequestPathUtils.parseAndCache` 修正后入库;无效则删除文件。
|
|
|
+- 修改目的:消除「同名不同版」口径漂移,避免红例数被不可复现资产污染。
|
|
|
+- 闭环:`git status --short cfc-backend/src/test` 为空 + 全量红例由 28 → 23 → 复算一致。
|
|
|
+
|
|
|
+**③ `nutrition_age_dosage` 建表恒失败(B-156-1,第 3 轮)**
|
|
|
+- 问题描述:`schema.sql:5345-5354` 列清单无 `product_id`,却声明 `INDEX idx_product (product_id)` → 34 次上下文启动均 `SQLSyntaxErrorException`,`DatabaseInitializer` catch 后仍打印「数据表检查完成」,表从未创建。
|
|
|
+- 测试 bug 点:无 DDL 冒烟用例;`DatabaseInitializer` 无「建表成功」断言。
|
|
|
+- 最优修改方案:删该 INDEX 或补 `product_id BIGINT` 列(与实体 `NutritionAgeDosage.java` 对齐);`DatabaseInitializer` 对建表失败改为 ERROR/WARN 可观测,并新增 1 条 `schema-ddl-smoke` 用例逐表 `SHOW TABLES`。
|
|
|
+- 修改目的:让 schema 缺陷在启动阶段即暴露,而非等业务查询 `Unknown column`。
|
|
|
+- 闭环:启动日志 `SQLSyntaxErrorException` 计数 = 0 且 `SHOW TABLES LIKE 'nutrition_age_dosage'` 命中。
|
|
|
+
|
|
|
+**④ CI 排除清单双向失真(B-152-1/2,第 4 轮)**
|
|
|
+- 问题描述:`.gitlab-ci.yml:61` 清单 33 类 vs 实测红类 13 类 → **漏拦 6 类**(GrowthPublicEndpointMappingTest、UserServiceWechatLoginTest、UserServiceWechatLoginContractTest、DanAssessmentRecordCreateContractTest、TaskReviewScP11ContractTest、TeamProfitCronContractTest)→ `backend-blocking-junit` 必然失败;同时 **26 类已转绿仍被排除** → 门禁覆盖被人为缩小。
|
|
|
+- 测试 bug 点:CI 变量为静态快照,无自动对表机制。
|
|
|
+- 最优修改方案:全量跑完后由脚本产出 `red-classes.txt`,CI 增加 `diff` 步骤:`实测红类 − 清单` 与 `清单 − 实测红类` 任一非空即 fail(并输出差异)。
|
|
|
+- 修改目的:把「已知红类白名单」从人工维护变为机器校验,恢复门禁有效性。
|
|
|
+- 闭环:双向差集为空且 `backend-blocking-junit` 在 GREEN 类上通过。
|
|
|
+
|
|
|
+**⑤ 189 节点 `account-roles` 502 瞬态(B-167-1)**
|
|
|
+- 问题描述:首跑 TC-A-U04/U05 失败,断言「account-roles 接口应 200」实得 502;本机直连同端点 4/4=200,189 复跑 5/5。
|
|
|
+- 测试 bug 点:`tests/e2e-live/admin-live.spec.js:160/188` 对 `account-roles` 只接受 200,无 5xx 退避。
|
|
|
+- 最优修改方案:`fillPhoneAndAwaitRoles` 内对 502/503 做 2 次指数退避重试;仍失败则输出节点网络证据(响应头/耗时)而非仅断言码。
|
|
|
+- 修改目的:区分「节点网络瞬态」与「接口契约回归」,避免环境抖动被记成产品缺陷。
|
|
|
+- 闭环:连续 3 轮 189 首跑 5/5(本轮记观察 1/3)。
|
|
|
+
|
|
|
+**⑥ 可执行锚点覆盖率不足(G9)**
|
|
|
+- 问题描述:356 条台账 TC 中仅 66 条在测试资产中可定位(18.5%);`vendor.md` 0/17、`health-datasource-bridge.md` 0/17、`deep-dive-plan-activation.md` 0/6、`teacher.md` 3/43、`admin.md` 5/38。
|
|
|
+- 测试 bug 点:用例标题未内嵌 TC 编号,资产侧无 `@TC-*` 约定(B-30 同源)。
|
|
|
+- 最优修改方案:按台账分域补锚点,优先级 0 锚点三本(vendor / health-datasource-bridge / deep-dive-plan-activation);每例测试首行注释 `// TC-XXX-nn`。
|
|
|
+- 修改目的:使「需求→TC→资产」可反向追溯,把覆盖率从「用例数」升级为「需求覆盖」。
|
|
|
+- 闭环:严格锚点 ≥ 40%(≥143/356)且三本 0 锚点台账归零。
|
|
|
+
|
|
|
+**⑦ 契约口径待裁决(DimensionRegistryMap 3 红,P-9 第 10 轮)**
|
|
|
+- 问题描述:`map_emptyLegacy_returnsNullData` 期望 `$.data` 为 `null` 实得 `""`;`map_missingLegacy_returnsBadRequest` 期望 400 实得 200;`map_unknownLegacy_returnsNullData` 期望 null 实得原值。
|
|
|
+- 测试 bug 点:`integration/controller/DimensionRegistryMapContractTest`(3 例),契约文本未明确「空/缺参/未知值」三态语义。
|
|
|
+- 最优修改方案:由产品/研发确认三态契约后二选一——改实现或改断言,并在 `API_REFERENCE.md` 固化。
|
|
|
+- 修改目的:结束同一契约连续 10 轮「红但无人认领」的状态。
|
|
|
+- 闭环:契约文本落定 + 用例与实现一致 + 连续 2 轮绿。
|
|
|
+
|
|
|
+**⑧ TaskReview 横向越权未拦截(S-cfc-151,2 红)**
|
|
|
+- 问题描述:`permission_crossFamilyReview_mustBeRejected` 无审批人身份时 `reviewTask` 直接放行并进入发分链路;`permission_handler_mustDeclareReviewerIdentity` 控制器未声明身份参数。
|
|
|
+- 测试 bug 点:`unit/TaskReviewScP11ContractTest`(2 例)。研发 `f139a05a2` 已补 3 参重载(3 红 → 2 红)。
|
|
|
+- 最优修改方案:控制器 `reviewTask` 增加 `@RequestAttribute("userId")`,服务层 `isQualifiedReviewer` 校验审批人属该家庭/角色,2 参入口仅作兼容并禁用发分。
|
|
|
+- 修改目的:封堵跨家庭越权审批(安全缺陷,P1)。
|
|
|
+- 闭环:2 例转绿 + 补充「跨家庭/匿名/非家长」三类负向用例。
|
|
|
+
|
|
|
+### 5.5 覆盖缺口清单
|
|
|
+
|
|
|
+| 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|----------|------|------|--------------|--------|----------|
|
|
|
+| 需求锚点(G9) | 严格 66/356 = 18.5% | 无法回答「哪些 SRS 场景无自动化」 | 分域补 `TC-*` 注释锚点,先攻 0 锚点三本 | P1 | 锚点 ≥40% |
|
|
|
+| 场景映射 | 164 场景中被 TC 引用 92(56.1%) | 44% 场景无用例 | 反向核对脚本产出「场景→TC→资产」缺口表 | P1 | 映射 ≥80% |
|
|
|
+| 后端覆盖率 | 无 JaCoCo | 无法量化单测有效性 | pom 增 jacoco-maven-plugin,阈值先设 40% 观察 | P2 | 覆盖率报告入库 |
|
|
|
+| 变异测试 | 无 | 断言强度未知 | 先对 `service/` 3 个核心类试点 pitest | P3 | 变异得分 ≥50% |
|
|
|
+| 性能/可靠性 | 无脚本 | 无容量与恢复证据 | k6 脚本覆盖 `/api/energy/overview` 等 5 高频接口 | P2 | 基线 P95 入库 |
|
|
|
+| 安全扫描 | CI 无 sast/依赖扫描 | 供应链与明文凭据风险(B-31) | CI 加 gitleaks + dependency-check(需授权联网) | P1 | 作业为绿 |
|
|
|
+| 兼容性/无障碍 | 仅 chromium | 移动端/无障碍无证据 | 增 webkit+firefox project;axe 断言静态页 | P3 | 矩阵入库 |
|
|
|
+| UAT/BDD/探索性 | 无资产 | 验收与探索无记录 | 每里程碑 1 份 UAT 清单 + 1 次 60min 探索会话记录 | P3 | 记录入库 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录
|
|
|
+
|
|
|
+### 附录 A:本轮新增测试用例明细
|
|
|
+
|
|
|
+无。SRS/场景窗口零变更,按 G12 不新增用例;覆盖缺口已转 §五 缺口清单与下轮计划(锚点补齐)。
|
|
|
+
|
|
|
+### 附录 B:任务分派与会话恢复明细
|
|
|
+
|
|
|
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
|
|
|
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
|
|
|
+| R167-1 | opencode-189 | 08:44 / 09:0x | shell 派发(PowerShell) | done 5/5 | opencode-189 | 首跑 2 例 502 失败 → 复跑取证 | 09:0x |
|
|
|
+| R167-2 | opencode-251 | 08:55 | kick(setsid 分离)+ 单次读 | done 47/4 | — | — | — |
|
|
|
+| R167-3 | local-browser | 08:47~09:20 | 直跑(串行) | done 28 过 + 2 跳 | — | — | — |
|
|
|
+| R167-4 | local-mvn | 08:44 | 直跑(后台) | done | — | — | — |
|
|
|
+
|
|
|
+### 附录 C:新发现问题明细
|
|
|
+
|
|
|
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联 sha |
|
|
|
+|---------|---------------|----------|----------|----------|----------|----------|
|
|
|
+| B-167-1 | admin 登录链路 | 环境/网络(189 account-roles 502) | 运维 | 08:47 | 观察(复跑通过) | `8e4d17e83` |
|
|
|
+| B-167-2 | langgraph live chat/analyze | 运维/AI(120s 零字节) | 运维 | 09:22 | 待处理(与 B-142-2 同源) | `fef17fd44` |
|
|
|
+| B-167-3 | R166 结论勘误 | 测试(无 Chromium 误判) | 测试侧已纠正 | 08:40 | 已闭环 | — |
|
|
|
+
|
|
|
+### 附录 D:口径与命令
|
|
|
+
|
|
|
+- 后端:`cd cfc-backend`(**Maven 工程根在此,非仓库根**)+ `JAVA_HOME=/d/jdk1.8.0_25` + `/d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test`
|
|
|
+- Playwright 必须在 `tests/` 目录内跑(根目录会因 `@playwright/test` 双版本报 `test.describe() called here`)
|
|
|
+- 251 派发:`POST /api/shell?location[directory]=<dir>` + `setsid nohup` 分离 + 本地等待后单次读日志(禁轮询建 shell,B-125)
|
|
|
+- 锚点双口径(B-124 延续):严格 66/356 = 18.5%(排除 `tests/e2e/api/generated`);宽 325/356 = 91.3%(含 generated 虚高,不作门禁依据)
|