Explorar el Código

test(tdd): 测试负责人闭环轮 2026-11-05 01:36 — B-10 P0 编译回归实锤(unit/CfBalanceControllerTest 7 处错,1474 @Test+16 契约零执行);4 YELLOW 证据齐备但复验被 B-10 阻断;台账刷新 2731 用例

E2E Test Bot hace 1 semana
padre
commit
c83c4eb254

+ 1 - 1
docs/tdd/orchestration/pending.md

@@ -5,4 +5,4 @@
 
 
 | 编号 | 主题 | 涉及角色 | 背景与诉求 | 主理人裁决 | 记录时间 | 状态 |
 | 编号 | 主题 | 涉及角色 | 背景与诉求 | 主理人裁决 | 记录时间 | 状态 |
 |---|---|---|---|---|---|---|
 |---|---|---|---|---|---|---|
-| O-1 | 3 个 TDD RED 键缺 `--mark-yellow` 登记,状态机停滞(**连续 6 轮跨 8h 未动,升 P1**) | 研发 | 测试侧已交付契约级单测并**离线实跑全绿**(health.report.createReport 5 例 / dan.assessment.getActiveMaterial 3 例 / guide.trainingPlan.getPlanDetail 8 例,共计 16 例;23:25 复验再次 16/16 全绿),实现均已推远端(getPlanDetail impl `0af81d688`;另两键实现已在库),但 state.json 三键仍为 RED(updated 10:14),TR-1 已请研发对本键 `--mark-yellow --commit 0af81d688` 尚未执行。诉求:研发负责人对三键执行 `--mark-yellow`(凭据:`git log` 对应 impl 提交),完成后测试侧复验 `--mark-green` 收口 | 待研发负责人确认;impl 与测试证据均已齐备,建议按 TR-1 约定补登。**升级 P1:连续 6 轮(15:10/15:30/17:29/19:25/20:55/21:00→23:25)未裁决,建议主理人直接协调研发补登** | 2026-11-04 23:25 | 待裁决 |
+| O-1 | TDD YELLOW 收口:研发 YELLOW 证据已齐(4 键/7 sha 在 origin/cfclub),但测试 `--mark-green` 复验被 **B-10 P0 编译回归**阻断 | 研发+测试 | **证据层已满足**:研发负责人1(01:15 轮,`6f86cae9a`)确认 4 键置 YELLOW——dan.assessment.getActiveMaterial(`c3e32460a`)/ dimension.registry.getTree(`57e162242`)/ dimension.registry.mapLegacyCode(`57e162242`)/ health.report.createReport(`1767d4414`),4 键 DONE(addMember/listMembers/getPlanDetail `55caf6966`/getPlanList);7 个证据 sha 经测试侧逐条 `git merge-base --is-ancestor` 核验**全部已在 origin/cfclub** ✓。**新阻塞**:测试侧 01:36 复跑 16 契约测试 @ testCompile 因 B-10 编译回归(unit/CfBalanceControllerTest.java 7 处错误)BUILD FAILURE,**无从验证、无法 `--mark-green`**。诉求:① 研发优先修复 B-10(P0,改测试 7 处调用或回退 44b2f0d42)→ ② 测试复跑 16 契约 + 全量 surefire 后对 4 YELLOW 键 `--mark-green` 收口 → ③ 本地 state.json 3 键(createReport/getActiveMaterial/getPlanDetail)按 git 证据同步阶段 | 研发修复 B-10(P0,阻断全模块测试验证)→ 测试复验 mark-green;主理人裁决 B-10 优先级(高于普通任务,因连带阻断 4 YELLOW 收口)。**升级 P1:YELLOW 证据已齐但复验通道被 P0 编译回归卡死** | 2026-11-05 01:36 | 待裁决 |

+ 90 - 0
docs/tdd/test/automation-run-2026-11-05-0136.md

@@ -0,0 +1,90 @@
+# TDD 闭环 · 测试负责人巡检报告(2026-11-05 01:36)
+
+> 角色:测试负责人(cfc-tester,本会话/本工作区)
+> 分支:`cfclub`(无需切换);远端 `origin/cfclub` = `6f86cae9a`(本轮开始落后 HEAD `db095214a` 4 个 docs 提交,见下)
+> 模式:本工作区只读扫描 + 契约测试离线实跑复验 + 状态盘点;未派发 opencode(测试角色纪律)
+
+---
+
+## 一、本轮核心证据(最关键发现)
+
+### P0 · B-10 编译回归【再次确认且升级】——阻断全部后端测试验证
+
+- **复跑命令**(与历史 8 轮连续全绿同口径):
+  `/d/tools/apache-maven-3.9.9/bin/mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='HealthReportControllerCreateReportTest,DanAssessmentControllerGetActiveMaterialTest,TrainingPlanControllerGetPlanDetailTest' test`
+- **结果**:`BUILD FAILURE` @ `testCompile`,**7 处编译错误**,位置 `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java`:
+  - 行 **95 / 113 / 121 / 140**:`controller.balance(7L, null)` / `balance(99L, null)` / `balance(-1L, null)` / `balance(7L, null)` —— 控制器签名现为 `balance(@RequestAttribute("userId") Long userId)`(单参),实参 2 个 → **参数个数不符**
+  - 行 **169 / 189 / 202**:`controller.logs(7L, null, 1, 20)` —— 控制器签名现为 `logs(userId, page, size)`(3 参),实参 4 个 → **参数个数不符**
+- **根因**:`44b2f0d42`(2026-11-05 00:31,chore(sync) 工作区遗留 WIP 收尾同步)重写 `CfBalanceController`(`balance`→单参 `userId`、`logs`→`logs(userId,page,size)`,删除 `currentMemberId` 及 `stats`/`familySummary`),并**把测试文件从 `controller/` 迁移到 `unit/` 包**(现路径 `.../cfc/unit/CfBalanceControllerTest.java`);但测试仍以旧签名调用 → 未同步。
+- **后果(升级点)**:`testCompile` 为模块级全局编译,一处失败即**整模块 1474 @Test 零执行**;此前**连续 8 轮(15:10 起)16/16 全绿的 3 个契约测试**(createReport 5 / getActiveMaterial 3 / getPlanDetail 8)**本轮被连带阻断,无法编译、无法运行**。这不是契约回归,而是被 B-10 编译回归连带卡死。
+- 无并发 `java`/`mvn` 进程、无 `.loop.lock` 陈旧锁(本轮为干净环境,排除并发干扰)。
+- **需研发处置**:改 `unit/CfBalanceControllerTest.java` 7 处调用去掉多余实参(`balance(7L)` / `logs(7L,1,20)`),或回退 `44b2f0d42` 改写。**修复优先级 P0(阻断全模块测试验证 + 4 个待收口 YELLOW 键)。**
+
+---
+
+## 二、状态机与跨角色协同
+
+### 本地 `state.json`(测试侧事实源,mtime 仍 2026-11-04 10:14,未动)
+
+| 键 | 阶段 | 备注 |
+|---|---|---|
+| `health.report.createReport` | RED | 本地仍 RED;研发报告已列 YELLOW 证据 |
+| `dan.assessment.getActiveMaterial` | RED | 本地仍 RED;研发报告已列 YELLOW 证据 |
+| `guide.trainingPlan.getPlanDetail` | RED | 本地仍 RED;研发报告已列 **DONE** |
+
+### 研发负责人1(01:15 轮,已推送 `6f86cae9a`)报告的关键结论
+
+- **4 键置 YELLOW,待测试侧 `--mark-green`**(研发明示「证据齐备,等待测试角色收口,角色隔离研发不代确认」):
+  `dan.assessment.getActiveMaterial`(YELLOW 实现 `c3e32460a`)、`dimension.registry.getTree`(`57e162242`)、`dimension.registry.mapLegacyCode`(`57e162242`)、`health.report.createReport`(`1767d4414`)。
+- **4 键 DONE**:`addMember` / `listMembers` / `getPlanDetail`(`55caf6966`)/ `getPlanList`。
+- **7 个证据 sha 全部已在 `origin/cfclub`**(本轮我逐条 `git merge-base --is-ancestor` 核验 ✓):`57e162242`、`1767d4414`、`c3e32460a`、`e0ae1e459`、`73654bcf8`、`81d8883f7`、`faf3ca174`。
+- ⚠️ **本地 `state.json` 与研发侧状态机不同步**:`.tdd/` 为本地私有不入库,研发侧状态机与其报告在各自环境独立维护;本轮我以研发报告的 git 真理证据为观测口径,**不擅自改写研发侧阶段登记**(阶段推进须由对应角色经 `--mark-*` 显式登记)。
+
+### O-1 状态转变(详见 pending.md 更新)
+
+- 原 O-1 诉求「研发对 3 键补 `--mark-yellow`」——**证据层面已满足**(研发 01:15 报告 + 7 sha 在 origin/cfclub)。
+- **新阻塞点**:测试侧 `--mark-green` 复验被 **B-10 P0 编译回归阻断**(无法编译契约测试,无从验证)。即:YELLOW 证据已齐,**复验通道被 B-10 卡死**。
+
+---
+
+## 三、台账重扫(只读,反映已提交代码)
+
+- `discover_tests.py`:**控制器 358 / handler 方法 1941(覆盖 365 = 18.8%)/ 测试文件 205(@Test 1545,部分 4)**;分布 covered=25 / partial=192 / uncovered=140 / no-handler=1。
+- `test_inventory.py`:跨源用例 **2731**(结构化 md 729 + Playwright 410 + Python 47 + Java @Test 1545 + 场景 9)。
+- 相对上一有效轮(23:25):handler 1944→1941(-3,与 `44b2f0d42` 删除 `stats`/`familySummary` 一致,**属已提交代码**);覆盖 363→365(+2);@Test 1536→1545(+9,**已随 WIP 收尾同步提交,非未提交 WIP**)。
+- 已重写 3 份共享台账:`docs/tdd/test/{discovery,inventory,automation-status}.md`(增量相对 HEAD 微小,18+/15-),本轮**随报告一并提交**(区别于 23:36 轮因增量来自未提交 WIP 而不提交——本次增量来自已提交代码)。
+
+---
+
+## 四、结论与建议
+
+### 门禁结论:**不通过(承袭,有条件)**
+
+- **主卡点**:B-10 P0 编译回归(`unit/CfBalanceControllerTest.java` 7 处编译错误 → testCompile 失败 → **全模块 1474 @Test + 16 契约测试全部零执行**)。
+- **次卡点**:4 个 YELLOW 键(含 createReport/getActiveMaterial/getTree/mapLegacyCode)**证据齐备但无法复验收口**——被 B-10 阻断。
+- 本地 `state.json` 3 键仍 RED(研发侧已按 git 证据推进,属状态机不同步观测项,非本次可闭环)。
+
+### 使绿顺序(建议)
+
+1. **研发修复 B-10**:改 `unit/CfBalanceControllerTest.java` 7 处调用(`balance(7L)` / `logs(7L,1,20)`)或回退 `44b2f0d42`,`mvn -o testCompile` 恢复绿 → push。
+2. **测试复验收口**:B-10 解除后,重跑 16 契约测试 + 全量 surefire,确认后对 4 YELLOW 键 `--mark-green`。
+3. **研发补登 / 状态机对齐**:本地 `state.json` 3 键(createReport/getActiveMaterial/getPlanDetail)按 git 证据同步阶段(研发侧已登记,测试侧观测待对齐)。
+4. **SC→KEY_RE 衔接待裁决**(研发 01:15 报告提出,涉及 218 SC 场景覆盖矩阵,0/218 跑通):主理人仲裁口径。
+
+### 未实测项(显式声明,非达标)
+
+- 契约测试 16/16(**本轮无法运行**,被 B-10 testCompile 阻断;历史 8 轮全绿为对照,非本次证据)。
+- 全量后端 surefire / 前端 jest / Playwright E2E / langgraph pytest:需联网授权或依赖(本轮未授权/未配置)。
+- JaCoCo 覆盖率 / PIT 变异 / 性能 / 依赖漏洞扫描:本机无工具或需联网,不在范围。
+- 接口冒烟(`run_interface_tests_cron.sh`):默认公网目标本轮未跑(本任务已切换为 TDD discover/track 模式,接口冒烟为历史独立链路)。
+
+---
+
+## 五、本轮提交内容
+
+- `docs/tdd/test/automation-run-2026-11-05-0136.md`(本报告)
+- `docs/tdd/test/blockers.md`(B-10 升级:01:31 复跑确认 7 处编译错误 + unit/ 定位 + 16 契约测试连带阻断)
+- `docs/tdd/orchestration/pending.md`(O-1 更新:研发 YELLOW 证据已齐 → 测试复验被 B-10 阻断)
+- `docs/tdd/test/{discovery,inventory,automation-status}.md`(台账重扫,增量来自已提交代码)
+
+> 工作树其余 70+ 处与本次无关的跨角色未提交改动(含 `.wt-*` 目录、前端测试、package.json、`_run*_agg.json` 等)**不触碰、不 sweep**(研发负责人1 01:15 报告明示「不 sweep 他人」;`--clean-check` 门禁按「完成=已提交+工作目录干净」提示,但清理他人改动属越权,仅提示不代做)。

+ 3 - 2
docs/tdd/test/automation-status.md

@@ -23,8 +23,8 @@
 | 用户场景(md) | 9 | 0 | 0 | 9 | 9 | 0 | 0 | 0 | 0 |
 | 用户场景(md) | 9 | 0 | 0 | 9 | 9 | 0 | 0 | 0 | 0 |
 | Playwright(e2e/integration) | 70 | 410 | 70 | 0 | 60 | 0 | 7 | 3 | 0 |
 | Playwright(e2e/integration) | 70 | 410 | 70 | 0 | 60 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 204 | 1536 | 204 | 0 | 187 | 0 | 15 | 2 | 0 |
-| **合计** | — | **2722** | **285** | **738** | 996 | 0 | 22 | 5 | 0 |
+| Java后端测试 | 205 | 1545 | 205 | 0 | 188 | 0 | 15 | 2 | 0 |
+| **合计** | — | **2731** | **286** | **738** | 997 | 0 | 22 | 5 | 0 |
 
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
 
@@ -904,6 +904,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | 2 | 已自动化(@Test) | 通过 | DailyTaskController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | 2 | 已自动化(@Test) | 通过 | DailyTaskController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | 13 | 已自动化(@Test) | 未跟踪 | DimensionAdminController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | 13 | 已自动化(@Test) | 未跟踪 | DimensionAdminController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | DimensionRegistryMapContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | DimensionRegistryMapContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryTreeTest.java` | 9 | 已自动化(@Test) | 未跟踪 | DimensionRegistryTree |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | 8 | 已自动化(@Test) | 未跟踪 | FamilyController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | 8 | 已自动化(@Test) | 未跟踪 | FamilyController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | 20 | 已自动化(@Test) | 未跟踪 | GuideFamilyTaskController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | 20 | 已自动化(@Test) | 未跟踪 | GuideFamilyTaskController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | 8 | 已自动化(@Test) | 未跟踪 | GuideOrderController |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | 8 | 已自动化(@Test) | 未跟踪 | GuideOrderController |

+ 2 - 1
docs/tdd/test/blockers.md

@@ -12,5 +12,6 @@
 | B-5 | 接口冒烟 REAL_ERR 分型 | 研发 | `interface_classify_failures.py` 分型出 49 条 REAL_ERR(基于 11-01 轮次)未派单未修复;冒烟通过率停 45%,需研发按分型认领真实错误端点 | 测试(巡检补登记) | 2026-11-03 10:58 | 待处理 |
 | B-5 | 接口冒烟 REAL_ERR 分型 | 研发 | `interface_classify_failures.py` 分型出 49 条 REAL_ERR(基于 11-01 轮次)未派单未修复;冒烟通过率停 45%,需研发按分型认领真实错误端点 | 测试(巡检补登记) | 2026-11-03 10:58 | 待处理 |
 | B-6 | health.report.createReport | 研发 | TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并**离线实跑 5 例全绿**(HealthReportControllerCreateReportTest,commit 81d8883f7 已推 origin/cfclub),实现已在库;**缺研发 `--mark-yellow` 登记**,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 | 测试(巡检更新) | 2026-11-03 10:58 | 待处理 |
 | B-6 | health.report.createReport | 研发 | TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并**离线实跑 5 例全绿**(HealthReportControllerCreateReportTest,commit 81d8883f7 已推 origin/cfclub),实现已在库;**缺研发 `--mark-yellow` 登记**,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 | 测试(巡检更新) | 2026-11-03 10:58 | 待处理 |
 | B-7 | dan.assessment.getActiveMaterial | 研发 | TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并**离线实跑 3 例全绿**(DanAssessmentControllerGetActiveMaterialTest,commit faf3ca174 已推 origin/cfclub),实现已在库;**缺研发 `--mark-yellow` 登记**,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 | 测试(巡检更新) | 2026-11-03 10:58 | 待处理 |
 | B-7 | dan.assessment.getActiveMaterial | 研发 | TDD 状态机 RED 停滞(自 11-02 01:06 起):契约级单测已落地并**离线实跑 3 例全绿**(DanAssessmentControllerGetActiveMaterialTest,commit faf3ca174 已推 origin/cfclub),实现已在库;**缺研发 `--mark-yellow` 登记**,状态机无法推进至 GREEN。更新:2026-11-04 15:20 测试侧复核实跑 | 测试(巡检更新) | 2026-11-03 10:58 | 待处理 |
-| B-8 | CfBalanceControllerTest(P0 编译回归) | 研发 | commit dfc78e9d3(2026-11-03 23:27)给 `CfBalanceController.balance`/`logs` 新增 `currentMemberId` 参数,但 `CfBalanceControllerTest.java`(76230e2f4,2026-10-25)未同步 → 7 处编译错误(行 95/113/121/140 调 balance、169/189/202 调 logs),整模块 testCompile 失败,1474 @Test 零执行。需研发补改测试 7 处调用或回退签名 | 测试(巡检补登记) | 2026-11-04 03:49 | 已解除(研发修复 `c9f9ec948` 已推送;测试侧 2026-11-04 全量套件 `mvn -o test` 编译通过并实跑 155 类/1087 用例实证) |
+| B-8 | CfBalanceControllerTest(P0 编译回归) | 研发 | commit dfc78e9d3(2026-11-03 23:27)给 `CfBalanceController.balance`/`logs` 新增 `currentMemberId` 参数,但 `CfBalanceControllerTest.java`(76230e2f4,2026-10-25)未同步 → 7 处编译错误(行 95/113/121/140 调 balance、169/189/202 调 logs),整模块 testCompile 失败,1474 @Test 零执行。需研发补改测试 7 处调用或回退签名 | 测试(巡检补登记) | 2026-11-04 03:49 | 已解除 → 44b2f0d42(2026-11-05 00:31)重写控制器移除 currentMemberId 再次触发同源编译回归,详见 B-10(待处理) |
 | B-9 | guide.trainingPlan.getPlanDetail(鉴权缺口观察) | 研发 | `POST /api/guide/training-plans/detail` handler 在控制器层不读取 `@RequestAttribute("role")`,亦未列入 JwtInterceptor `LOGIN_REQUIRED_PATHS`,「规划师角色约束」名义成立但任何已认证角色(乃至匿名 userId=-1)均可到达 handler,属潜在越权缺口(同文件 `getPlanList` 同类观察,TR-1 第 6 点要求测试侧记录)。契约测试已落地(TrainingPlanControllerGetPlanDetailTest,8 例全绿),本条仅作缺陷观察回写,不阻断 RED→YELLOW→GREEN 推进 | 测试负责人(应 TR-1 登记) | 2026-11-04 10:10 | 待处理 |
 | B-9 | guide.trainingPlan.getPlanDetail(鉴权缺口观察) | 研发 | `POST /api/guide/training-plans/detail` handler 在控制器层不读取 `@RequestAttribute("role")`,亦未列入 JwtInterceptor `LOGIN_REQUIRED_PATHS`,「规划师角色约束」名义成立但任何已认证角色(乃至匿名 userId=-1)均可到达 handler,属潜在越权缺口(同文件 `getPlanList` 同类观察,TR-1 第 6 点要求测试侧记录)。契约测试已落地(TrainingPlanControllerGetPlanDetailTest,8 例全绿),本条仅作缺陷观察回写,不阻断 RED→YELLOW→GREEN 推进 | 测试负责人(应 TR-1 登记) | 2026-11-04 10:10 | 待处理 |
+| B-10 | CfBalanceControllerTest(P0 编译回归·复发) | 研发 | commit `44b2f0d42`(2026-11-05 00:31:53,「chore(sync): 工作区遗留未提交 WIP 收尾同步」)重写 `CfBalanceController.balance` 为 `balance(@RequestAttribute("userId") Long userId)`、`logs` 为 `logs(userId, page, size)`,删除 `currentMemberId` 参数及 `stats`/`familySummary` 方法;但测试 `CfBalanceControllerTest`(仍停在 `c9f9ec948`,曾为修复上轮 P0 给测试**加上** `currentMemberId` 实参)未同步 → 仍调 `balance(7L, null)` / `logs(7L, null, 1, 20)`,实参个数不符 → testCompile 失败,1474 @Test 零执行。需研发改测试 7 处调用去掉 `currentMemberId` 实参(或回退 44b2f0d42 改写)。本轮(01:05)复跑复现,日志 `/d/cfc/.tdd/backend-run-20261105-0105.log`。**升级(01:36 复跑确认)**:测试文件已被 `44b2f0d42` 迁移至 `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java`,仍以旧签名调用 → **7 处编译错误**(行 95/113/121/140 调 `balance(7L,null)`、169/189/202 调 `logs(7L,null,1,20)`,控制器现为 `balance(userId)` 单参 / `logs(userId,page,size)` 三参)→ `mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='HealthReportControllerCreateReportTest,DanAssessmentControllerGetActiveMaterialTest,TrainingPlanControllerGetPlanDetailTest' test` @ testCompile **BUILD FAILURE**;**全模块 1474 @Test + 16 契约测试(历史 8 轮全绿)全部零执行**,4 个 YELLOW 键(createReport/getActiveMaterial/getTree/mapLegacyCode)复验收口亦被连带阻断。**优先级 P0(阻断全模块测试验证)**。建议研发:改测试 7 处调用(`balance(7L)` / `logs(7L,1,20)`)或回退 44b2f0d42 | 测试(01:36 复跑确认补登记) | 2026-11-05 01:36 | 待处理 |

+ 12 - 11
docs/tdd/test/discovery.md

@@ -8,23 +8,22 @@
 | 指标 | 数值 |
 | 指标 | 数值 |
 | --- | --- |
 | --- | --- |
 | 控制器总数 | 358 |
 | 控制器总数 | 358 |
-| handler 方法总数 | 1944 |
-| handler 方法已覆盖 | 363 (18.7%) |
-| 单元-全覆盖(handler 方法) | 24 |
+| handler 方法总数 | 1941 |
+| handler 方法已覆盖 | 365 (18.8%) |
+| 单元-全覆盖(handler 方法) | 25 |
 | 单元-部分覆盖(handler 方法) | 192 |
 | 单元-部分覆盖(handler 方法) | 192 |
-| 单元-未覆盖(handler 方法) | 141 |
+| 单元-未覆盖(handler 方法) | 140 |
 | 单元-无handler 方法 | 1 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 204 |
-| @Test 方法总数 | 1536 |
+| 测试文件数 | 205 |
+| @Test 方法总数 | 1545 |
 | 含跳过/假设项(test 级 partial) | 4 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
 
 
 > 以下控制器在当前测试源中**没有任何handler 方法被命中**。这是真实扫描得到的覆盖缺口。
 > 以下控制器在当前测试源中**没有任何handler 方法被命中**。这是真实扫描得到的覆盖缺口。
 
 
-共 141 个:
+共 140 个:
 
 
-- `AdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java`,65 方法)
 - `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
 - `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
 - `AdminInventoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminInventoryController.java`,15 方法)
 - `AdminInventoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminInventoryController.java`,15 方法)
 - `FamilyInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyInviteController.java`,15 方法)
 - `FamilyInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyInviteController.java`,15 方法)
@@ -84,7 +83,8 @@
 - `AttributionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/AttributionController.java`,4 方法)
 - `AttributionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/AttributionController.java`,4 方法)
 - `DietRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/diet/DietRecordController.java`,4 方法)
 - `DietRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/diet/DietRecordController.java`,4 方法)
 - `DimensionRegistryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/DimensionRegistryController.java`,4 方法)
 - `DimensionRegistryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/DimensionRegistryController.java`,4 方法)
-- …(其余 81 个见完整扫描)
+- `DistributionInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DistributionInviteController.java`,4 方法)
+- …(其余 80 个见完整扫描)
 
 
 ## 三、部分覆盖控制器(已做一部分测试)
 ## 三、部分覆盖控制器(已做一部分测试)
 
 
@@ -92,13 +92,14 @@
 
 
 共 192 个:
 共 192 个:
 
 
+- `AdminController`:覆盖 1/65,未覆盖方法:getUsers、createUser、getUser、updateUser、resetUserPassword、searchUsers、deleteUser、getChild、updateChild、adjustPoints
 - `HealthReportController`:覆盖 1/59,未覆盖方法:createReport、getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getMemberIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent
 - `HealthReportController`:覆盖 1/59,未覆盖方法:createReport、getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getMemberIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent
 - `HealthKnowledgeBaseController`:覆盖 2/28,未覆盖方法:batchQuery、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood、getSection
 - `HealthKnowledgeBaseController`:覆盖 2/28,未覆盖方法:batchQuery、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood、getSection
 - `AdminArticleController`:覆盖 1/22,未覆盖方法:create、update、detail、delete、publishById、publish、backfillTags、toggleFeatured、move、audit
 - `AdminArticleController`:覆盖 1/22,未覆盖方法:create、update、detail、delete、publishById、publish、backfillTags、toggleFeatured、move、audit
 - `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
 - `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
 - `TaskController`:覆盖 1/18,未覆盖方法:getMinigameOptions、createTask、getTodayTasks、completeTask、startTask、reviewTask、getTaskHistory、getPendingReviewTasks、getTodayParentTasks、completeParentTask
 - `TaskController`:覆盖 1/18,未覆盖方法:getMinigameOptions、createTask、getTodayTasks、completeTask、startTask、reviewTask、getTaskHistory、getPendingReviewTasks、getTodayParentTasks、completeParentTask
-- `FamilyUserController`:覆盖 1/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchRole、switchToFamilyMember、switchBackToParent、switchBackVerify、createFamilyMember
+- `FamilyUserController`:覆盖 2/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchRole、switchToFamilyMember、switchBackToParent、switchBackVerify、getFamilyMemberren
 - `GuideManagementController`:覆盖 3/17,未覆盖方法:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
 - `GuideManagementController`:覆盖 3/17,未覆盖方法:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
 - `MembershipController`:覆盖 4/17,未覆盖方法:getAllLevels、getMyMembership、getUpgradeRecords、upgradeOrder、activateTrial、createOrder、continueOrder、getPricingPlans、getMembershipCompare、paymentNotify
 - `MembershipController`:覆盖 4/17,未覆盖方法:getAllLevels、getMyMembership、getUpgradeRecords、upgradeOrder、activateTrial、createOrder、continueOrder、getPricingPlans、getMembershipCompare、paymentNotify
 - `ArticleController`:覆盖 4/16,未覆盖方法:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、publish
 - `ArticleController`:覆盖 4/16,未覆盖方法:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、publish
@@ -158,7 +159,6 @@
 - `AdminSpecialPriceController`:覆盖 5/6,未覆盖方法:update
 - `AdminSpecialPriceController`:覆盖 5/6,未覆盖方法:update
 - `AdminSystemPromptController`:覆盖 1/6,未覆盖方法:save、reset、delete、listVersions、rollback
 - `AdminSystemPromptController`:覆盖 1/6,未覆盖方法:save、reset、delete、listVersions、rollback
 - `ButlerController`:覆盖 1/6,未覆盖方法:apply、getProfile、updateProfile、getServiceRecords、getCommissions
 - `ButlerController`:覆盖 1/6,未覆盖方法:apply、getProfile、updateProfile、getServiceRecords、getCommissions
-- `CfBalanceController`:覆盖 3/6,未覆盖方法:stats、familySummary、promotionEarnings
 - `ContentSectionController`:覆盖 1/6,未覆盖方法:getVisibleSections、getDetail、create、update、delete
 - `ContentSectionController`:覆盖 1/6,未覆盖方法:getVisibleSections、getDetail、create、update、delete
 - `FoodRecommendController`:覆盖 2/6,未覆盖方法:getIndex、getHistory、getByFamily、getCautionFoods
 - `FoodRecommendController`:覆盖 2/6,未覆盖方法:getIndex、getHistory、getByFamily、getCautionFoods
 - `IndicatorAdminController`:覆盖 1/6,未覆盖方法:create、update、delete、listValues、backfill
 - `IndicatorAdminController`:覆盖 1/6,未覆盖方法:create、update、delete、listValues、backfill
@@ -341,6 +341,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | com | 10 | 0 | 0 | TrainingPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | com | 10 | 0 | 0 | TrainingPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | com | 9 | 0 | 0 | AdminController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | com | 9 | 0 | 0 | AdminController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ai/ButlerControllerGateTest.java` | com | 9 | 4 | 6 | ButlerController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ai/ButlerControllerGateTest.java` | com | 9 | 4 | 6 | ButlerController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryTreeTest.java` | com | 9 | 6 | 0 | DimensionRegistryController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | com | 9 | 9 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | com | 9 | 9 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | com | 9 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | com | 9 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | com | 9 | 6 | 5 | GuideTeamController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | com | 9 | 6 | 5 | GuideTeamController | — |

+ 3 - 2
docs/tdd/test/inventory.md

@@ -11,9 +11,9 @@
 | 结构化测试用例(md) | 9 | 729 |
 | 结构化测试用例(md) | 9 | 729 |
 | Playwright(spec.js) | 70 | 410 |
 | Playwright(spec.js) | 70 | 410 |
 | Python(pytest) | 11 | 47 |
 | Python(pytest) | 11 | 47 |
-| Java后端(测试文件) | 204 | 1536 (@Test) |
+| Java后端(测试文件) | 205 | 1545 (@Test) |
 | 用户场景(md) | 9 | 文件级 |
 | 用户场景(md) | 9 | 文件级 |
-| **合计** | — | **2722** 用例/方法 |
+| **合计** | — | **2731** 用例/方法 |
 
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
 
@@ -899,6 +899,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | cfc-backend | 2 | DailyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | cfc-backend | 2 | DailyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | cfc-backend | 13 | DimensionAdminController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | cfc-backend | 13 | DimensionAdminController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` | cfc-backend | 7 | DimensionRegistryMapContract | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` | cfc-backend | 7 | DimensionRegistryMapContract | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryTreeTest.java` | cfc-backend | 9 | DimensionRegistryTree | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryTreeTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | cfc-backend | 8 | FamilyController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | cfc-backend | 8 | FamilyController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | cfc-backend | 20 | GuideFamilyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | cfc-backend | 20 | GuideFamilyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | cfc-backend | 8 | GuideOrderController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | cfc-backend | 8 | GuideOrderController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` |