소스 검색

test(tdd): 测试负责人 1055 轮 — S-cfc-17/18/19 新 RED 契约 52 例全绿落地验证 + 契约复验 156绿/3红 + O-1 第23轮

E2E Test Bot 6 일 전
부모
커밋
1abb606282

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
docs/tdd/orchestration/pending.md


+ 85 - 0
docs/tdd/test/automation-run-2026-11-06-1055.md

@@ -0,0 +1,85 @@
+# TDD 闭环测试负责人轮 · 2026-11-06 10:55(第 55 次执行)
+
+- **角色**:测试负责人(cfc-tester)。未派发 opencode(测试角色纪律);本工作区离线契约测试实跑 + git 真理核验 + 台账重扫 + 状态盘点。
+- **基线**:本地 HEAD `1d6f97cfa`;fetch 后远端 +15 至 `5f2bd5cf4`(研发汇报 ×7 + 主理人 O-3/O-4 裁决 ×2 + bump ×2 + **S-cfc-17/18/19 契约测试 3 新文件** `9e391ac5d`/`564b4d8b6`/`c11295c1c`),rebase(autostash)对齐后基线 = origin/cfclub。
+
+## 一、本轮核心证据(实测,非采信)
+
+**主口径 14 类 159 例** → **156 绿 / 3 红 / 0 错**(`-o -B -f cfc-backend/pom.xml -DskipTests=false`,5m41s):
+
+| 测试类 | 结果 |
+|---|---|
+| HealthReportControllerCreateReportTest | 5/5 ✅ |
+| DanAssessmentControllerGetActiveMaterialTest | 3/3 ✅ |
+| TrainingPlanControllerGetPlanDetailTest | 8/8 ✅ |
+| TaskControllerCreateTaskTest | 7/7 ✅ |
+| TaskServiceReviewTest | 15/15 ✅ |
+| **TaskControllerReviewTest** | **17/17 ✅(B-21 连续第 4 轮全绿清零维持)** |
+| CfBalanceControllerTest | 8/8 ✅(B-10 连续第 13 轮无复发) |
+| DimensionRegistryTreeTest | 9/9 ✅ |
+| DimensionAdminControllerTest | 13/13 ✅ |
+| **HealthDimensionControllerTest** | **15/15 ✅(B-18 自修后连续第 2 轮全绿维持)** |
+| **DimensionRegistryMapContractTest** | **7 → 4 绿 / 3 红(P-2 口径未决,第 11 轮)** |
+| **AdminAuthControllerLoginContractTest(新 S-cfc-17)** | **15/15 ✅** |
+| **HealthReportControllerUploadTest(新 S-cfc-18)** | **16/16 ✅** |
+| **HealthDimensionControllerUploadContractTest(新 S-cfc-19)** | **21/21 ✅** |
+
+- **testCompile 0 错**(224 源 fresh 编译,B-10 连续第 13 轮无复发)。
+- 2 个 YELLOW 键(`health.report.createReport` / `dan.assessment.getActiveMaterial`)契约**连续第 14 轮**复验通过。
+- 3 红 = P-2 `DimensionRegistryMapContractTest`(`map_unknownLegacy:76` / `map_emptyLegacy:85` / `map_missingLegacy_returnsBadRequest:92`,与既往完全一致,非新回归)。
+
+## 二、本轮新增验证:S-cfc-17/18/19 新 RED 键契约落地全绿
+
+- 远端本轮含 3 个新契约测试文件(研发/会话推远端,`仅测试不改实现`):
+  - `9e391ac5d` — AdminAuthControllerLoginContractTest 15 例(admin.auth.login)
+  - `564b4d8b6` / `c11295c1c` — HealthReportControllerUploadTest 16 例 + HealthDimensionControllerUploadContractTest 21 例(health.report.upload)
+- 本轮定向实跑 **52/52 全绿** → 2 个新 RED 键契约验证通过(RED 契约落地前提满足)。
+- 注:研发 10:40 汇报 S-cfc-19/20 GREEN 实现任务未产出(dispatch.py 指令与 GREEN 阶段错配,两键缺实现)——属研发侧派发工具问题,不影响契约测试本身绿;实现落地待研发侧修正后推进。
+
+## 三、git 真理证据
+
+| 键 | 证据 sha | 祖先链 |
+|---|---|---|
+| health.report.createReport(YELLOW 实现) | `1767d4414` | IN CHAIN ✓ |
+| dan.assessment.getActiveMaterial(YELLOW 实现) | `c3e32460a` | IN CHAIN ✓ |
+| health.report.createReport(RED 测试) | `81d8883f7` | IN CHAIN ✓ |
+| dan.assessment.getActiveMaterial(RED 测试) | `faf3ca174` | IN CHAIN ✓ |
+| S-cfc-17/18/19(新 RED 契约) | `9e391ac5d`/`564b4d8b6`/`c11295c1c` | IN CHAIN ✓ |
+
+(补深后第 7 轮连续 merge-base 核验通过;本轮 `--is-shallow-repository` = false,无浅克隆误判风险)
+
+## 四、状态机盘点
+
+- 本地 `.tdd/state.json`:仍 **3 伪 RED**(health.report.createReport / dan.assessment.getActiveMaterial / guide.trainingPlan.getPlanDetail),mtime `2026-11-04 10:14` **第 23 轮未动**。
+- `--mark-green health.report.createReport` 实测仍被拒(`当前阶段 RED,须先 YELLOW`)——**纯状态机同步单卡点维持**(责任:编排侧/主理人同步 state.json;测试侧已连续 23 轮如实报障)。
+- mark-green 证据链已完全就绪:YELLOW sha 有效 + 契约 14 轮复验通过 + RED sha 在链 + B-21/B-18 清零。
+- 研发 10:40 口径:状态机 16 键 = DONE 12 / YELLOW 4 / RED 0;O-3(SC 转正 5 个)/O-4(顶层目标 236 口径)已由主理人裁决落地。
+
+## 五、台账重扫
+
+- discovery:**359 控制器 / 1942 handler / 覆盖 372(19.2%)/ 224 测试文件(@Test 1769,partial 4)**。
+- inventory:跨源 **3044** 用例(md 784 + Playwright 444 + Python 47 + Java@Test 1769 + 场景 11)。
+- 相对上轮增量:测试文件 221→224(+3 = S-cfc-17/18/19 契约类)、@Test 1717→1769(+52)。
+
+## 六、覆盖缺口清单
+
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环 |
+|---|---|---|---|---|---|
+| 状态机同步缺口 | 3 伪 RED 第 23 轮 | mark-green 无法落库,YELLOW 无法收口 | 编排侧同步 state.json 键集与阶段 | P1 | 同步后 `--mark-green` 收口,复跑契约 |
+| P-2 MapContract 3 红 | map_unknown/empty/missingLegacy 断言 400/500 实得 200 | 契约口径未决,3 红长期挂账 | 主理人/需求拍板 mapLegacyCode 空值语义(400 vs 200+null) | P1 | 拍板后按口径调整用例或实现,复跑 7 例 |
+| S-cfc-19/20 实现缺失 | dispatch.py 指令与 GREEN 阶段错配,两键缺实现 | 新键契约绿但实现未落地 | 研发侧修正派发工具并落地实现 | P1 | 实现推远端后复跑契约 52 例 |
+| 无 CI | 仅本机可跑 | 回归依赖人工轮次 | 建最小 3-job 流水线 | P2 | CI 绿后自动化 |
+| B-18 A 类余量 | HealthDimension 已修,其余 A 类未清点 | G1 提升受限 | 按 B-18 清单逐类清点修复 | P2 | 修复后全量 surefire 复跑 |
+
+## 七、门禁结论:**不通过(承袭,有条件)**
+
+- G4 testCompile ✅ 0 错(实跑,第 13 轮);G5 契约 ✅ 156 绿 / 3 红(剩 P-2);G3 前端 ✅ 100%(采信 1030 轮 386/386);G1 ≈92.7%(采信 09:39/1030 轮全量);G2 ❌ ~120 非环境红;G6 CI ❌ 无;G7 状态机 ❌ 第 23 轮;G8 ❌ P-2 3 红。
+- **本轮改善**:S-cfc-17/18/19 三个新 RED 键契约 52 例全绿落地验证;B-21(17/17)/B-18(15/15)清零持续维持;testCompile 0 错第 13 轮。
+- **使绿顺序**:① 编排侧/主理人同步 state.json(第 23 轮,证据链就绪)→ `--mark-green` 收口 2 YELLOW 键 → ② 研发修正 S-cfc-19/20 派发(实现落地)→ ③ P-2 map 契约口径拍板 → ④ B-18 其余 A 类清点 → ⑤ 最小 CI。
+
+## 八、未实测项(如实登记)
+
+- 全量 surefire(220 类)/ 前端 jest(386 例):采信 1030 兄弟批次(同 HEAD 独立复核零漂移)。
+- Playwright / 接口冒烟 / langgraph pytest:联网未授权。
+- JaCoCo / PIT / 性能 / 依赖漏洞:无工具。
+- `--mark-green` 落账:被本地状态机过时拒绝(RED 须先 YELLOW),实测受阻非未尝试。

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

@@ -23,8 +23,8 @@
 | 用户场景(md) | 11 | 0 | 0 | 11 | 11 | 0 | 0 | 0 | 0 |
 | Playwright(e2e/integration) | 76 | 444 | 76 | 0 | 66 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 221 | 1717 | 221 | 0 | 204 | 0 | 15 | 2 | 0 |
-| **合计** | — | **2992** | **308** | **795** | 1076 | 0 | 22 | 5 | 0 |
+| Java后端测试 | 224 | 1769 | 224 | 0 | 207 | 0 | 15 | 2 | 0 |
+| **合计** | — | **3044** | **311** | **795** | 1079 | 0 | 22 | 5 | 0 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -932,13 +932,16 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/DanAssessmentControllerGetActiveMaterialTest.java` | 3 | 已自动化(@Test) | 未跟踪 | DanAssessmentControllerGetActiveMaterial |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/EnergyControllerGrantEnergyTest.java` | 3 | 已自动化(@Test) | 未跟踪 | EnergyControllerGrantEnergy |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthCheckinCfEarnCallSite |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthDimensionControllerUploadContractTest.java` | 21 | 已自动化(@Test) | 未跟踪 | HealthDimensionControllerUploadContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthPlanDeleteController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerCreateReportTest.java` | 5 | 已自动化(@Test) | 未跟踪 | HealthReportControllerCreateReport |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` | 4 | 已自动化(@Test) | 未跟踪 | HealthReportControllerListPagination |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthReportControllerProxyParseBinding |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerUploadTest.java` | 16 | 已自动化(@Test) | 未跟踪 | HealthReportControllerUpload |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | 2 | 已自动化(@Test) | 未跟踪 | IndicatorController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | 10 | 已自动化(@Test) | 未跟踪 | IndicatorFavoriteController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` | 1 | 已自动化(@Test) | 未跟踪 | MembershipControllerPlansLevelOrder |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` | 15 | 已自动化(@Test) | 未跟踪 | AdminAuthControllerLoginContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | 10 | 已自动化(@Test) | 未跟踪 | AdminAuthControllerLoginStatus |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | 11 | 已自动化(@Test) | 未跟踪 | AdminAuthWechatScan |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | 4 | 已自动化(@Test) | 未跟踪 | AdminButlerControllerEnvelope |

+ 5 - 2
docs/tdd/test/discovery.md

@@ -14,8 +14,8 @@
 | 单元-部分覆盖(handler 方法) | 192 |
 | 单元-未覆盖(handler 方法) | 140 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 221 |
-| @Test 方法总数 | 1717 |
+| 测试文件数 | 224 |
+| @Test 方法总数 | 1769 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
@@ -298,6 +298,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionScoreServiceTest.java` | com | 21 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodRecommendServiceTest.java` | com | 21 | 1 | 0 | FoodRecommendController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideRolePermissionTest.java` | com | 21 | 6 | 9 | GuideController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthDimensionControllerUploadContractTest.java` | com | 21 | 0 | 0 | HealthDimensionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/RewardRuleServiceEstimateTest.java` | com | 21 | 3 | 0 | RewardController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | com | 20 | 11 | 8 | GuideFamilyTaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceSemanticTest.java` | com | 20 | 0 | 0 | IndicatorController | — |
@@ -311,8 +312,10 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | com | 17 | 1 | 4 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ActivityControllerTest.java` | com | 16 | 9 | 6 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | com | 16 | 6 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerUploadTest.java` | com | 16 | 0 | 0 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductControllerTest.java` | com | 16 | 8 | 6 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityOrderServiceTest.java` | com | 15 | 0 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` | com | 15 | 6 | 1 | AdminAuthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/HealthDimensionControllerTest.java` | com | 15 | 3 | 4 | HealthDimensionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` | com | 15 | 0 | 0 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ArticleWorkflowTest.java` | com | 14 | 0 | 0 | ArticleController | — |

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

@@ -11,9 +11,9 @@
 | 结构化测试用例(md) | 11 | 784 |
 | Playwright(spec.js) | 76 | 444 |
 | Python(pytest) | 11 | 47 |
-| Java后端(测试文件) | 221 | 1717 (@Test) |
+| Java后端(测试文件) | 224 | 1769 (@Test) |
 | 用户场景(md) | 11 | 文件级 |
-| **合计** | — | **2992** 用例/方法 |
+| **合计** | — | **3044** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -927,13 +927,16 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/DanAssessmentControllerGetActiveMaterialTest.java` | cfc-backend | 3 | DanAssessmentControllerGetActiveMaterial | `cfc-backend/src/test/java/com/etotem/cfc/controller/DanAssessmentControllerGetActiveMaterialTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/EnergyControllerGrantEnergyTest.java` | cfc-backend | 3 | EnergyControllerGrantEnergy | `cfc-backend/src/test/java/com/etotem/cfc/controller/EnergyControllerGrantEnergyTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | cfc-backend | 6 | HealthCheckinCfEarnCallSite | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthDimensionControllerUploadContractTest.java` | cfc-backend | 21 | HealthDimensionControllerUploadContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthDimensionControllerUploadContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | cfc-backend | 6 | HealthPlanDeleteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerCreateReportTest.java` | cfc-backend | 5 | HealthReportControllerCreateReport | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerCreateReportTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` | cfc-backend | 4 | HealthReportControllerListPagination | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | cfc-backend | 6 | HealthReportControllerProxyParseBinding | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerUploadTest.java` | cfc-backend | 16 | HealthReportControllerUpload | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerUploadTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | cfc-backend | 2 | IndicatorController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | cfc-backend | 10 | IndicatorFavoriteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` | cfc-backend | 1 | MembershipControllerPlansLevelOrder | `cfc-backend/src/test/java/com/etotem/cfc/controller/MembershipControllerPlansLevelOrderTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` | cfc-backend | 15 | AdminAuthControllerLoginContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | cfc-backend | 10 | AdminAuthControllerLoginStatus | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | cfc-backend | 11 | AdminAuthWechatScan | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | cfc-backend | 4 | AdminButlerControllerEnvelope | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` |

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.