|
|
@@ -0,0 +1,333 @@
|
|
|
+# 测试负责人工作汇报(R177 轮)
|
|
|
+
|
|
|
+> 本汇报按《测试负责人工作汇报模板》填写。R177 为**全量实跑轮**:窗口 `203530adf..97121f20b`(R176 汇报 → 研发负责人 22:03 汇报)**零功能源码 / 零 SRS 变更**(仅 1 份研发 docs)→ 后端按「采信不可连续 2 轮」纪律**强制全量实跑**,其余七套件全部本轮实测(0 采信)。
|
|
|
+> 对比基线 R176(`203530adf`):全站 **3979 例 / 3892 过(97.81%,剔 skip 98.43%)**;后端 3060 过 39 红(**存量零漂移第 23 次**);langgraph@251 **47/51**(4 红全环境,较 R176 44 过**回升 +3**);浏览器 **28/28 + 2 跳**;线上 API **25 过 / 7 跳 / 0 红**;管理端 116/116、前端 609/3/12、根级 7/16 全部零漂移;SRS/场景窗口零变更 → 用例无需更新(G12 ✅);门禁 **不通过(承袭)**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 基本信息
|
|
|
+
|
|
|
+| 项目 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 汇报人 | 测试负责人(自动化测试闭环任务) |
|
|
|
+| 汇报周期 | 2026年11月12日 22:19 ~ 23:12(第 177 轮) |
|
|
|
+| 基线 | `cfclub @ 97121f20b`(pull 后 = origin/cfclub,跑前=跑后) |
|
|
|
+| 窗口内需求变更 | **零**——R176 后无 SRS/场景/用例提交(`git diff --name-only 203530adf..97121f20b` 仅 1 文件,`docs/tdd/orchestration/report-dev-2026-11-12-2203.md`) |
|
|
|
+| 窗口内源码变更 | **零功能源码**(1 文件 +152 行研发 docs) |
|
|
|
+| 负责模块/单元 | 全站:cfc-backend JUnit(本轮实跑)· 管理端 admin@189 · 小程序 H5/shop/health/dx@本机 · cfc-langgraph@251 · cfc-web/cfc-frontend Jest · 根级黑盒 · 线上 API 非功能层 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、本轮工作数据汇总
|
|
|
+
|
|
|
+### 1.1 测试用例建设
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **本轮新增测试用例数\*** | **0 个** | SRS/场景窗口零变更,无需新增;SC 基线 244 承袭 R174 入册 |
|
|
|
+| **本轮验证执行测试数\*** | **3979 个** | 后端 JUnit 3103(本轮实跑)+ 前端 Jest 624 + 管理端 116 + langgraph 51 + 浏览器 30(28 过 + 2 跳)+ 线上 API 32(25 过 + 7 跳)+ 根级 23 |
|
|
|
+| **用例通过率** | **97.81%**(3892/3979;剔除 skip **98.43%**) | 红 62 / 跳 25,明细见 §四 |
|
|
|
+| **用例台账** | `tests/test-cases/` 16 份 | 场景 215 / TC 表行 861 / 可执行锚点 115 |
|
|
|
+
|
|
|
+### 1.2 会话与任务分发
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **分派任务数\*** | **3 个** | R177-1 → `opencode-189`(admin-desktop **5/5 EXIT=0**,1.3m);R177-2 → `opencode-251`(langgraph pytest **47/51**,4m46s);R177-3 → 本机串行(后端全量 + 2 套 Jest + 4 组浏览器 + API 层 + 根级) |
|
|
|
+| **恢复智能体会话数\*** | 0 个 | 189/251 均首派成功 |
|
|
|
+| **当前在用会话数** | 0 个 | 本轮任务全部结束,无长任务在跑 |
|
|
|
+
|
|
|
+### 1.2b 各会话当前工作状态列表
|
|
|
+
|
|
|
+| 会话标签 | 会话 ID/地址 | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
|
|
|
+|----------|--------------|----------|----------|---------------|----------|------|
|
|
|
+| `opencode-189` | 192.168.16.189:4090 | done | admin-desktop UI E2E | 已完成(1.3m) | `C:\code\cfc\tests` | **5/5 EXIT=0**;spec blob `4703d73fb` = 本机(跨节点可比) |
|
|
|
+| `opencode-251` | 192.168.16.251:4096 | done(本会话派发) | langgraph pytest 51 例 | 已完成(4m46s) | `/sc-data/cfc/cfc-langgraph` | **47 过 / 4 红**;节点仓库 HEAD `d1c07b26e`;4 红全环境(chat 500 ConnectError + 401 api key `****ab12`) |
|
|
|
+| `local-browser` | 本机进程 | done | fe / shop / health / dx | 已完成 | `d:\cfc\tests` | fe **6/6**、shop **4/4**(复跑)、health **13/13**、dx **2 跳**(端点 404,契约仅登记不实现) |
|
|
|
+| `local-api` | 本机进程 | done | 线上 API 冒烟/安全/性能兼容/追溯 | 已完成(27.3s) | `d:\cfc\tests` | **25 过 / 7 跳 / 0 红** |
|
|
|
+| `local-jest` | 本机进程 | done | cfc-frontend + cfc-web + 根级 | 已完成 | `cfc-frontend` / `cfc-web` / `tests` | fe 609/3/12(3 预期 RED)、web **116/116**、根级 7/16(9082 未起,B-36 第 63 轮) |
|
|
|
+| `local-backend` | 本机进程 | done | 后端全量 `mvn -o -B clean test` | 已完成(42m08s) | `d:\cfc\cfc-backend` | 368 类 / 3103 例 / 3060 过 / 33F+6E+4S |
|
|
|
+
|
|
|
+### 1.3 问题处置
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|------|
|
|
|
+| **新测试发现问题数\*** | **2 个** | **B-177-1**(P1):pytest 打印 summary 后进程**不退出**(R176 残留存活 46min、本轮存活 16min),`EXIT=` 永不落盘 → 修正 B-126 根因;**B-177-2**(P2):商城/dx 首跑 6 红全 502,直连 3/3=200 + 复跑绿 → 网关瞬态,用例缺 5xx 退避 |
|
|
|
+| **已解决测试相关问题数\*** | **1 个** | **B-142-2 观察 1/2**(langgraph 44→47 回升,仍不销号);**B-126 根因定位完成**(自「shell 引号/路径」更正为「进程不退出」)+ 本次清理 251 残留进程 4 个 |
|
|
|
+| **待解决测试相关问题数** | P0×2 / P1×6 / P2×4 | ① B-142-2 langgraph 上游 401/配额(P0);② B-152-1/2 CI 排除清单双向失真(P0/P1,漏拦 8 类);③ B-173-2 API 层入口默认收集 990 例(P1);④ B-156-1 `nutrition_age_dosage` 建表 SQL(P1);⑤ B-162-1 3 类未入库测试(P1);⑥ S-cfc-166/168/169 契约预期 RED 17 例(P1);⑦ **B-177-1 pytest 不退出(P1 新)**;⑧ B-173-1 safe-delete(P2,`--output` 规避中);⑨ B-173-3 后端耗时(P2);⑩ **B-177-2 网关 502 无用例退避(P2 新)** |
|
|
|
+
|
|
|
+### 1.4 本轮 git 提交与推送证据(真理证据)
|
|
|
+
|
|
|
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
|
|
|
+|----------|-----------------|------|--------------|----------|------------|------|
|
|
|
+| 见收尾 commit | 全站巡检 R177 | 汇报 | 报告/运行日志/通知/blockers 4 份 | cfclub | ✅ 本轮推送 | 测试结果有变化(langgraph 44→47、后端 42m08s 实跑)→ 提交并通知研发 |
|
|
|
+
|
|
|
+### 1.5 状态机阶段分布(全局进度)
|
|
|
+
|
|
|
+| 阶段 | 键数 | 备注 |
|
|
|
+|------|------|------|
|
|
|
+| UNTRACKED | 0 | 窗口零新增规格 |
|
|
|
+| RED | 8 | 承袭研发口径(含 S-cfc-166/168/169 契约 17 例待实现) |
|
|
|
+| YELLOW | 63 | 承袭 R176(研发 22:03 汇报 60 IN_CHAIN/3 O22-exempt) |
|
|
|
+| GREEN | 8 | 承袭 |
|
|
|
+| DONE | 15 | 承袭 |
|
|
|
+| 合计 | 94 | 与研发汇报口径一致 |
|
|
|
+
|
|
|
+### 1.6 数据源健康度
|
|
|
+
|
|
|
+| 数据源 | 读取键数 | 是否正常 | 备注 |
|
|
|
+|--------|----------|----------|------|
|
|
|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 目标池未启用(CFC 声明配置) |
|
|
|
+| 契约常量(contract) | 多组 | 正常 | 契约测试类跨轮核验正常 |
|
|
|
+| 测试用例引用(test_case_map) | 155+ | 正常 | 台账扫描正常(跨源 545 资产) |
|
|
|
+| 执行结果回填(case_results) | 1185 条 | 正常 | 侧车未重写,保留既有回写 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、历史审查记录(阶段 -1 记忆召回)
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|---|---|
|
|
|
+| 上次审查 | **R176(2026-11-12 21:55,提交 `203530adf`)**,结论「不通过(承袭)」,全量 3979/3889(97.74%),langgraph 44/51 红 7 |
|
|
|
+| 遗留缺口 | 后端存量 17 红(零漂移第 22 次)· langgraph 环境红 7 · 根级 16 红(9082 未起)· CI 漏拦 8 类 · 3 未入库测试 · B-126 EXIT 未落盘 |
|
|
|
+| 本次是否改善 | **langgraph 改善**:44→47 过(红 7→4,intent 4 红清零、auto_tag 4 红);后端零漂移(39 红同上轮);其余套件逐项零漂移;**B-126 根因更正**(见 B-177-1) |
|
|
|
+| 教训应用 | ① 251 派发用 `MSYS2_ENV_CONV_EXCL=LOG`(本轮实测:不加该变量时 `LOG=/tmp/...` 被 MSYS 改写为 `C:/Users/...`,派发器 LOG 守卫直接 rc=2 拒绝);② 派发前 `ps -eo pid,etime,cmd` 查残留,**本轮发现残留并非清理不彻底,而是进程压根不退出**;③ Playwright 一律在 `tests/` 内跑(仓库根跑会 `test.describe() called here` 双版本冲突);④ 判「用例红」前先做 5xx 三证(直连 + 复跑 + 对照组) |
|
|
|
+
|
|
|
+> 本次为该对象**第 177 次**审查,有历史记录;上述内容仅作对照,**本次结论全部来自本轮实测**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、项目画像与覆盖矩阵
|
|
|
+
|
|
|
+### 3.1 项目画像(承袭并本轮核验)
|
|
|
+
|
|
|
+| 维度 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 业务定位 | 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城 |
|
|
|
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000) |
|
|
|
+| 模块结构 | `cfc-backend`(366 控制器)· `cfc-frontend`(42 测试文件)· `cfc-web`(17 套件)· `cfc-langgraph`(51 例)· `dan/danshop` · `tests`(89 e2e + 5 e2e-live) |
|
|
|
+| 关键路径 | 登录/家庭/成员 → 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付 → AI 对话(LangGraph) |
|
|
|
+| 测试现状 | 后端 368 类 3103 例(98.61%)· 前端 624 · 管理端 116 · 浏览器 30 · 线上 API 32 · langgraph 51 · 根级 23 |
|
|
|
+| 质量目标 | 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发 |
|
|
|
+| 风险点 | ① 存量 17 红跨 23 轮零漂移(装置/数据类)· ② 契约预期 RED 17(S-cfc-166/168/169 未实现)· ③ CI 排除清单双向失真 · ④ langgraph 上游配额/密钥 · ⑤ 3 类未入库测试 |
|
|
|
+| 待核实项 | `nutrition_age_dosage` 建表缺陷(B-156-1)修复状态 · S-cfc-166/168/169 实现排期 |
|
|
|
+
|
|
|
+### 3.2 20 类测试覆盖矩阵(全类不省略)
|
|
|
+
|
|
|
+| # | 测试类型 | 三态 | 证据(本轮实测) |
|
|
|
+|---|----------|------|------------------|
|
|
|
+| 1 | 单元测试 | ✅ 已发现 | 后端 368 类 3103 例;前端 42 文件 624 例 |
|
|
|
+| 2 | 测试覆盖率 | ⚠️ 部分 | 管理端 Jest 覆盖率可产出(Lines 9.95%);后端未开 jacoco(未授权改 pom) |
|
|
|
+| 3 | 变异测试 | ❌ 未发现 | 全仓无 pitest/mutation 配置 |
|
|
|
+| 4 | 集成测试 | ✅ 已发现 | `*IntegrationTest`(Orchestration/GuideModule/LangGraph 等)含在 368 类内 |
|
|
|
+| 5 | 契约测试 | ✅ 已发现 | 契约类 20+(Membership/ShopOrder/SupplierOrder/TaskReview/WechatLogin 等);本轮 4 类 17 例为**预期 RED**(S-cfc-166/168/169 未实现) |
|
|
|
+| 6 | 接口 API 测试 | ✅ 已发现 | 线上 API 32 例(25 过 / 7 跳 / 0 红),27.3s |
|
|
|
+| 7 | 系统/端到端 | ✅ 已发现 | 浏览器 30 例:admin 5 + fe 6 + shop 4 + health 13 + dx 2(跳) |
|
|
|
+| 8 | 验收 UAT | ⚠️ 部分 | `tests/test-cases/cross-role-e2e.md` 双角色验收场景有台账;本轮无人工 UAT |
|
|
|
+| 9 | BDD 规格 | ⚠️ 部分 | spec 文档 201 份含 Given/When/Then 语义;无 cucumber 执行器 |
|
|
|
+| 10 | 冒烟测试 | ✅ 已发现 | `api-smoke.spec.js` 4/4 全绿 |
|
|
|
+| 11 | 回归测试 | ✅ 已发现 | 本轮 8 套件全量回归(后端 42m08s 实跑);零漂移第 23 次 |
|
|
|
+| 12 | 探索性测试 | ✅ 已发现 | 本轮现场探索出 B-177-1(pytest 不退出)、B-177-2(网关 502 无用例退避) |
|
|
|
+| 13 | 性能测试 | ⚠️ 部分 | `nonfunc-perf-compat.spec.js` 4 例(1 过 3 跳);压测未授权未执行 |
|
|
|
+| 14 | 可靠性测试 | ⚠️ 部分 | 网关瞬态(502)与上游 401 提供弱故障注入证据;无长稳/混沌测试 |
|
|
|
+| 15 | 安全测试(SAST/DAST) | ⚠️ 部分 | `nonfunc-security.spec.js` 11/11 绿(XSS/非法上传/未鉴权);SAST 扫描未授权 |
|
|
|
+| 16 | 依赖漏洞扫描 | ❌ 未发现 | 无 `npm audit`/`dependency-check` 门禁,且属联网档未授权 |
|
|
|
+| 17 | 兼容性测试 | ⚠️ 部分 | Playwright `frontend-mobile` 移动视口 6/6;无多浏览器矩阵 |
|
|
|
+| 18 | 可用性测试 | ⚠️ 部分 | 页面可渲染/导航/TabBar 断言覆盖;无真实用户可用性测试 |
|
|
|
+| 19 | 无障碍测试 | ❌ 未发现 | 无 axe-core 等 a11y 断言 |
|
|
|
+| 20 | QA 流程与质量指标 | ⚠️ 部分 | 本报告 + blockers + 度量脚本可复现;G9 锚点仅 13.4%、G11 CI 硬门禁失真 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、本轮实测明细(红例归因)
|
|
|
+
|
|
|
+### 4.1 套件数据
|
|
|
+
|
|
|
+| 套件 | 执行 | 通过 | 红 | 跳 | 耗时 | 判定 |
|
|
|
+|------|------|------|----|----|------|------|
|
|
|
+| 后端 JUnit(实跑) | 3103 | 3060 | 39(33F+6E) | 4 | 42m08s | 存量零漂移 + 预期 RED |
|
|
|
+| 前端 Jest | 624 | 609 | 3 | 12 | 36.3s | 3 全预期 RED(S-cfc-132/133) |
|
|
|
+| 管理端 Jest | 116 | 116 | 0 | 0 | 21.8s | 全绿 |
|
|
|
+| langgraph@251 | 51 | 47 | 4 | 0 | 4m46s | 4 全环境(上游 401) |
|
|
|
+| 浏览器(189+本机) | 30 | 28 | 0 | 2 | — | dx 2 跳(契约仅登记不实现) |
|
|
|
+| 线上 API 非功能层 | 32 | 25 | 0 | 7 | 27.3s | 契约缺口 3 例已 fixme |
|
|
|
+| 根级黑盒 | 23 | 7 | 16 | 0 | 8.3s | 全 ECONNREFUSED 9082(B-36 第 63 轮) |
|
|
|
+| **合计** | **3979** | **3892** | **62** | **25** | — | **97.81%(剔 skip 98.43%)** |
|
|
|
+
|
|
|
+### 4.2 后端 39 红三层归因(零漂移第 23 次)
|
|
|
+
|
|
|
+| 层 | 例数 | 红类(15 类) | 归因 |
|
|
|
+|----|------|---------------|------|
|
|
|
+| 存量(装置/数据) | **17** | EnergySystemFlow 6F、DimensionRegistryMap 3F、OrchestrationEngine 1F、OrchestrationIntegration 1F、MembershipPaySwitch 1F、PaymentServiceORDRouting 1F、UserServiceWechatLogin 1F、UserServiceWechatLoginContract 1F、TeamProfitCronContract 1F、GuideModuleIntegration 1E | 装置:硬编码 127.0.0.1:3306 / Mock 误用 / 断言基线过期(B-13/B-18) |
|
|
|
+| 未入库测试 | **5** | GrowthPublicEndpointMappingTest 5E | B-162-1(3 文件 `??` 未入库却被编译执行) |
|
|
|
+| 契约预期 RED | **17** | MembershipPlanPurchaseContract 7F、SupplierOrderFulfillContract 5F、ShopOrderQueryRefundContract 4F、TaskReviewScP11Contract 1F | S-cfc-166/168/169 契约先行、实现未落地 |
|
|
|
+
|
|
|
+> 与 R176「存量 18 + GrowthPublic 5 + 预期 16 = 39」**总数一致、零漂移**;`TaskReviewScP11` 1F 在两层间的归属口径轮间有 1 例浮动(存量 17/18),已记入 B-124 度量口径项。
|
|
|
+
|
|
|
+### 4.3 性能侧观察(B-173-3 更新)
|
|
|
+
|
|
|
+| 项 | 本轮 | 上轮 | 说明 |
|
|
|
+|----|------|------|------|
|
|
|
+| 后端全量耗时 | **42m08s** | 40:12(R175)/ 51:52(R173) | 落回 40min 档 |
|
|
|
+| scheduler 日志占比 | **14,672 / 64,741 行 = 22.7%** | 28.6%(R152) | 仍为耗时主因之一 |
|
|
|
+| 慢类 Top3 | UserServiceFamilyNameLink 212s、GuidePackageService 131s、ActivityController 90s | FamilyNameLink 168s | 前 3 占全场 ~17% |
|
|
|
+
|
|
|
+### 4.4 langgraph 红例(4,全环境)
|
|
|
+
|
|
|
+| 例 | 现象 | 归因 |
|
|
|
+|----|------|------|
|
|
|
+| `test_auto_tag_valid_format` | 标签数 0(期望 3-5) | 上游不可用 → 空结果 |
|
|
|
+| `test_auto_tag_content_relevance` | 同上 | 同上 |
|
|
|
+| `test_auto_tag_short_content` | chat 端点 **500**,`ConnectError('All connection attempts failed')` | 上游连接失败 |
|
|
|
+| `test_auto_tag_empty_content` | chat 端点 **500**,同上 | 同上 |
|
|
|
+
|
|
|
+- 本窗口日志:**429 出现 0 次**(上轮 7 次),但 `401 api key ****ab12 is invalid` 出现 2 次(`chat_graph.py:148/195` 召回/保存记忆);
|
|
|
+- 同窗口 live 复核:`/health` **200/1.9ms**、`/api/v1/chat` **200/4.2s**(返回 `pong`)→ **服务与模型链路在清理残留进程后可正常应答**,4 红为测试窗口内上游瞬时不可达;
|
|
|
+- 判定:**环境红,非代码回归**;B-142-2 **观察 1/2**(需连续 2 轮 51/51 才销号)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、五要素问题清单(本轮新发现 2 条 + 承袭重点 3 条)
|
|
|
+
|
|
|
+### 问题 1:B-177-1(P1)pytest 打印 summary 后进程不退出,`EXIT=` 永不落盘
|
|
|
+
|
|
|
+1. **问题描述**:251 节点 langgraph pytest 已输出完整 summary(`4 failed, 47 passed ... in 286.85s`),但进程持续存活:本轮进程存活 16m42s(99 线程、状态 Sl)、R176 同类进程存活 **46m30s** 仍未退出;`EXIT=` 行在日志中始终缺失。
|
|
|
+2. **测试 bug 点**:`docs/tdd/tools/dispatch_251_pytest.cjs:52` kick 命令 `... ; rc=$?; echo EXIT=$rc >> LOG`——该写法本身正确,但**被测进程不退出**,`rc` 永远得不到值;历轮把此现象归因为「shell 引号被提前展开/路径被 MSYS 改写」(B-126),本轮以 `ps -o pid,stat,etime` 反证为**进程挂死**。伴随 `RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited`。
|
|
|
+3. **最优修改方案**:① 派发器 kick 前置 `timeout -k 10 900`(`timeout -k 10 900 .venv/bin/python -m pytest ...`),超时强制收尾并落 `EXIT=124`;② 派发器在 `read` 模式增加「summary 已出现 + 进程仍在」判定,自动 `kill -TERM` 并回报 `HANG_AFTER_SUMMARY=1`;③ 产品侧修 `JavaClient`:在 FastAPI `shutdown` 钩子 `await client.aclose()`,消除未 await 协程与非 daemon 线程残留。
|
|
|
+4. **修改目的**:让「退出码」这一测试真理证据可稳定获取(B-126 闭环),同时消除残留进程对下轮资源与耗时的污染(本轮清洗 4 个残留后 live chat 恢复 200/4.2s)。
|
|
|
+5. **能否闭环**:能。复测方式:连续 2 轮派发后 `grep -oE 'EXIT=[0-9]+'` 必须有值且 `ps | grep pytest` 为空;通过标准:2/2 轮 `EXIT=0` 且无残留进程,届时 B-126 与 B-177-1 同步销号。
|
|
|
+
|
|
|
+### 问题 2:B-177-2(P2)网关瞬态 502 被计成用例红,用例缺 5xx 退避
|
|
|
+
|
|
|
+1. **问题描述**:本机首跑 `shop-api` 4 例 + `dx-bridge` 2 例全红,失败信息为 `expect(...).toBe(200)` 收到 **502**(dx 侧打印 `Expected value: 502`);同一时刻直连 `POST /api/product/list` **3/3 = 200**(0.80/0.12/0.09s),套件复跑 **4/4 绿 + dx 2 跳**。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/shop-sort-api.spec.js:26` `expect(resp.status(),'商品列表接口应 200').toBe(200)` 与 `tests/e2e-live/dx-health-bridge-auth.spec.js:51` 均**未区分「网关 5xx」与「业务拒绝」**,任何瞬时 502 都会变成红例并污染 G2/G6 统计(同 B-148-1 模式,第 2 次复发)。
|
|
|
+3. **最优修改方案**:① 两处请求统一包一层 `fetchWithRetry(request, url, data, {retries:2, backoff:[800,2400]})`,仅对 **5xx/网络错误** 重试;② 断言分型:先判 `status>=500 → test.skip(true,'网关瞬态 5xx')` 并在 report 中注记,再判业务断言;③ 在 `playwright.config.live.js` 增加 `expect: { timeout: 8000 }` 与 `workers: 1`(已为 1)。
|
|
|
+4. **修改目的**:让「红例」只表达产品缺陷或真实契约破坏,避免网关抖动被记成用例失败(G2/G6 可信度),并保留 5xx 的可观测痕迹(skip 原因可查)。
|
|
|
+5. **能否闭环**:能。复测方式:人为对 `cfc.iwintrue.com` 观察窗口内含 5xx 的时段连跑 3 次;通过标准:3/3 次运行中 5xx 被标 skip 且不影响其余用例判定,且 4/4 + 2 跳结果稳定。
|
|
|
+
|
|
|
+### 问题 3:B-152-1/2(P0/P1,第 10 轮承袭)CI 排除清单双向失真
|
|
|
+
|
|
|
+1. **问题描述**:`.gitlab-ci.yml:61` `BACKEND_OBSERVED_CLASSES` 33 类,本轮实测红类 15 类 → **漏拦 8 类**(GrowthPublicEndpointMapping、MembershipPlanPurchaseContract、ShopOrderQueryRefundContract、SupplierOrderFulfillContract、TaskReviewScP11Contract、TeamProfitCronContract、UserServiceWechatLogin、UserServiceWechatLoginContract),**陈旧 26 类**(已绿仍排除)。
|
|
|
+2. **测试 bug 点**:清单为「第 69 轮红类快照」长期未随实测红类集合重生成 → `backend-blocking-junit` **必然失败**(漏拦),而硬门禁覆盖面被人为缩小到 7 类(33−26)。
|
|
|
+3. **最优修改方案**:以本轮 `target/surefire-reports/*.xml` 中 `failures+errors>0` 的 15 类为准重生成清单,并加一条 CI 步骤:跑完 `test-observed` 后用脚本对比「实测红类 ⊆ 清单」,不等则 fail 并打印双向差集。
|
|
|
+4. **修改目的**:恢复 CI 硬门禁的真实拦截力(P0 回归可拦)与最小排除集(避免把已绿类永久排除)。
|
|
|
+5. **能否闭环**:能。复测方式:本地按新清单模拟 `-Dtest='!${BACKEND_OBSERVED_CLASSES}'` 跑一遍;通过标准:排除后剩余类 0 红、且红类全部在清单内(双向差集为空)。
|
|
|
+
|
|
|
+### 问题 4:B-156-1(P1,承袭)`nutrition_age_dosage` 建表 DDL 三重不一致
|
|
|
+
|
|
|
+1. **问题描述**:`schema.sql:5354` 建表语句含 `INDEX idx_product (product_id)` 但表内无 `product_id` 列;实体 `NutritionAgeDosage.java:33-34` 有 `updateTime` 而 DDL 无 `update_time`;`NutritionProductService.java:48` 注入 `ageDosageMapper` 全类零调用。
|
|
|
+2. **测试 bug 点**:无对应 DDL 冒烟断言,`DatabaseInitializer` catch 后仍打「数据表检查完成」→ 表从未创建成功却无任何用例可证伪。
|
|
|
+3. **最优修改方案**:删 `INDEX idx_product`(或补列)、DDL 补 `update_time`、补一条 `SchemaDdlConsistencyTest`:解析 `schema.sql` 每个 `CREATE TABLE` 的列集合,与 `@TableField` 声明集合做差集断言为空。
|
|
|
+4. **修改目的**:让 DDL 缺陷在 CI 阶段暴露,而非靠人工 grep 日志。
|
|
|
+5. **能否闭环**:能。复测方式:本地起一次上下文并 `grep -c SQLSyntaxErrorException`;通过标准:0 命中且新用例绿。
|
|
|
+
|
|
|
+### 问题 5:B-173-2(P1,承袭)API 层入口默认收集 990 例
|
|
|
+
|
|
|
+1. **问题描述**:`tests/playwright.config.api.js:18` `testMatch: /api[\\/].*\.spec\.js$/` → 不带文件参数时 `Running 990 tests`,其中含 `e2e/api/generated/**` 大量生成用例。
|
|
|
+2. **测试 bug 点**:默认入口不可直接用于闭环(会打满线上并产近千假红);本轮沿用「点名 4 文件」规避,属绕过而非修复。
|
|
|
+3. **最优修改方案**:把 `testMatch` 收窄为显式白名单(api-smoke / nonfunc-security / nonfunc-perf-compat / traceability-* 等 4-6 个),`generated/**` 独立成 `api-generated` project 并默认 `grep-invert` 排除。
|
|
|
+4. **修改目的**:默认入口可安全直跑,避免 CI/新人误触。
|
|
|
+5. **能否闭环**:能。复测方式:`npx playwright test -c playwright.config.api.js`(不带参数);通过标准:`Running` 数与白名单一致(≈32),0 红。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、覆盖缺口清单
|
|
|
+
|
|
|
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|----------|------|------|--------------|--------|----------|
|
|
|
+| 1 | 变异测试 | 无 pitest | 断言强度不可证 | 对 `energy/` + `membership` 两包做 pitest 增量(阈值 60%) | P2 | 引入插件 + CI 增量门禁 |
|
|
|
+| 2 | 依赖漏洞 | 无 SCA | 供应链风险 | `mvn dependency-check` + `npm audit --omit=dev` | P2 | 需联网授权后纳入周跑 |
|
|
|
+| 3 | 无障碍 | 无 a11y 断言 | 合规/可及性 | `@axe-core/playwright` 对 admin 登录页 + fe 首页各 1 例 | P2 | 新增 `e2e-live/a11y.spec.js` |
|
|
|
+| 4 | 兼容性矩阵 | 仅移动视口 | 多端渲染差异 | Chromium/WebKit 双 project | P2 | 配置 `projects` 增 webkit |
|
|
|
+| 5 | 可靠性 | 无长稳/混沌 | 上游抖动无度量 | 对 251 LLM 链路做 30min 小流量长稳(并发 1) | P1 | 需授权联网后执行 |
|
|
|
+| 6 | 追溯锚点 | 115/861 = 13.4% | 台账与执行脱节 | 按「孤儿锚点/空转 TC」双向差集补齐(承 B-170-4) | P1 | 逐域回填 + 矩阵 §10 刷新 |
|
|
|
+| 7 | 场景映射 | 155/215 = 72.1% | 场景未全覆盖 | butler/human-butler/deep-dive-*/vendor 四域 0 锚点优先 | P1 | 补 TC 并挂锚点 |
|
|
|
+| 8 | UAT | 无人工验收 | 业务验收缺口 | 双角色(家长/规划师)人工脚本 1 份 | P3 | 纳入里程碑评审 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、门禁结论
|
|
|
+
|
|
|
+| 门禁 | 阈值 | 本轮 | 判定 |
|
|
|
+|------|------|------|------|
|
|
|
+| G1 全量通过率 | ≥98% | 97.81%(剔 skip 98.43%) | ❌ |
|
|
|
+| G2 红例数 | ≤20 | **62**(后端 39 + 根级 16 + 前端 3 + lg 4) | ❌ |
|
|
|
+| G3 预期 RED | 全部有需求依据 | 3(S-cfc-132/133)+ 后端契约 17 | ⚠️ |
|
|
|
+| G4 管理端套件 | 116/116 | **116/116** | ✅ |
|
|
|
+| G5 编译/产物 | 0 编译错 + 0 dump | 0 错 / 0 dump / 368 XML 无沉默 / classes 2330 | ✅ |
|
|
|
+| G6 浏览器 E2E | 28/28 | **28/28 + 2 跳** | ✅ |
|
|
|
+| G7 langgraph | 51/51 | **47/51(92.2%)** | ❌ |
|
|
|
+| G8 线上鉴权 | 匿名 6/6 = 401 | **6/6 = 401** | ✅ |
|
|
|
+| G9 追溯锚点 | ≥60% | **13.4%(115/861)** | ❌ |
|
|
|
+| G10 双节点实派 | 189 + 251 均实派 | 189 **5/5 EXIT=0** + 251 **51 例** | ✅ |
|
|
|
+| G11 CI 硬门禁 | 清单与实测红类一致 | 漏拦 8 类 / 陈旧 26 类 | ❌ |
|
|
|
+| G12 SRS 闸门 | 变更即更新用例 | 窗口零变更 → 0 新增(合规) | ✅ |
|
|
|
+| G13 存量红零漂移 | 无新增漂移 | 39 红 = 存量 17 + GrowthPublic 5 + 预期 17(第 23 次一致) | ✅ |
|
|
|
+| G14 场景映射 | ≥80% | **72.1%(155/215)** | ❌ |
|
|
|
+
|
|
|
+**综合结论:不通过(承袭)。**
|
|
|
+
|
|
|
+- 通过项:G4/G5/G6/G8/G10/G12/G13;预期 RED 有需求依据(G3 ⚠️)。
|
|
|
+- 未通过项:G1(97.81%)、G2(62 红)、G7(4 红环境)、G9(13.4%)、G11(CI 清单失真)、G14(72.1%)。
|
|
|
+- **放行意见**:本轮零功能源码变更、存量红零漂移 → **无新增回归风险**,可作为「维持现状」基线;但 G11 CI 清单失真(P0)与 langgraph 上游配额(P0)必须先修,否则门禁不具备拦截力。
|
|
|
+- **复评条件**:① CI 清单按实测红类重生成且双向差集为空;② langgraph 连续 2 轮 51/51;③ 后端存量 17 红清零(B-13/B-18 装置修复)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、向研发提出的改进建议(按优先级)
|
|
|
+
|
|
|
+1. **P0 · CI**:按本轮 15 红类重生成 `BACKEND_OBSERVED_CLASSES`,并加「实测红类 ⊆ 清单」自检步骤(B-152-1/2,第 10 轮)。
|
|
|
+2. **P0 · 运维**:251 节点更换有效 LLM 密钥(`****ab12` 已失效)+ 提升配额;恢复后连续 2 轮 51/51 才销号(B-142-2)。
|
|
|
+3. **P1 · langgraph**:修 `JavaClient` 关闭逻辑(`await client.aclose()`),消除 pytest 退出挂死(B-177-1);派发器同步加 `timeout` 兜底。
|
|
|
+4. **P1 · 数据库**:修 `nutrition_age_dosage` DDL 三处不一致并补 DDL 一致性用例(B-156-1)。
|
|
|
+5. **P1 · 测试资产**:把 3 个未入库测试文件(GrowthPublic 等)正式入库或删除,消除 5E 噪声(B-162-1)。
|
|
|
+6. **P1 · 契约实现**:推进 S-cfc-166/168/169(会员购买/商城退款/供应商履约/任务审核)实现,消化 17 例预期 RED。
|
|
|
+7. **P2 · 用例健壮性**:live 套件统一 5xx 退避 + 断言分型(B-177-2)。
|
|
|
+8. **P2 · 度量**:API 层 `testMatch` 收窄,避免默认收集 990 例(B-173-2)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、下轮工作计划
|
|
|
+
|
|
|
+1. 后端按「采信不超过 2 轮」纪律:R178 可采信本轮实测数据,R179 必须再实跑。
|
|
|
+2. langgraph 继续实派 251,目标 51/51(连续 2 轮才销号)。
|
|
|
+3. 浏览器双节点(189 admin + 本机 fe/shop/health/dx)保持每轮实派。
|
|
|
+4. 追 S-cfc-166/168/169 与 B-156-1 修复状态,修复即做增量复验并回填台账。
|
|
|
+5. 推进 B-177-1/B-177-2 自处置(派发器 timeout + live 套件 5xx 退避),下轮验证。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录 A:本轮执行命令(可复现)
|
|
|
+
|
|
|
+```bash
|
|
|
+# 后端(Maven 工程根在 cfc-backend,非仓库根)
|
|
|
+cd /d/cfc/cfc-backend && export JAVA_HOME=/d/jdk1.8.0_25 \
|
|
|
+ && /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test # 42m08s
|
|
|
+
|
|
|
+# langgraph@251(LOG 必须排除 MSYS 路径改写)
|
|
|
+MSYS2_ENV_CONV_EXCL=LOG LOG=/tmp/r177_pytest.log \
|
|
|
+ node docs/tdd/tools/dispatch_251_pytest.cjs kick
|
|
|
+
|
|
|
+# 浏览器(必须在 tests/ 内跑)
|
|
|
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile
|
|
|
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge
|
|
|
+cd tests && npx playwright test -c playwright.config.health.js
|
|
|
+node docs/tdd/tools/dispatch_189_admin.cjs # 189 admin 5/5
|
|
|
+
|
|
|
+# Jest
|
|
|
+cd cfc-frontend && npx jest --silent # 624 = 609/3/12
|
|
|
+cd cfc-web && npx jest --silent # 116/116
|
|
|
+cd tests && npx jest --silent # 23 = 7/16
|
|
|
+
|
|
|
+# 线上 API 非功能层(点名 4 文件,规避 B-173-2)
|
|
|
+cd tests && npx playwright test -c playwright.config.api.js \
|
|
|
+ e2e/api/api-smoke.spec.js e2e/api/nonfunc-security.spec.js \
|
|
|
+ e2e/api/nonfunc-perf-compat.spec.js e2e/api/traceability-p94-p95-c26.spec.js
|
|
|
+```
|
|
|
+
|
|
|
+## 附录 B:口径说明
|
|
|
+
|
|
|
+- 通过率 = 通过数 / 执行数(分母含 skip);「剔 skip」= 通过数 / (执行数 − skip)。
|
|
|
+- 后端红例按 surefire XML `failures+errors` 聚合(368 XML 全覆盖,无沉默报告)。
|
|
|
+- 场景/用例度量口径来自 `docs/tdd/tools/test_report_metrics.py --repo-root . --scene`(跨轮固定)。
|
|
|
+- 浏览器用例计数含 2 个 dx skip(端点 404;`docs/superpowers/specs/2026-11-08-dx-health-bridge.md` 明示「仅登记不实现」)。
|