Bläddra i källkod

docs(tdd): 测试负责人 08:12 轮(55 例契约全绿:16契约+createTask 7+review 32;2 YELLOW 连续第4轮复验通过;2 新 RED createTask/review 契约落地;8 sha 全在远端;O-1 转为纯状态机同步缺口)

E2E Test Bot 1 vecka sedan
förälder
incheckning
69f8820d89

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 1
docs/tdd/orchestration/pending.md


+ 89 - 0
docs/tdd/test/automation-run-2026-11-05-0812.md

@@ -0,0 +1,89 @@
+# 自动化测试执行报告 · 2026-11-05 08:12(TDD 闭环测试负责人轮)
+
+> 触发:定时自动化「TDD 多智能体研发测试调度」skill · 软件测试专家团
+> 指令:**作为测试负责人,处理 TDD 闭环测试工作**
+> 角色:测试负责人(cfc-tester,本机单机模式;未派发 opencode,只读扫描 + 离线契约测试实跑 + 状态盘点)
+> 本轮 HEAD:`536c3afca`(=origin/cfclub,本地快进 4 commit;工作区 165+ 项跨角色未提交改动未触碰)
+> 与并发批次关系:08:05 批次(46 轮)已覆盖前端/全量后端,本轮聚焦 **TDD 闭环契约实测 + 状态机核验**,不重复全量。
+
+## 1. 本轮核心证据:55 例契约测试离线实跑全绿(全新增量)
+
+`/d/tools/apache-maven-3.9.9/bin/mvn -o -B -f cfc-backend/pom.xml -DskipTests=false -Dtest='...' test`
+(`-DskipTests=false` 必加,规避 pom.xml:28 假绿坑;1m32s,testCompile 0 错)
+
+| 测试类 | 用例 | 关联键 / 任务 | 结果 |
+|---|---|---|---|
+| `HealthReportControllerCreateReportTest` | 5 | health.report.createReport(YELLOW 待 mark-green) | 🟢 5/5 |
+| `DanAssessmentControllerGetActiveMaterialTest` | 3 | dan.assessment.getActiveMaterial(YELLOW 待 mark-green) | 🟢 3/3 |
+| `TrainingPlanControllerGetPlanDetailTest` | 8 | guide.trainingPlan.getPlanDetail(研发侧 DONE) | 🟢 8/8 |
+| `TaskControllerCreateTaskTest` | 7 | task.parent.createTask(S-cfc-12,**新 RED 待 mark-red**) | 🟢 7/7 |
+| `TaskControllerReviewTest` | 17 | task.parent.review(S-cfc-13,**新 RED 待 mark-red**) | 🟢 17/17 |
+| `TaskServiceReviewTest` | 15 | task.parent.review(S-cfc-13,服务层) | 🟢 15/15 |
+| **合计** | **55** | — | **55/55 全绿 BUILD SUCCESS** |
+
+**要点**:
+- 2 个 YELLOW 键(createReport / getActiveMaterial)契约复验**连续第 4 轮全绿**(03:30/05:35/08:05/08:12),证据稳定。
+- **2 个新 RED 键(createTask / review)契约测试已落地并在本轮实测全绿**——RED 侧 git 证据 + 测试执行证据双齐备。
+- 新增 review 用例 32 例(S-cfc-13,291955bce 660 行契约测试)本轮首次纳入本地实测。
+
+## 2. 状态机盘点(与研发侧状态机仍不同步)
+
+| 项 | 本地 `.tdd/state.json` | 研发侧 08:00 汇报口径 |
+|---|---|---|
+| 键数 | 3(伪 RED,mtime 11-04 10:14,第 13 轮未动) | RED 2 / YELLOW 2 / GREEN 0 / **DONE 9** |
+| health.report.createReport | RED(无 red_sha) | **YELLOW**(1767d4414) |
+| dan.assessment.getActiveMaterial | RED(无 red_sha) | **YELLOW**(c3e32460a) |
+| guide.trainingPlan.getPlanDetail | RED(无 red_sha) | **DONE**(55caf6966) |
+| task.parent.createTask | **不存在** | **RED**(证据 2a1f72ff5 已推远端) |
+| task.parent.review | **不存在** | **RED**(证据 291955bce 已推远端) |
+
+**mark 落账实测**(测试角色正规入口):
+- `--mark-red task.parent.createTask` → ❌「键不在状态机中(先 --apply / --add-task 登记)」
+- `--mark-green health.report.createReport` → ❌「当前阶段 RED,须先 YELLOW(开发完成)再由测试校验」
+
+**结论**:本地 state.json 与研发侧状态机**深度不同步**(键集合不一致 + 阶段不一致),测试侧无法通过正规 CLI 完成 mark-red/mark-green 落账。按既有纪律测试侧**不擅自改写本地 state.json**,落账缺口持续挂 O-1(待状态机同步)。研发侧 08:00 汇报已多次提示「落账属测试角色,研发不代」,但测试侧本地状态机缺键无账可落——**状态机同步责任在编排侧(主理人)**,非测试侧可自解。
+
+## 3. git 证据核验(8 sha 全 IN origin/cfclub ✓)
+
+| sha | 键 / 任务 | 角色 |
+|---|---|---|
+| 2a1f72ff5 (merge) / dc66edb23 | task.parent.createTask RED 测试 | 测试(S-cfc-12) |
+| 291955bce | task.parent.review RED 测试 | 测试(S-cfc-13) |
+| 1767d4414 | createReport YELLOW 实现 | 研发 |
+| c3e32460a | getActiveMaterial YELLOW 实现 | 研发 |
+| 81d8883f7 / faf3ca174 / 55caf6966 | 三键契约测试(历史) | 测试 |
+
+## 4. 台账重扫(增量来自已提交代码)
+
+- 控制器 **358** / handler 1941(覆盖 **371 = 19.1%**,↑ 18.8%)/ 测试文件 **215**(@Test **1651**)/ 跨源用例 **2853**(md 729 + PW 426 + py 47 + Java 1651 + 场景 9)
+- 增量来源:S-cfc-13 review 契约测试(TaskControllerReviewTest 17 + TaskServiceReviewTest 15)+ TaskControllerCreateTaskTest 7 计入 Java @Test 计数
+- 三份共享台账(discovery.md / inventory.md / automation-status.md)已刷新
+
+## 5. 阻塞与风险(沿用,无新增)
+
+- **O-1(P1)**:2 YELLOW 键 mark-green 落账 + 2 RED 键 mark-red 落账均被**本地状态机同步缺口**卡住——测试证据链完备(本轮 55 例全绿),仅缺状态机同步动作(编排侧)。
+- **O-2(待裁决)**:SC → 能力键映射方案 A 追认,218 SC 顶层目标入池。
+- **B-14**:并发跑测窗口基线漂移;全量复验待下轮固定 SHA 重跑(本轮采信 07:25 批次 92.20%)。
+- **B-13**:3 个 @SpringBootTest 硬编码 127.0.0.1:3306 → 8 例环境红,待改 @ActiveProfiles。
+- **B-15/B-16**:度量脚本未入库 / 根级 integration 套件缺凭据夹具(测试侧,待处置)。
+
+## 6. 结论与下轮前置
+
+**结论:不通过(承袭,有条件)**——主卡点从代码层转向**编排层状态机同步**:
+测试证据链已完备(55 例契约全绿 + 8 sha 在远端 + 台账 19.1%),但 RED→YELLOW→GREEN 的登记动作被本地 state.json
+过时(键缺失/阶段错位)阻塞,测试侧无越权入口。
+
+使绿顺序:
+1. **编排侧(主理人)同步本地/研发状态机**(test 侧本地 state.json 键集 + 阶段对齐研发 08:00 口径)→ 测试 mark-green 收口 2 YELLOW + mark-red 落账 2 RED
+2. B-14 全量复验(固定 SHA worktree 重跑 210 类,验 92.20% 漂移)
+3. B-13 环境红修复(@ActiveProfiles("test"))→ G2 红例减 8
+4. P-2 map 契约 3 红拍板(G8)
+5. B-1~B-5 缺陷派发(黑窗已解,研发 08:00 后即可派)
+
+## 7. 未实测项(如实记录)
+
+- 全量后端 surefire 210 类:本轮未重跑(采信 07:25/08:05 兄弟批次 92.20%,业务基线未变;B-14 遗留)
+- 前端 jest(cfc-frontend 296/296、cfc-web 90/90):采信 08:05 批次
+- Playwright / 接口冒烟 / langgraph pytest:联网未授权(9082 在线已由 08:05 批次实测冒烟 54.2%)
+- JaCoCo / PIT 变异 / 性能 / 依赖漏洞:无工具未实测
+- **状态机登记(mark-red/mark-green)**:被本地状态机过时拒绝,非未尝试(实测求证见 §2)

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

@@ -21,10 +21,10 @@
 | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
 | 结构化测试用例(md) | 9 | 729 | 0 | 729 | 729 | 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) | 72 | 426 | 72 | 0 | 62 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 205 | 1545 | 205 | 0 | 188 | 0 | 15 | 2 | 0 |
-| **合计** | — | **2731** | **286** | **738** | 997 | 0 | 22 | 5 | 0 |
+| Java后端测试 | 215 | 1651 | 215 | 0 | 198 | 0 | 15 | 2 | 0 |
+| **合计** | — | **2853** | **298** | **738** | 1009 | 0 | 22 | 5 | 0 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -781,6 +781,8 @@
 | `tests/e2e/api/family-member-api.spec.js` | 14 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/nonfunc-perf-compat.spec.js` | 5 | 已自动化(e2e) | 通过 | — |
 | `tests/e2e/api/nonfunc-security.spec.js` | 11 | 已自动化(e2e) | 失败 | — |
+| `tests/e2e/api/sc-p-03-switch-role.spec.js` | 11 | 已自动化(e2e) | 未跟踪 | — |
+| `tests/e2e/api/wechat-login.spec.js` | 5 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/article-management.spec.js` | 5 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/assessment-appointment-functional.spec.js` | 7 | 已自动化(e2e) | 未跟踪 | — |
 | `tests/e2e/assessment-appointment.spec.js` | 6 | 已自动化(e2e) | 未跟踪 | — |
@@ -861,9 +863,13 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | 7 | 已自动化(@Test) | 通过 | AttributionStage1Foundation |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | 6 | 已自动化(@Test) | 通过 | DatabaseInitializerSeed |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | 11 | 已自动化(@Test) | 通过 | FamilyAccessInterceptor |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | 10 | 已自动化(@Test) | 未跟踪 | JwtInterceptorContractEdge |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | 5 | 已自动化(@Test) | 通过 | JwtInterceptorLoginRequired |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` | 4 | 已自动化(@Test) | 未跟踪 | JwtInterceptorWechatLogin |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` | 19 | 已自动化(@Test) | 未跟踪 | ScG06JwtGuard |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | 1 | 已自动化(@Test) | 通过 | AttributionController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | 3 | 已自动化(@Test) | 通过 | AttributionSurveyRouting |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` | 10 | 已自动化(@Test) | 未跟踪 | AuthWechatLoginContract |
 | `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 |
@@ -888,6 +894,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | 1 | 已自动化(@Test) | 通过 | TeacherMessageControllerMy |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | 8 | 已自动化(@Test) | 未跟踪 | TrainingPlanControllerGetPlanDetail |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | 10 | 已自动化(@Test) | 通过 | TrainingPlanControllerGetPlanList |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TaskControllerCreateTask |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | 17 | 已自动化(@Test) | 未跟踪 | TaskControllerReview |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | 3 | 已自动化(@Test) | 未跟踪 | ActivityDTO |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | 6 | 已自动化(@Test) | 未跟踪 | DailyCheckinStreakFlow |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | 7 | 已自动化(@Test) | 未跟踪 | EnergySystemFlow |
@@ -1004,10 +1012,13 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | 1 | 已自动化(@Test) | 未跟踪 | ReportSummaryServiceCompleteness |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | 9 | 已自动化(@Test) | 未跟踪 | SpecialPriceService |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TaskServiceCfEarn |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` | 15 | 已自动化(@Test) | 未跟踪 | TaskServiceReview |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TencentTtsServiceAuthorization |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | 2 | 已自动化(@Test) | 未跟踪 | UserAddressServiceBackfill |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | 5 | 已自动化(@Test) | 未跟踪 | UserServiceEffectiveFamilyIds |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | 2 | 已自动化(@Test) | 未跟踪 | UserServiceFamilyNameLink |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | UserServiceWechatLoginContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginTest.java` | 5 | 已自动化(@Test) | 未跟踪 | UserServiceWechatLogin |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | 4 | 已自动化(@Test) | 未跟踪 | WishService |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | 6 | 已自动化(@Test) | 未跟踪 | WithdrawalService |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | 4 | 已自动化(@Test) | 未跟踪 | CfGrowthEarnCallSite |
@@ -1037,6 +1048,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | 7 | 已自动化(@Test) | 未跟踪 | FamilyMemberDimensionBaseScoreService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java` | 4 | 已自动化(@Test) | 未跟踪 | FamilyMemberServiceRename |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | 5 | 已自动化(@Test) | 未跟踪 | FamilyNamingSupport |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyUserSwitchRoleTest.java` | 13 | 已自动化(@Test) | 未跟踪 | FamilyUserSwitchRole |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | 12 | 已自动化(@Test) | 未跟踪 | FiveDimensionScoreService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | 9 | 已自动化(@Test) | 未跟踪 | GuideFamilyAccessGuard |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | 4 | 已自动化(@Test) | 未跟踪 | GuideFamilyQueryService |

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

@@ -9,13 +9,13 @@
 | --- | --- |
 | 控制器总数 | 358 |
 | handler 方法总数 | 1941 |
-| handler 方法已覆盖 | 365 (18.8%) |
+| handler 方法已覆盖 | 371 (19.1%) |
 | 单元-全覆盖(handler 方法) | 25 |
 | 单元-部分覆盖(handler 方法) | 192 |
 | 单元-未覆盖(handler 方法) | 140 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 205 |
-| @Test 方法总数 | 1545 |
+| 测试文件数 | 215 |
+| @Test 方法总数 | 1651 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
@@ -98,8 +98,8 @@
 - `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
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
-- `TaskController`:覆盖 1/18,未覆盖方法:getMinigameOptions、createTask、getTodayTasks、completeTask、startTask、reviewTask、getTaskHistory、getPendingReviewTasks、getTodayParentTasks、completeParentTask
-- `FamilyUserController`:覆盖 2/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchRole、switchToFamilyMember、switchBackToParent、switchBackVerify、getFamilyMemberren
+- `TaskController`:覆盖 6/18,未覆盖方法:getMinigameOptions、getTodayTasks、completeTask、startTask、getTaskHistory、getTodayParentTasks、completeParentTask、deleteTask、completeMinigameTask、batchComplete
+- `FamilyUserController`:覆盖 3/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchToFamilyMember、switchBackToParent、switchBackVerify、getFamilyMemberren、updateFamilyMember
 - `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
 - `ArticleController`:覆盖 4/16,未覆盖方法:relatedProducts、related、relatedByProduct、getArticleAudio、reportReadingTime、readingStats、dailyTip、aiQuestions、submitAnswers、publish
@@ -301,18 +301,22 @@
 | `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 | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductOrderControllerTest.java` | com | 20 | 3 | 7 | ProductOrderController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` | com | 19 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/ai/AIChatControllerGateTest.java` | com | 18 | 15 | 6 | AIChatController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/SupplySystemServiceTest.java` | com | 18 | 0 | 0 | SupplySystemController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AIChatControllerTest.java` | com | 17 | 17 | 3 | AIChatController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipServiceTest.java` | com | 17 | 0 | 0 | MembershipController | — |
+| `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/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/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 | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/NutritionDeficiencyServiceTest.java` | com | 14 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | com | 13 | 0 | 7 | DimensionAdminController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyUserSwitchRoleTest.java` | com | 13 | 1 | 1 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageServiceTest.java` | com | 13 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTeamServiceUnitTest.java` | com | 12 | 0 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java` | com | 12 | 2 | 0 | CfCommissionController | — |
@@ -333,11 +337,13 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | com | 10 | 10 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityAuditTest.java` | com | 10 | 4 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | com | 10 | 1 | 3 | AdminAuthController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` | com | 10 | 0 | 1 | AuthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboServiceTest.java` | com | 10 | 3 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java` | com | 10 | 9 | 4 | GrowthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideHierarchyServiceTest.java` | com | 10 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | com | 10 | 0 | 0 | HealthPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | com | 10 | 8 | 3 | IndicatorFavoriteController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | com | 10 | 2 | 0 | — | — |
 | `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/controller/ai/ButlerControllerGateTest.java` | com | 9 | 4 | 6 | ButlerController | — |
@@ -376,6 +382,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | com | 7 | 0 | 0 | OrchestrationController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/SupplyTeamControllerInviteTest.java` | com | 7 | 7 | 0 | SupplyTeamController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | com | 7 | 0 | 0 | TaskController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | com | 7 | 0 | 1 | TaskController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityRegistrationQuotaConcurrencyTest.java` | com | 6 | 0 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityServicePublishTest.java` | com | 6 | 0 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleRelatedServiceTest.java` | com | 6 | 0 | 0 | ArticleController | — |
@@ -400,6 +407,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/util/SpearmanUtilTest.java` | com | 6 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/StatsControllerTest.java` | com | 6 | 10 | 2 | StatsController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginContractTest.java` | com | 6 | 3 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/util/UserUtilTest.java` | com | 6 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | com | 6 | 0 | 0 | WithdrawalController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | com | 5 | 1 | 0 | ActivityController | — |
@@ -423,6 +431,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/RelationshipQuestionnaireServiceTest.java` | com | 5 | 0 | 0 | RelationshipQuestionnaireController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | com | 5 | 0 | 0 | TaskController | skip×1、⚠部分 |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | com | 5 | 0 | 0 | UserController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginTest.java` | com | 5 | 3 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | com | 5 | 0 | 0 | VirtualPayController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | com | 4 | 8 | 4 | AdminButlerController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | com | 4 | 1 | 1 | AdminController | — |
@@ -437,6 +446,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java` | com | 4 | 0 | 0 | GuideController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` | com | 4 | 9 | 1 | HealthReportController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorMappingServiceTest.java` | com | 4 | 0 | 0 | IndicatorController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` | com | 4 | 4 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/PointsExchangeServiceTest.java` | com | 4 | 0 | 0 | PointsExchangeController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/PurchaseServiceImplRenewalTest.java` | com | 4 | 5 | 0 | PurchaseController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceTypeServiceTest.java` | com | 4 | 0 | 0 | ServiceTypeController | — |

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

@@ -9,11 +9,11 @@
 | 来源类型 | 文件数 | 用例/方法数 |
 | --- | --- | --- |
 | 结构化测试用例(md) | 9 | 729 |
-| Playwright(spec.js) | 70 | 410 |
+| Playwright(spec.js) | 72 | 426 |
 | Python(pytest) | 11 | 47 |
-| Java后端(测试文件) | 205 | 1545 (@Test) |
+| Java后端(测试文件) | 215 | 1651 (@Test) |
 | 用户场景(md) | 9 | 文件级 |
-| **合计** | — | **2731** 用例/方法 |
+| **合计** | — | **2853** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -774,6 +774,8 @@
 | `tests/e2e/api/family-member-api.spec.js` | 14 | `tests/e2e/api/family-member-api.spec.js` |
 | `tests/e2e/api/nonfunc-perf-compat.spec.js` | 5 | `tests/e2e/api/nonfunc-perf-compat.spec.js` |
 | `tests/e2e/api/nonfunc-security.spec.js` | 11 | `tests/e2e/api/nonfunc-security.spec.js` |
+| `tests/e2e/api/sc-p-03-switch-role.spec.js` | 11 | `tests/e2e/api/sc-p-03-switch-role.spec.js` |
+| `tests/e2e/api/wechat-login.spec.js` | 5 | `tests/e2e/api/wechat-login.spec.js` |
 | `tests/e2e/article-management.spec.js` | 5 | `tests/e2e/article-management.spec.js` |
 | `tests/e2e/assessment-appointment-functional.spec.js` | 7 | `tests/e2e/assessment-appointment-functional.spec.js` |
 | `tests/e2e/assessment-appointment.spec.js` | 6 | `tests/e2e/assessment-appointment.spec.js` |
@@ -856,9 +858,13 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | cfc-backend | 7 | AttributionStage1Foundation | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | cfc-backend | 6 | DatabaseInitializerSeed | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | cfc-backend | 11 | FamilyAccessInterceptor | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` | cfc-backend | 10 | JwtInterceptorContractEdge | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorContractEdgeTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | cfc-backend | 5 | JwtInterceptorLoginRequired | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` | cfc-backend | 4 | JwtInterceptorWechatLogin | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorWechatLoginTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` | cfc-backend | 19 | ScG06JwtGuard | `cfc-backend/src/test/java/com/etotem/cfc/config/ScG06JwtGuardTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | cfc-backend | 1 | AttributionController | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | cfc-backend | 3 | AttributionSurveyRouting | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` | cfc-backend | 10 | AuthWechatLoginContract | `cfc-backend/src/test/java/com/etotem/cfc/controller/AuthWechatLoginContractTest.java` |
 | `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` |
@@ -883,6 +889,8 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | cfc-backend | 1 | TeacherMessageControllerMy | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | cfc-backend | 8 | TrainingPlanControllerGetPlanDetail | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | cfc-backend | 10 | TrainingPlanControllerGetPlanList | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` | cfc-backend | 7 | TaskControllerCreateTask | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerCreateTaskTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` | cfc-backend | 17 | TaskControllerReview | `cfc-backend/src/test/java/com/etotem/cfc/controller/task/TaskControllerReviewTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | cfc-backend | 3 | ActivityDTO | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | cfc-backend | 6 | DailyCheckinStreakFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | cfc-backend | 7 | EnergySystemFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` |
@@ -999,10 +1007,13 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | cfc-backend | 1 | ReportSummaryServiceCompleteness | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | cfc-backend | 9 | SpecialPriceService | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | cfc-backend | 4 | TaskServiceCfEarn | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` | cfc-backend | 15 | TaskServiceReview | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceReviewTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | cfc-backend | 4 | TencentTtsServiceAuthorization | `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | cfc-backend | 2 | UserAddressServiceBackfill | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | cfc-backend | 5 | UserServiceEffectiveFamilyIds | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | cfc-backend | 2 | UserServiceFamilyNameLink | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginContractTest.java` | cfc-backend | 6 | UserServiceWechatLoginContract | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginTest.java` | cfc-backend | 5 | UserServiceWechatLogin | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceWechatLoginTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | cfc-backend | 4 | WishService | `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | cfc-backend | 6 | WithdrawalService | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | cfc-backend | 4 | CfGrowthEarnCallSite | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` |
@@ -1032,6 +1043,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | cfc-backend | 7 | FamilyMemberDimensionBaseScoreService | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java` | cfc-backend | 4 | FamilyMemberServiceRename | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | cfc-backend | 5 | FamilyNamingSupport | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyUserSwitchRoleTest.java` | cfc-backend | 13 | FamilyUserSwitchRole | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyUserSwitchRoleTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | cfc-backend | 12 | FiveDimensionScoreService | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | cfc-backend | 9 | GuideFamilyAccessGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | cfc-backend | 4 | GuideFamilyQueryService | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` |

Vissa filer visades inte eftersom för många filer har ändrats