Răsfoiți Sursa

test(tdd): 测试负责人 2020 轮 · 第 60 轮·干净基线全量实跑 231类/1847例/1727绿(93.50%)·红类36红例116与18:09基线零漂移·唯一变量GuideConfigServiceTest 11绿·前端386/386·根级11/23·pytest 24/43 | 归因 A51/B19/C20/契约3/待核实23·修完A类G1可达96.26% | B-22收口(鉴权清单27路径参数化28/28)·新增B-27(参数化口径)/B-28(分支切换致59轮报告与B-26/O-5在cfclub丢失)·B-26根因细化为when(mock).method()误用 | 场景溯源149/244=61.1%·可执行仅5/244 | 门禁不通过(有条件)

E2E Test Bot 6 zile în urmă
părinte
comite
1c94fbddd2

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
docs/tdd/orchestration/pending.md


+ 380 - 0
docs/tdd/test/automation-run-2026-11-06-2020.md

@@ -0,0 +1,380 @@
+# 测试负责人工作汇报 · 2026-11-06 20:20(定时自动化 · 第 60 轮)
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(cfc-tester) |
+| 汇报周期 | 2026-11-06 19:20 ~ 2026-11-06 20:20(第 60 轮) |
+| 负责模块/单元 | cfc-backend(358 控制器)/ cfc-frontend / cfc-web / tests 根级 / cfc-langgraph |
+| 执行档 | **review 档(离线)** — 不联网、不装依赖、不启停服务、不改源码、不推送业务代码 |
+| 基线 | 干净基线 `origin/cfclub` = **`e4ce9f80a`**(独立 worktree `D:\_wt_r2000`)。**跑测窗口内 HEAD 发生漂移**:19:41 仓库被切到 `cfclub` 分支(`df7f60af5`,merge `da2727f53`+`e205656ee`);`e4ce9f80a` 为其祖先,且 `e4ce9f80a..df7f60af5` 的 `cfc-backend/src`/`cfc-langgraph`/`tests` **零 diff** → 后端/pytest/根级结果对本 HEAD 有效;前端在 `df7f60af5` 上**复跑确认** 296/296 + 90/90 |
+| 环境 | JDK 1.8.0_25 + Maven 3.6.1 + `-o` 离线;9082 后端在听(IDE 实例);远程 MySQL 16.251:3306 由 9082 进程持有 ESTABLISHED → **可达**(非「DOWN」,修正上轮口径) |
+
+> **为何用独立 worktree**:主工作区 37 项 WIP 中有 11 个 integration 测试文件未提交,且 `ArticleControllerTest` 的 WIP 写法本身编译不过(B-26 已细化根因)→ 主工作区 `mvn testCompile` 不可用。按测试批次隔离纪律(需求 B)在 `git worktree add --detach origin/cfclub` 干净基线上执行全量,**零侵入主工作区 WIP**。
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **本轮新增测试用例数*** | **0** | 无新 SRS/场景变更(见 SRS 闸门),测试角色不造用例 |
+| **本轮验证执行测试数*** | **2299** | 后端全量 1847 + 小程序 296 + 管理端 90 + 根级 23 + pytest 43(全部本轮实跑,无采信) |
+| **用例通过率** | **93.43%** | = 2148 PASS ÷ 2299 执行 |
+
+**分模块通过率**:后端 **93.50%**(1727/1847,剔 8 例环境红后 93.94%);小程序 **100%**(296/296);管理端 **100%**(90/90);根级 **47.83%**(11/23);pytest **55.81%**(24/43)。
+
+**SRS 闸门**:`git log --since="2026-11-06 18:40" -- docs/superpowers docs/33 docs/10 tests/user-scenarios tests/test-cases` → **零提交** → 本轮无需因需求/场景变更新增用例。
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **分派任务数*** | **0** | 测试角色不派发(纪律) |
+| **恢复智能体会话数*** | **0** | — |
+| **当前在用会话数** | **0** | 全部执行在本工作区 + 独立 worktree 完成 |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|---------|----------|----------|---------------|----------|------|
+| —(本轮无会话) | — | — | 测试执行由负责人本机完成 | — | **不干净**(37 项未提交:11 integration 测试 + 8 langgraph 测试 + 3 台账 + 根级分析产物;19:41 分支切换时被携带至 `cfclub`) | 研发侧 WIP 由研发/主理人收口(O-5);测试角色不代提交 |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 说明 |
+|------|------|------|
+| **新测试发现问题数*** | **3** | ① **B-26 根因细化**:WIP 的修复写法 `when(articleService).recordRead(...)` 属 Mockito API 误用(`when(mock)` 返回 `OngoingStubbing`,无 `recordRead` 方法),正确写法为 `when(articleService.recordRead(...))`;② **B-27 新增**:`@Test` 恒等式在引入 `@ParameterizedTest` 后失效(差值 26 例),度量口径须修订;③ **B-28 新增**:19:41 分支切换(`feature/report-upload-product-cards` → `cfclub`)后,第 59 轮报告与 B-26/O-5 台账条目在 `cfclub` **不可见**——测试交付物跨分支未合并 |
+| **已解决测试相关问题数*** | **1** | **B-22 部分收口**:`JwtInterceptorLoginRequiredPathTest` 28/28 全绿 —— `LOGIN_REQUIRED_PATHS` 全条目「无 token → 401」参数化契约已落地(27 路径展开 + 1 主用例),历史「鉴权清单零断言守护」缺口闭环 |
+| **待解决测试相关问题数** | **7** | P0:B-26/O-5 主工作区 WIP 阻断、B-28 台账跨分支丢失;P1:B-18(A 类 51 例)、B-13(环境 8 例)、P-2 契约 3 红、B-19(pytest 19 红);P2:G6 无 CI、G-1 场景溯源缺口 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| `1767d4414` | health.report.createReport(YELLOW 实现) | YELLOW | 实现 | origin/cfclub | **是**(IN CHAIN ✓) | 本轮 `merge-base --is-ancestor` 复核 |
+| `c3e32460a` | dan.assessment.getActiveMaterial(YELLOW 实现) | YELLOW | 实现 | origin/cfclub | **是**(IN CHAIN ✓) | 同上 |
+| `81d8883f7` | health.report.createReport(RED 测试) | RED | 测试 | origin/cfclub | **是**(IN CHAIN ✓) | 同上 |
+| `faf3ca174` | dan.assessment.getActiveMaterial(RED 测试) | RED | 测试 | origin/cfclub | **是**(IN CHAIN ✓) | 同上 |
+| 本轮报告提交 | 第 60 轮汇报 + 台账 | — | 文档 | cfclub | 见推送回执 | 仅文档,不触碰研发 WIP |
+| `963bedae7` | 第 59 轮汇报 + B-26/O-5 首登 | — | 文档 | `origin/feature/report-upload-product-cards` | **是**(该分支 IN CHAIN ✓) | ⚠️ **不在 `cfclub` 分支**:19:41 分支切换后,第 59 轮报告与 B-26/O-5 条目在 `cfclub` **不可见**(见 B-28) |
+
+### 1.5 状态机阶段分布(全局进度)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | — |
+| RED | 0 | — |
+| YELLOW | 0 | — |
+| GREEN | **5** | health.report.createReport / dan.assessment.getActiveMaterial / guide.trainingPlan.getPlanDetail / admin.auth.login / health.report.upload(16:58 O-2 方案 A 收口,本轮**连续第 3 轮维持**) |
+| DONE | 0 | GREEN 键待部署链验证 |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | CFC 未启用 SRS 池,`srs_section` 配置为空池口径,非静默失效 |
+| 契约常量(contract) | 358 控制器 / 1935 `@PostMapping` | 正常 | `discovery.md` 兄弟批次口径一致 |
+| 测试用例引用(test_case_map) | 跨源 3122 | 正常 | md 784 + Playwright 443 + Python 67 + Java `@Test` 1828 + 场景 11 |
+| 执行结果回填(case_results) | 2299(本轮实跑) | 正常 | 全部本轮实测,非采信 |
+
+---
+
+## 二、20 类测试覆盖矩阵(三态 · 证据)
+
+> 「已发现」= 扫描命中且本轮有实跑证据;「未发现」= 扫描未命中(**不等于项目没做**);「待核实」= 证据不足。
+
+### 功能层次(5 类)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|----------|------|------|
+| 1 | 单元测试 | **已发现** | 231 测试类 / 1847 例 surefire 全量实跑(本轮) |
+| 2 | 组件测试 | **已发现** | cfc-frontend 14 套件 296 例、cfc-web 12 套件 90 例,全绿(本轮) |
+| 3 | 集成测试 | **已发现** | 后端 `integration/**` 测试类;根级 `tests/integration` 23 例(12 红 = B-16 凭据缺失) |
+| 4 | 接口/API 测试 | **已发现** | 契约 19 类 240 例 → 236 绿 / 4 红(3 P-2 口径 + 1 S-cfc-31) |
+| 5 | 系统/端到端测试 | **待核实** | Playwright 75 spec / 443 例存在但**未授权联网未实测**;UI 级因 `cfc.iwintrue.com` 无前端页不可跑 |
+
+### 功能保障(4 类)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|----------|------|------|
+| 6 | 冒烟测试 | **已发现** | 根级 `tests/unit/**` 快检 + 每轮全量 clean 首段;冒烟脚本 `_smoke_frontend_1657.cjs` 为未入库 WIP |
+| 7 | 回归测试 | **已发现** | 本轮 `mvn -o -B clean test` 全量重跑,红类/红例逐类对账 |
+| 8 | 验收测试(UAT) | **未发现** | 全仓无 UAT 脚本、签核记录或验收清单(`sc-key-map.md` 仅计数,不含签核) |
+| 9 | 探索性测试 | **未发现** | 无 chartered 探索会话记录、无 session 笔记 |
+
+### 非功能(6 类)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|----------|------|------|
+| 10 | 性能测试 | **未发现** | 无压测脚本/基线;`pom.xml` 无 gatling/jmeter 依赖 |
+| 11 | 可靠性测试 | **未发现** | 无故障注入、无恢复演练、无长稳记录 |
+| 12 | 安全测试 | **待核实** | 无 SAST/DAST 工具(无工具未实测);仅历史 `npm audit` 记录(201 项,1 项运行时高危 axios) |
+| 13 | 兼容性测试 | **未发现** | 无浏览器/机型矩阵;小程序仅单端(微信) |
+| 14 | 可用性测试 | **未发现** | 无用户可用性实验/任务完成率记录 |
+| 15 | 无障碍测试 | **未发现** | 无 axe/WCAG 扫描 |
+
+### 度量与流程(5 类)
+
+| # | 测试类型 | 三态 | 证据 |
+|---|----------|------|------|
+| 16 | 覆盖率 | **未发现** | `pom.xml` 无 jacoco 插件;仅以「同名测试类」替代口径(严 28/358 = 7.8%,宽 44/358 = 12.3%) |
+| 17 | 变异测试 | **未发现** | 无 pitest 插件 |
+| 18 | 缺陷度量 | **已发现** | `blockers.md` B-1~B-26 台账 + 本轮新增 B-27,含类型/路由/状态/时间 |
+| 19 | QA 流程 | **已发现** | TDD 状态机(5 键 GREEN)+ 三通道文档(blockers / test-requests / pending)+ 门禁表 |
+| 20 | 代码审查 | **已发现** | 本轮代码级观察 3 项(Mockito 误用、参数化口径、接口 410 未同步用例),见 P-1~P-3 |
+
+**矩阵小结**:20 类中 **已发现 9 / 待核实 3 / 未发现 8**。8 类「未发现」集中在非功能(性能、可靠性、兼容、可用、无障碍)与度量(覆盖率、变异)及流程(UAT、探索)——这是「所有用例覆盖所有 SRS 与用户场景」目标的**结构性缺口**,非本轮可补齐。
+
+---
+
+## 三、本轮实测结果(核心证据)
+
+### 3.1 后端全量(干净基线 `e4ce9f80a`,`mvn -o -B clean test`,42:11,BUILD SUCCESS)
+
+| 指标 | 数值 |
+|------|------|
+| 执行类 / 用例 | **231 类 / 1847 例** |
+| 通过 | **1727** |
+| 失败(F) / 错误(E) / 跳过(S) | 70 / 46 / 4 |
+| 通过率 | **93.50%**(剔 8 例环境红 = **93.94%**) |
+| 红类 / 红例 | **36 类 / 116 例**(环境 8 + 非环境 108) |
+| testCompile | **232 源 0 错**(B-10 连续第 15 轮无复发) |
+| 完整性 | 源测试类 231 / 报告 231 / **沉默 0** / `.dump` 0 |
+| Maven 末行 vs XML 聚合 | `Tests run: 1847, F 70, E 46, S 4` **完全一致** |
+| 口径恒等式 | `@Test 1838 − 20(3 类 @Disabled)+ 3(占位)+ 26(@ParameterizedTest 展开 27−1)= 1847` ✓ |
+
+### 3.2 与上一全量基线(18:09 兄弟批次 230 类 / 1836 例 / 93.46% / 红类 36)对账
+
+| 项 | 上轮 | 本轮 | Δ |
+|----|------|------|---|
+| 类 | 230 | 231 | **+1** |
+| 用例 | 1836 | 1847 | **+11** |
+| 通过 | 1716 | 1727 | **+11** |
+| 红例 | 116 | 116 | **0** |
+| 红类 | 36 | 36 | **0** |
+| 通过率 | 93.46% | 93.50% | **+0.04pp** |
+
+**唯一变量**:新增 `GuideConfigServiceTest` **11/11 全绿**(对应 `d007f45d4..e4ce9f80a` 的 `GuideConfigService` +178 行改造)。除该新增类外红类集合与红例数零漂移 → **无新回归**。
+
+> 附注:`D:\_surefire_pre1716` 备份经聚合为 230 类 / 1817 例 / 96.20%,与 18:09 台账(1836 例)不符——系一次**不完整批次**的报告残留,**不可作基线**,已在本轮排除。
+
+### 3.3 契约类实测(19 类 / 240 例)
+
+| 契约类 | 结果 | 备注 |
+|--------|------|------|
+| JwtInterceptorLoginRequiredPathTest | **28/28 ✅** | **B-22 收口**:27 条鉴权路径参数化 401 |
+| AdminAuthControllerLoginContractTest | 15/15 ✅ | admin.auth.login |
+| HealthReportControllerCreateReportTest | 5/5 ✅ | 连续多轮稳定 |
+| HealthReportControllerUploadTest | 16/16 ✅ | — |
+| HealthDimensionControllerUploadContractTest | 21/21 ✅ | — |
+| DanAssessmentControllerGetActiveMaterialTest | 3/3 ✅ | — |
+| TrainingPlanControllerGetPlanDetailTest | 8/8 ✅ | — |
+| TaskControllerCreateTaskTest / TaskServiceReviewTest / TaskControllerReviewTest | 7+15+17 ✅ | B-21 收口后连续第 4 轮 |
+| CfBalanceControllerTest | 8/8 ✅ | B-10 无复发 |
+| DimensionRegistryTreeTest / DimensionAdminControllerTest | 9+13 ✅ | — |
+| HealthDimensionControllerTest | 15/15 ✅ | B-18 自修后稳定 |
+| RewardEstimateControllerEstimateTest / RewardRuleServiceEstimateTest | 11+21 ✅ | SC-X-22 32/32 |
+| GuideConfigServiceTest | 11/11 ✅ | **本轮新增类,首跑全绿** |
+| **DimensionRegistryMapContractTest** | **4/7 ❌ 3 红** | P-2 口径未决(承袭,非新回归) |
+| **SleepConfigTagsMechanismContractTest** | **9/10 ❌ 1 红** | S-cfc-31 blank-key 缺陷(承袭) |
+
+### 3.4 前端 / 根级 / pytest
+
+| 套件 | 结果 |
+|------|------|
+| cfc-frontend(小程序) | **296/296 ✅**(14 套件,34.2s) |
+| cfc-web(管理端) | **90/90 ✅**(12 套件,40.4s) |
+| tests 根级 | 23 例 **11 绿 / 12 红**(3 套件全红) |
+| cfc-langgraph pytest | 43 例 **24 绿 / 19 红**(55.81%,25.2s) |
+
+**根级 12 红定形(B-16 承袭)**:`mini-games-api.spec.js` 10 例 `Expected 200/403/400, Received 401`(无 token);`plan-chain.spec.js` 2 例登录 `500 用户不存在`(`ADMIN_PHONE`/`ADMIN_PASSWORD` 为空)。**测试侧凭据夹具缺失,非生产缺陷。**
+
+**pytest 19 红定形(B-19 承袭)**:C 环境 14 例(`401 api key ****ocal is invalid` → analyze 2 / auto_tag 5 / chat 1 / intent 4 / report_parse 2 路径写死容器路径);A 漂移 5 例(`test_graph` 2 pydantic 字段名、`test_memory` 3 `MemoryManager.__init__` 缺 `embeddings`)。
+
+---
+
+## 四、SRS / 用户场景覆盖分析(对用户目标的直接回答)
+
+用户目标:**所有用例通过 + 所有用例覆盖所有 SRS 与用户场景(含异常流)**。本轮量化结论:
+
+| 维度 | 现状 | 达成 |
+|------|------|------|
+| 用例通过率(全量可执行) | 2148/2299 = **93.43%** | ❌ 未达「全部通过」 |
+| 后端通过率 | 1727/1847 = **93.50%** | ❌ |
+| 前端通过率 | 386/386 = **100%** | ✅ |
+| 用户场景总量 | **244 个** `SC-角色-NN`(11 个场景文件) | — |
+| 场景被任何测试资产引用 | **149 / 244 = 61.1%** | ❌ 95 个场景零引用 |
+| 场景被**可执行自动化**(spec.js)直接引用 | **5 / 244 = 2.0%** | ❌ 严重不足 |
+| 场景被 Java 测试引用 | **6 / 244 = 2.5%** | ❌ |
+| 结构化用例(TC) | 492 条(基础 255 + **异常流 237**,异常流占 **48.2%**) | ✅ 异常流用例设计覆盖充分 |
+| 结构化用例自动化落地 | 大部分为 md 规格,未与自动化资产一对一绑定 | ❌ 设计→执行断层 |
+| 控制器逐类覆盖(严口径) | 28 / 358 = **7.8%** | ❌ |
+| 控制器逐类覆盖(宽口径) | 44 / 358 = **12.3%** | ❌ |
+
+**结论**:**异常流「用例设计」覆盖良好(48.2%)**,但**场景→用例→可执行自动化**的链路只走通 61.1%(溯源)和 2.0%(可执行)。「所有用例覆盖所有 SRS 与场景」目前**未达成**,且缺口不在用例数量,而在**绑定与自动化**。
+
+---
+
+## 五、覆盖缺口清单
+
+| 编号 | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|------|----------|------|------|--------------|--------|----------|
+| G-1 | 场景溯源 | 95/244 场景无任何用例引用 | 需求变更无法回归定位 | 每个 SC 至少绑定 1 个 TC 或 1 个 spec 用例(`sc-key-map.md` 增「用例锚点」列) | P1 | 补锚点后重跑 inventory,场景引用率 ≥95% |
+| G-2 | 场景可执行 | 仅 5/244 场景被 spec.js 引用 | 场景「文档化」而非「可执行」 | 按 `SC-角色-NN` 命名 Playwright API 级用例,覆盖主流程 + 异常流 | P1 | Playwright API 档实跑,SC 通过数 ≥236 |
+| G-3 | A 类装置缺陷 | 51 例 / 15 类(Mockito 误用、桩过期、断言漂移) | 通过率被压 6.5pp | 逐类修装置(P-1 清单) | **P0** | 修完全量复跑,通过率 ≥96.26% |
+| G-4 | B 类生产疑点 | 19 例 / 9 类(1 例确认缺陷 S-cfc-31) | 真实缺陷可能漏出 | 逐个定位生产帧,确认缺陷后转 RED 任务 | P1 | 研发确认后复跑,红例 ≤5 |
+| G-5 | 环境红 | 8 例 / 3 类硬编码 `127.0.0.1:3306` | 每轮恒红,噪声掩盖真回归 | 统一 `application-test.yml` 指向 16.251 测试库(B-13) | P1 | 3 类转绿 |
+| G-6 | 契约口径 | 3 例 MapContract 红(null vs "" / 400 vs 200) | 口径不明导致长期承袭 | 主理人拍板期望值后修断言或实现 | P1 | 契约 240/240 绿 |
+| G-7 | CI 缺失 | 无流水线自动跑 | 契约绿是瞬时绿(B-21 已证) | 最小 CI:离线 `mvn surefire` + 两个 jest 套件 | P1 | CI 首次绿后纳入门禁 |
+| G-8 | 覆盖率工具 | 无 jacoco / pitest | 无法量化行覆盖与变异杀除 | 加 jacoco(`report` 阶段)+ pitest(限定 core 包) | P2 | 产出覆盖率报告并入 CI |
+| G-9 | E2E 未实测 | 75 spec / 443 例从未在本地跑 | 用例腐化不可见(上轮已发现 2 条过期路径) | 使用 `playwright.config.api.js`(无 globalSetup,不 reset 共享库) | P1 | 授权联网后 API 级实跑 ≥95% |
+| G-10 | pytest 19 红 | 55.81% | AI 服务链路质量不可见 | mock LLM client + 修路径/字段名 | P1 | pytest ≥95% |
+| G-11 | 长期 @Disabled | 3 类 20 例(+1 方法级) | 静默不测 | 建 seed 夹具后解禁 | P2 | `Skipped` 降至 0 |
+| G-12 | 资产入库 | 主工作区 37 项 WIP(含 11 integration 测试) | `git clean` 即丢(B-15/B-23 已发生) | 研发/主理人收口,测试文件入库纳入 DoD | **P0** | `--clean-check` 退出码 0 |
+
+---
+
+## 六、向研发提出的改进建议(五要素)
+
+### P-1 · A 类 51 例集中修复(最高杠杆)
+
+1. **问题描述**:后端 36 红类 116 红例中,**51 例(15 类)为测试侧装置/断言缺陷**,与生产代码无关。
+2. **测试 bug 点**:
+   - `ArticleControllerTest.java:201/215/226` — `doNothing().when(articleService).recordRead(...)`,`ArticleService.recordRead` 返回 `Map<String,Object>`(`ArticleService.java:409`)→ `Only void methods can doNothing()`
+   - `ProductOrderServiceFulfillmentMultiModeTest` 3 例 `Misplaced or misused argument matcher`;`ProductControllerTest:3 例` `Invalid use of argument matchers! 3 matchers expected, 1 recorded`
+   - `CfCommissionServiceSettleTest` 8 例 `Wanted but not invoked: cfBalanceService.earnByRule(...)`
+   - `ProductOrderServiceUpdateExpressFieldTest` 3 例 `Argument(s) are different! Wanted: wechatService.uploadShippingInfo(...)`
+   - `AuthControllerTest` 4 例期望 `500/200` 实得 `410`(接口已按 AGENTS.md 标记 410 Gone,用例未跟进)
+   - `ArticleWorkflowTest` 3 例文案 `仅已驳回的文章可重新编辑` vs 实际 `仅已驳回或已撤回的文章可重新编辑`;`WishControllerTest` 2 例 `childId`→`memberId`
+3. **最优修改方案**:按类批量修——① Mockito:改 `doNothing()`→`when(service.method(...)).thenReturn(...)`;② matcher:全部参数统一 `eq()/any()`,禁止混用裸值;③ 桩名/参数对齐当前签名;④ 断言基线按 410/5001/新文案更新。
+4. **修改目的**:消除「零信号红」,让红例重新具备回归价值;直接抬升 G1。
+5. **闭环验证**:修完跑 `mvn -o -B clean test` → 通过率 **96.26%**(1727+51)/1847,红类 36→21,红例 116→65;要求红类集合差集恰为这 15 类、其余类逐字段零漂移。
+
+### P-2 · B-26 主工作区 WIP 修法错误(阻断 testCompile)
+
+1. **问题描述**:主工作区 11 个 integration 测试文件未提交且编译不过,`mvn testCompile` 失败,主工作区全模块测试不可用。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleControllerTest.java:201/215/226` —— WIP 改为 `when(articleService).recordRead(eq(1L), isNull(), isNull(), eq(30)).thenReturn(new HashMap<>())`,但 `when(T mock)` 返回 `OngoingStubbing<T>`,其**没有** `recordRead` 方法 → `找不到符号`。
+3. **最优修改方案**:改为 `when(articleService.recordRead(eq(1L), isNull(), isNull(), eq(30))).thenReturn(new HashMap<>())`(方法调用放进 `when(...)` 内),并同批检查 `getPublicList`/`getFeatured` 8 处参数个数是否与当前签名一致。
+4. **修改目的**:恢复主工作区 `testCompile`,使全模块测试可在主线工作区执行(当前只能靠 worktree 旁路)。
+5. **闭环验证**:`mvn -o -B test-compile` 0 错 → 主工作区跑全量 → 与 worktree 干净基线(231 类 / 1847 例 / 93.50%)逐类对账差异 ≤0。
+
+### P-3 · B-27 度量口径:`@Test` 恒等式失效
+
+1. **问题描述**:本轮 `@Test 1838 − 20 + 3 = 1821`,与 surefire 实际执行 1847 **差 26**,历史沿用的恒等式不再成立。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredPathTest.java:62` 引入 `@ParameterizedTest + @MethodSource`,单注解展开为 27 个用例(该类 surefire `tests=28`)。
+3. **最优修改方案**:口径公式修订为 `@Test − 类级@Disabled + 占位 + Σ(参数化展开数−1) = 执行数`;建议在 `docs/tdd/test/` 固化 `count_identity.py` 入库,消除人工口径漂移(B-15/B-26 同源)。
+4. **修改目的**:保证跨轮用例数可比,避免「新增用例被漏记/错记」。
+5. **闭环验证**:脚本对大仓输出恒等式误差 0,并在下一轮报告直接引用脚本输出。
+
+### P-4 · G-1/G-2 场景绑定缺失
+
+1. **问题描述**:244 个用户场景中仅 149 个被任何测试资产引用(61.1%),仅 5 个被可执行 spec 引用(2.0%)。
+2. **测试 bug 点**:`tests/user-scenarios/*.md` 的 `SC-*` 与 `tests/test-cases/*.md` 的 `TC-*` 无稳定双向锚点;`sc-key-map.md` 只记「跑通计数」不记用例锚点。
+3. **最优修改方案**:`sc-key-map.md` 增加「用例锚点」列(`TC-xx` / `spec 文件:行`);对 95 个零引用场景逐个补 TC 或标注「不适用(附理由)」。
+4. **修改目的**:把「SRS/场景覆盖」从文档口径变为可核验口径。
+5. **闭环验证**:重跑 `test_inventory.py`,场景引用率 ≥95%,零引用场景全部有「不适用」理由。
+
+### P-5 · B-13 环境红 8 例(每轮恒红)
+
+1. **问题描述**:3 个 `@SpringBootTest` 类硬编码 `jdbc:mysql://127.0.0.1:3306`,本机无 MySQL → `Failed to load ApplicationContext`,8 例每轮必红。
+2. **测试 bug 点**:`AdminFamilyOverviewControllerTest.java:21-22`、`service/FamilyAdminOverviewServiceTest`、`service/UserServiceFamilyNameLinkTest`。
+3. **最优修改方案**:改 `@ActiveProfiles("test")` + 新增 `src/test/resources/application-test.yml` 指向 192.168.16.251 测试库(池上限 4;本轮已确认该库可达)。
+4. **修改目的**:消除 8 例恒红噪声,使「真回归」不被淹没。
+5. **闭环验证**:3 类转绿,红例 116→108。
+
+### P-6 · S-cfc-31 blank-key 缺陷(唯一确认生产缺陷)
+
+1. **问题描述**:sleep tags 配置公开读接口对空 key 返回 200,而非错误码。
+2. **测试 bug 点**:`SleepConfigTagsMechanismContractTest.publicValue_blankKey_returnsError:99` — `expected: <500> but was: <200>`。
+3. **最优修改方案**:服务端补 blank-key 入参校验(返回统一 `Result` 错误码)。
+4. **修改目的**:闭合异常流入参校验缺口(该场景属「异常流」必测项)。
+5. **闭环验证**:该契约 10/10 绿,契约 240/240 绿。
+
+---
+
+## 七、本轮阻塞与风险
+
+| 阻塞项 | 影响范围 | 阻塞类型 | 处置进展 | 需要协调 |
+|--------|----------|----------|----------|----------|
+| 主工作区 WIP 阻断 testCompile(B-26 / O-5) | 主工作区全模块测试不可用 | 研发 | 已用 worktree 干净基线旁路完成全量;本轮细化出正确修法(P-2) | 研发收口 11 个 integration 测试文件;主理人裁决 O-5 |
+| **测试交付物跨分支丢失(B-28)** | 第 59 轮报告 + B-26/O-5 在 `cfclub` 不可见 | 研发/流程 | 本轮已据实测重建 B-26/O-5 并写入 `cfclub` 分支 | 主理人裁决:测试交付物是否随主线分支合并(建议 `git cherry-pick 963bedae7` 或合并 feature 分支) |
+| 环境红 8 例硬编码 127.0.0.1:3306(B-13) | 3 类恒红 | 测试(环境) | 待修(P-5) | 研发改 test profile |
+| 场景溯源 61.1% / 可执行 2.0%(G-1/G-2) | 「全覆盖」目标不达标 | 测试(自处置) | 已出补锚点方案(P-4) | 需研发确认 95 个场景的实现归属 |
+| 无 CI(G-7) | 回归依赖人工触发 | 研发/流程 | 未动 | 主理人排期 |
+| 联网维度未授权 | Playwright 443 例 / 依赖漏洞 / DAST / 性能 | 测试 | 未授权未执行,降级测试设计 | 需用户显式授权 |
+| B 类 18 例待研发确认 | 可能藏真实缺陷 | 研发 | 已定位到类/用例 | 研发按 G-4 逐个确认 |
+
+---
+
+## 八、下轮工作计划
+
+| 计划项 | 预计完成时间 | 前置依赖 | 备注 |
+|--------|--------------|----------|------|
+| 主工作区 WIP 收口后全量复验 | 下一轮 | 研发按 P-2 修 `recordRead` 写法 | 目标:主工作区与 worktree 逐类零差异 |
+| A 类 51 例修复后全量复跑 | 下一轮 | 研发/测试按 P-1 批量修 | 目标 G1 ≥96.26% |
+| 场景锚点补齐(G-1/G-2) | 2 轮内 | P-4 方案落地 | 目标引用率 ≥95% |
+| B-13 环境红清零 | 下一轮 | P-5 test profile | 目标红例 ≤108 |
+| P-2 契约口径拍板 | 待拍板 | 主理人/研发裁决 | 目标契约 240/240 |
+
+---
+
+## 附录
+
+### 附录 A:本轮新增测试用例明细
+
+| 用例 ID | 能力键 | 目标单元 | 用例标题 | 预期失败契约 | 是否已登记 RED | 登记 sha |
+|---------|--------|----------|----------|--------------|----------------|----------|
+| — | — | — | 本轮 0 新增(无 SRS/场景变更,测试角色不造用例) | — | — | — |
+
+### 附录 B:任务分派与会话恢复明细
+
+| 任务号 | 目标会话标签 | 分派时间 | 分派类型 | 当前状态 | 恢复会话标签 | 恢复原因 | 恢复时间 |
+|--------|--------------|----------|----------|----------|--------------|----------|----------|
+| — | — | — | 本轮 0 分派 0 恢复(测试角色纪律) | — | — | — | — |
+
+### 附录 C:新发现问题明细
+
+| 问题 ID | 能力键/任务号 | 问题类型 | 路由去向 | 登记时间 | 处置状态 | 关联证据 |
+|---------|---------------|----------|----------|----------|----------|----------|
+| B-26(细化) | cfc-backend 主工作区 | 阻塞 | 研发 | 2026-11-06 20:20 | 待处理 | `ArticleControllerTest.java:201/215/226` `when(mock).method()` API 误用 |
+| B-27(新增) | 度量口径 | 异常 | 测试自处置 | 2026-11-06 20:20 | 待处理 | `JwtInterceptorLoginRequiredPathTest:62` 参数化展开 27 例,恒等式差 26 |
+| B-28(新增) | 测试交付物可见性 | 阻塞 | 研发/主理人 | 2026-11-06 20:20 | 待处理 | 19:41 分支由 `feature/report-upload-product-cards` 切至 `cfclub`(`df7f60af5`),`963bedae7`(第 59 轮报告 + B-26/O-5)不在 `cfclub` 祖先链;`docs/tdd/test/automation-run-2026-11-06-1910.md` 在 `cfclub` 缺失 |
+| B-22(收口) | JwtInterceptor.LOGIN_REQUIRED_PATHS | 阻塞 | 测试自处置 | 2026-11-06 18:26 | **已解决** | `JwtInterceptorLoginRequiredPathTest` 28/28 全绿 |
+| S-cfc-31 | sleep.config.tags | 缺陷 | 研发 | 2026-11-06 18:35 | 待处理 | `publicValue_blankKey_returnsError:99` expected 500 was 200 |
+
+---
+
+## 门禁结论:**不通过(有条件)** —— 材料齐备、无新回归,但距「全部通过 + 全覆盖」仍有明确量化差距
+
+**本轮关键事实**
+
+- **全量实跑完成**:干净基线 231 类 / 1847 例 / 1727 绿(93.50%),`testCompile` 232 源 0 错,完整性 231/231、沉默 0、`dump` 0,Maven 末行与 XML 完全一致。
+- **无新回归**:与 18:09 全量基线对账,唯一变量是新增 `GuideConfigServiceTest` 11/11 全绿;红类 36=36、红例 116=116**零漂移**。
+- **前端双套件 100%**:小程序 296/296、管理端 90/90。
+- **B-22 收口**:鉴权清单 27 条路径参数化 401 契约 28/28 全绿,历史「清单零断言」缺口闭环。
+- **状态机维持**:5 键全 GREEN(连续第 3 轮),无伪 RED 空转。
+
+**门禁表**
+
+| 门禁 | 阈值 | 实测 | 结论 |
+|------|------|------|------|
+| G1 后端通过率 | ≥95% | **93.50%**(剔环境 93.94%) | ❌ |
+| G2 红例数 | ≤5 | **116** | ❌ |
+| G3 前端通过率 | 100% | **386/386** | ✅ |
+| G4 testCompile | 0 错 | **232 源 0 错** | ✅ |
+| G5 执行完整性 | 源类=报告类、沉默 0 | **231/231、0** | ✅ |
+| G6 CI | 存在且绿 | 无 CI | ❌ |
+| G7 状态机 | 无伪 RED | 5 键 GREEN | ✅ |
+| G8 契约 | 全绿 | 236/240(4 红) | ❌ |
+| G9 pytest | ≥95% | **55.81%** | ❌ |
+| G10 场景溯源 | ≥95% | **61.1%**(149/244) | ❌ |
+| G11 资产入库 | 干净 | 37 项 WIP 未提交 | ❌ |
+| G12 测试设计覆盖 | 20 类齐备 | 已发现 9 / 待核实 3 / **未发现 8** | ❌ |
+
+**结论口径**:本轮**没有引入任何回归**,且完成一次全量干净基线实跑与 20 类矩阵更新;但用户目标「所有用例通过 + 覆盖所有 SRS 与场景」**未达成**——通过率 93.43%、场景溯源 61.1%、场景可执行 2.0%、20 类中 8 类无资产。
+
+**放行/转正前提(按优先级)**:① 主工作区 WIP 收口 + testCompile 0 错(P-2)→ ② A 类 51 例修复,G1 ≥96.26%(P-1)→ ③ B-13 环境红清零(P-5)→ ④ P-2 契约口径拍板(契约 240/240)→ ⑤ 场景锚点补齐至 ≥95%(P-4)→ ⑥ 最小 CI 接入(G6)。
+
+**纪律说明**:本轮仅读取与执行测试,未改任何源码/测试代码,未提交研发 WIP;清理临时 worktree 后仅提交本报告与台账更新。

Fișier diff suprimat deoarece este prea mare
+ 0 - 1
docs/tdd/test/blockers.md


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff