Jelajahi Sumber

test(tdd): 补齐 CFC 测试发现与跟踪台账及测试工作计划

- inventory.md: 跨源测试总台账(结构化用例678 + Playwright411 + pytest47 + Java @Test1379 + 场景8 = 2515)
- discovery.md: 后端 Controller 覆盖发现(357 控制器/1933 handler,已覆盖 10.3%)
- automation-status.md: 自动化状态台账
- runbook.md: 测试工作计划 + 本机执行 Runbook + 优先 backlog(admin 模块 103 未覆盖 P0)
- expert_review.md: 项目画像 + 20 类覆盖矩阵(应用历史教训纠正 compat/metrics 短词误判)

注:.tdd/ 本地私有目录已被 .gitignore 排除,未纳入本提交。
E2E Test Bot 1 Minggu lalu
induk
melakukan
f12838c51a

File diff ditekan karena terlalu besar
+ 684 - 684
docs/tdd/test/automation-status.md


+ 19 - 18
docs/tdd/test/discovery.md

@@ -1,31 +1,30 @@
 # TDD 测试发现 Ledger(自动扫描 · 只读)
 
-> 生成依据:`tdd-orchestrator/scripts/discover_tests.py` 扫描 `cfc-backend\src\main\java` 与 `cfc-backend\src\test\java`。
+> 生成依据:`tdd-orchestrator/scripts/discover_tests.py` 扫描 `cfc-backend/src/main/java` 与 `cfc-backend/src/test/java`。
 > 本 ledger 仅**格式化与跟踪已有测试**,不创建任何测试用例。覆盖判定兼容两种风格:HTTP 端点 + 直接方法调用。
 
 ## 一、汇总
 
 | 指标 | 数值 |
 | --- | --- |
-| 控制器总数 | 356 |
-| handler 方法总数 | 1918 |
-| handler 已覆盖 | 198 (10.3%) |
-| 控制器-已全覆盖(covered) | 16 |
-| 控制器-部分覆盖(partial) | 68 |
-| 控制器-未覆盖(uncovered) | 271 |
-| 控制器-无 handler | 1 |
+| 控制器总数 | 357 |
+| handler 方法总数 | 1933 |
+| handler 方法已覆盖 | 199 (10.3%) |
+| 单元-全覆盖(handler 方法) | 16 |
+| 单元-部分覆盖(handler 方法) | 69 |
+| 单元-未覆盖(handler 方法) | 271 |
+| 单元-无handler 方法 | 1 |
 | 测试文件数 | 182 |
-| @Test 方法总数 | 1371 |
+| @Test 方法总数 | 1379 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
 
-> 以下控制器在当前测试源中**没有任何 handler 方法被命中**。这是真实扫描得到的覆盖缺口。
+> 以下控制器在当前测试源中**没有任何handler 方法被命中**。这是真实扫描得到的覆盖缺口。
 
 共 271 个:
 
 - `AdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java`,65 方法)
-- `HealthReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java`,59 方法)
 - `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
 - `AdminArticleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java`,22 方法)
 - `TaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskController.java`,18 方法)
@@ -39,6 +38,7 @@
 - `BadgeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/BadgeController.java`,11 方法)
 - `SupplyHierarchyController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyHierarchyController.java`,11 方法)
 - `TrainingPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TrainingPlanController.java`,11 方法)
+- `ActivityTeamController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ActivityTeamController.java`,10 方法)
 - `AdminGuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminGuideController.java`,10 方法)
 - `CouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/CouponController.java`,10 方法)
 - `GuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideController.java`,10 方法)
@@ -88,10 +88,11 @@
 
 ## 三、部分覆盖控制器(已做一部分测试)
 
-> 这些控制器**已有测试但只覆盖了部分方法**——即用户要求的「已经做了一部分测试的情况,要能够找到」。
+> 这些控制器**已有测试但只覆盖了部分handler 方法**——即用户要求的「已经做了一部分测试的情况,要能够找到」。
 
-共 68 个:
+共 69 个:
 
+- `HealthReportController`:覆盖 1/59,未覆盖方法:createReport、getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getMemberIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent
 - `HealthKnowledgeBaseController`:覆盖 1/28,未覆盖方法:batchQuery、list、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood
 - `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
@@ -115,6 +116,7 @@
 - `EnergyController`:覆盖 5/9,未覆盖方法:configureSourceRatios、getScoreHistory、getFamilyScoreHistory、getWealthDetail
 - `FiveDimensionSelfCheckController`:覆盖 3/9,未覆盖方法:submit、getHistory、ignoreSelfCheck、generatePlan、getTrendAnalysis、aiGenerateQuestions
 - `ProductController`:覆盖 6/9,未覆盖方法:updateImages、specMap、relatedProducts
+- `SupplyTeamController`:覆盖 1/9,未覆盖方法:listCustomers、bindCustomer、getRelation、serviceAssign、serviceTasks、customerServices、updateServiceTask、serviceCandidates
 - `CognitiveController`:覆盖 1/8,未覆盖方法:getChildCognitiveScores、getFamilyCognitiveScores、updateCognitiveScore、getRecommendations、createTaskFromRecommendation、getNorms、submitSelfTest
 - `GuideTeamController`:覆盖 6/8,未覆盖方法:checkStatus、leaveTeam
 - `DoaController`:覆盖 1/7,未覆盖方法:createStage、stageDetail、cancelStage、submitPlan、submitReview、weekList
@@ -142,7 +144,6 @@
 - `ConsentController`:覆盖 2/4,未覆盖方法:withdrawConsent、checkConsent
 - `OctopusController`:覆盖 1/4,未覆盖方法:tentacles、addHelpLog、deleteHelpLog
 - `ParentAssessmentController`:覆盖 2/4,未覆盖方法:createAssessment、completeAssessment
-- `SupplyTeamController`:覆盖 1/4,未覆盖方法:listCustomers、bindCustomer、getRelation
 - `AdminHealthPlanController`:覆盖 1/3,未覆盖方法:list、detail
 - `AdminPackageController`:覆盖 1/3,未覆盖方法:approvePackage、rejectPackage
 - `BindInviteController`:覆盖 2/3,未覆盖方法:confirmBind
@@ -189,6 +190,7 @@
 | `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/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 | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionEvaluatorServiceTest.java` | com | 12 | 7 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | com | 12 | 10 | 0 | — | — |
@@ -279,7 +281,6 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/NumSoulCalculatorTest.java` | com | 5 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderComboStockTest.java` | com | 5 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductSkuComboServiceTest.java` | com | 5 | 0 | 0 | ProductSkuController | — |
-| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | com | 5 | 0 | 0 | ProductController | — |
 | `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 | — |
@@ -293,6 +294,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FortuneServiceTest.java` | com | 4 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | com | 4 | 4 | 0 | GuideController | — |
 | `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/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 | — |
@@ -317,7 +319,6 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/NormalizeIndicatorPipelineTest.java` | com | 3 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/task/OrderTimeoutCancelTaskSpecialDealTest.java` | com | 3 | 0 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/PaymentServiceORDRoutingTest.java` | com | 3 | 1 | 0 | PaymentController | — |
-| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | com | 3 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductOrderServiceTest.java` | com | 3 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceUpdateExpressFieldTest.java` | com | 3 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/RepeatTaskGeneratorPassThroughTest.java` | com | 3 | 0 | 0 | — | — |
@@ -335,7 +336,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceFamilyTest.java` | com | 2 | 0 | 0 | EnergyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FiveDimensionSelfCheckServiceTest.java` | com | 2 | 0 | 0 | FiveDimensionSelfCheckController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | com | 2 | 1 | 1 | IndicatorController | — |
-| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductListNutritionTagFilterTest.java` | com | 2 | 0 | 0 | ProductController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | com | 2 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | com | 2 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | com | 2 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/AiGatewayTimeoutTest.java` | com | 1 | 2 | 0 | — | — |
@@ -344,7 +345,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorCorrelationServiceTest.java` | com | 1 | 0 | 0 | IndicatorController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorValueMapperTest.java` | com | 1 | 0 | 0 | IndicatorController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/mind/MindFortuneControllerTest.java` | com | 1 | 1 | 0 | MindFortuneController | — |
-| `cfc-backend/src/test/java/com/etotem/cfc/unit/RecommendationNutritionTagTest.java` | com | 1 | 0 | 0 | RecommendController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | com | 1 | 0 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | com | 1 | 0 | 0 | ReportSummaryController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | com | 0 | 0 | 0 | — | — |
 

+ 124 - 0
docs/tdd/test/expert_review.md

@@ -0,0 +1,124 @@
+# CFC(浠艾福 / XAF)测试覆盖审计 · 项目画像与覆盖矩阵
+
+> 软件测试专家团 · 主理人 陆谨
+> 生成时间:2026-11-01
+> 状态:**阶段 3 闸门前**(画像 + 矩阵 + 方案已出,待用户确认范围与执行档)
+
+---
+
+## 一、历史审查记录
+
+- **本次为 CFC 项目的首次审查**:记忆库 `sessions.jsonl` 会话摘要 0 条,无任何历史结论可复用。
+- 命中 5 条 `tooling` 类历史教训(均为专家团工具自身已知坑,已验证),作为本次**额外检查项**:
+  - `LES-001` 描述性文件名误判为测试资产 → 本次矩阵「已发现」必须给出命中具体路径。
+  - `LES-002` 短词 uat 子串误匹配 → 本次对 smoke/regression/compat/resilience/metrics/coverage 等短词做**定向核验**,已纠正 2 处误判(见矩阵)。
+  - `LES-005` 密钥正则误判 → 本报告不写入任何密钥/口令。
+
+---
+
+## 二、项目画像
+
+> ⚠️ 工具自动读取校正:`project_profiler` 误将根目录 `README.md`(描述 `web/` 下的 etotem.com.cn 静态站点)当作项目类型,给出 `project_name=zxyj`、类型「待确认」。该读取与 CFC 实际不符,下方画像以 `AGENTS.md`、`repo_scanner` 基线、`docs/tdd/test/inventory.md` 实测数据为准。
+
+| 维度 | 内容 |
+|---|---|
+| 项目 | CFC(浠艾福 / XAF)· 家庭教育健康成长平台(多模块单仓) |
+| 业务定位 | 家庭健康/教育:五维能量(身/心/智/行/富)、双角色(家长/规划师)、测评订单、健康报告上传解析、AI 对话(LangGraph)、电商+分销 |
+| 技术栈 | **Java 主语言(2220 文件)**:Spring Boot 2.7.18 + MyBatis-Plus + Java 8,后端 9082;**Vue 2**:cfc-frontend 小程序(596)、cfc-web 管理端(342);**Python**:cfc-langgraph FastAPI+LangGraph+ChromaDB(9000,150 文件);**Rust**:cfc-desktop-pet Tauri(13);SQL 34 |
+| 测试技术 | Java:JUnit/TestNG + Mockito;JS:Jest;Python:pytest;E2E:Playwright |
+| 关键路径 | 用户/家庭/会员/支付/订单(电商+分销返佣)、健康报告上传解析(依赖 9000 LangGraph)、AI 对话(AiGateway 熔断+超时+Fallback)、权限(JwtInterceptor + 角色手动校验) |
+| 规模基线 | 源码 3374 文件 / 8939 总文件;测试代码量大但**无 CI**(ci_systems=[]) |
+| 测试现状(实测) | Java @Test 1379(182 文件)、Playwright 411、pytest 47、结构化用例 678、用户场景 8 = 合计约 2515;后端 357 Controller / 1933 handler,**已覆盖仅 10.3%**,admin 模块 103 个未覆盖为最大短板 |
+| 风险点 | ①无 CI,靠人工本地跑;②后端集成测试强依赖 MySQL/Redis,环境门槛高;③admin 关键管理接口覆盖率极低;④无安全/性能/契约/变异测试;⑤多模块同名类 Bean 命名冲突(AGENTS 已提示) |
+| 质量目标 | AGENTS.md 隐含:接口统一 `@PostMapping`、统一 `Result<T>`、JWT 鉴权、`DatabaseInitializer` 为迁移唯一入口;**量化验收目标需与用户确认** |
+
+### 数据质量说明(重要,避免误读)
+- `repo_scanner` 的 `test_file_count=641` **含虚高**:把 `docs/superpowers/specs/*.md` 设计文档(目录名 `specs` 被当作测试语境)计入,真实测试代码远少于此。
+- 仓库含 `.wt-*` 副本/工作树目录,本画像与矩阵已**排除**其干扰。
+- `project_profiler` 提示「文件索引达 20000 上限截断」——本仓仅 8939 文件,该截断提示可能源于其内部计数口径;矩阵中「未发现」一律按**待核实**口径处理(不据此判「项目没做」)。
+
+---
+
+## 三、20 类测试覆盖矩阵(修正版)
+
+> 三态口径:`present`=已发现资产并给出路径;`未发现`=全仓定向扫描计数 0;`待核实`=扫描未能确认或需人工确认。
+> 应用 `LES-001/002`:对短词匹配做了定向核验,纠正 `compat`/`metrics` 两处业务模型误判。
+
+### 功能层次(5 类)
+| # | 测试类型 | 三态 | 证据 / 说明 |
+|---|---|---|---|
+| 1 | 单元测试 | **present** | `cfc-backend/src/test/java/**/*Test.java`(TDD 盘点 182 文件 / 1379 @Test,含 unit/util/common 纯单测子集);`cfc-langgraph/tests/test_*.py`(12 pytest);`cfc-frontend/__tests__/*.js` + `cfc-web/src/__tests__/*.js`(Jest) |
+| 2 | 集成测试 | **present** | `cfc-backend/src/test/java/.../integration/**/*Test.java`(43 @SpringBootTest + 33 @DataJpaTest,**需 MySQL/Redis**);`cfc-langgraph` FastAPI 集成 |
+| 3 | 契约测试 | **未发现** | 全仓 pact/contract 依赖、`.pact` 文件、契约目录计数均为 0 |
+| 4 | 系统/端到端 | **present** | `tests/e2e/*.spec.js`(TDD 盘点 411 Playwright);`e2e_complete_test.py`;`docs/superpowers/specs` 中 e2e 重构设计 |
+| 5 | 验收 UAT | **present(文档级,非自动化)** | `tests/user-scenarios/*.md`(8 用户场景,TDD 盘点);`tests/E2E-TEST-SCENARIOS.md` |
+
+### 功能保障(4 类)
+| # | 测试类型 | 三态 | 证据 / 说明 |
+|---|---|---|---|
+| 6 | 冒烟测试 | **present** | `tests/e2e/_smoke_browser.spec.js`;`tests/e2e/api/api-smoke.spec.js`;`tests/playwright.config.smoke.js`;`ops_interface_smoke.py` |
+| 7 | 回归测试 | **present(弱)** | `cfc-frontend/scripts/equiv-regression.js`(等价回归校验脚本);`tests/TEST-RESULTS-vN.md` 多版本 e2e 结果快照(回归跟踪);**无独立回归测试套件** |
+| 8 | 接口 API 测试 | **present** | `docs/tdd/test/discovery.md`(357 Controller / 1933 handler 覆盖盘点);`cfc-backend/.../integration/controller/*Test`;`cfc-frontend/__tests__/api`、`cfc-web/src/__tests__/api` |
+| 9 | 探索性测试 | **待核实** | 无资产留痕;手工探索性流程可能存在但未沉淀 |
+
+### 非功能(6 类)
+| # | 测试类型 | 三态 | 证据 / 说明 |
+|---|---|---|---|
+| 10 | 性能测试 | **未发现** | k6/jmeter/locust/artillery/gatling/load_test 计数全 0;无压测资产 |
+| 11 | 安全测试 | **未发现(待核实)** | owasp/bandit/snyk/sonar/dependency-check/trivy/semgrep 计数 0;无 SAST/DAST/依赖漏洞扫描配置。安全相关代码(JwtInterceptor、角色校验)存在,但**无自动化安全测试** |
+| 12 | 兼容性测试 | **待核实** | 原 scan 命中 `compat` 实为业务模型(`BloodTypeCompatibilityVO`/`ZodiacCompatibilityVO`/`CompatibilityService`=生肖/血型配对),**非兼容性测试**;无浏览器/设备矩阵资产 |
+| 13 | 可用性测试 | **待核实** | 无资产 |
+| 14 | 无障碍测试 | **未发现** | a11y/axe/pa11y 计数 0 |
+| 15 | 可靠性测试 | **present** | `cfc-backend/.../service/HealthReportServiceBackfillResilienceTest.java`;`AiGatewayTimeoutTest.java`(故障注入/超时容错) |
+
+### 度量与流程(5 类)
+| # | 测试类型 | 三态 | 证据 / 说明 |
+|---|---|---|---|
+| 16 | 测试覆盖率 | **present(仅 JS)** | `cfc-frontend/jest.config.js`、`cfc-web/jest.config.js`、`tests/jest.config.js`(Jest 覆盖率);**Java 侧 JaCoCo 未检出**;TDD 已手工测算 Controller 覆盖 10.3% |
+| 17 | 变异测试 | **未发现** | mutmut/pitest/stryker 计数 0 |
+| 18 | QA 流程 | **present** | `tests/AGENTS.md`、`tests/README.md`、`tests/BLACKBOX-TEST-PLAN.md`、`tests/E2E-TEST-GUIDE.md`、`tests/ISSUE-TRACKING.md`、`tests/defects/DEFECT-*.md` |
+| 19 | 质量指标 | **待核实** | 原 scan 命中 `metrics` 实为 Chromium 浏览器画像 `.pma` 文件,非质量指标资产;无独立质量度量测试 |
+| 20 | 代码审查与整洁度 | **待核实** | 根目录 `INTERFACE_CONTRACT_REVIEW.md`/`INTERFACE_TEST_REPORT.md`/`INTERFACE_FAIL_CLASSIFICATION.md`/`INTERFACE_TEST_BUSINESS_REPORT.md`(接口评审文档);**未检出 lint/静态分析配置**(ESLint/Sonar 等) |
+
+### 矩阵小结
+- **present:11**(其中 回归弱、UAT 文档级、覆盖率仅 JS,共 3 项需加注)
+- **未发现:6**(契约 / 性能 / 安全 / 无障碍 / 变异 / *质量指标误判后归未发现*)
+- **待核实:3**(探索性 / 兼容性 / 代码审查与整洁度)
+
+---
+
+## 四、测试方案(草案)
+
+### 目标
+对 CFC 全栈做「测试覆盖审计 + 全项目代码审查」,产出覆盖缺口清单、五要素问题清单与门禁结论。本环境(沙箱)以**只读分析 + 代码审查 + 测试设计与缺口诊断**为主;实际跑测依赖用户本地环境。
+
+### 范围与优先级
+- **P0(可在此沙箱直接做只读审查)**:单元测试 / 集成测试 / 接口API / **全项目代码审查**
+- **P1(资产已存在,做覆盖评估与设计)**:系统·E2E / 冒烟 / 回归 / 可靠性 / QA流程 / 覆盖率
+- **P2(无资产,做测试设计 + 缺口诊断)**:安全 / 性能 / 兼容性 / 可用性 / 无障碍 / 契约 / 变异 / 探索性 / 质量指标
+
+### 默认全覆盖 20 类;若用户收窄,被排除维度标「不适用(方案排除)」,不算缺失。
+
+### 执行档与降级
+- **默认档位:review(离线白名单)**。
+- 本沙箱实测:无 `mvn`、无 `pytest` 模块、Playwright 需浏览器+后端 9082 → **单元/集成/E2E/pytest 的实际运行将标记为「未实测」并降级为测试设计 + 缺口诊断**,绝不伪造成通过。
+- **唯一能真做的只读项**:全项目代码审查(源码可直读)+ 静态证据分析。
+- 联网命令(依赖漏洞扫描、压测)属 **execute 档**,需用户**单独显式授权**;本沙箱网络受限,即便授权也可能需落用户本地。
+
+### 排除项
+- 不修改/删除/提交/推送被审查代码(全程只读)。
+- 不安装依赖、不执行仓库内脚本、不跑白名单外命令。
+- 不替代研发做重构或上线决策。
+
+---
+
+## 五、执行档申请(待用户确认)
+
+| 项 | 申请 |
+|---|---|
+| 审查范围 | 默认全覆盖 20 类(可收窄) |
+| 执行档 | **review**(离线白名单);execute(联网)需另行授权 |
+| 本环境可实测 | 仅全项目代码审查(只读);其余测试运行项降级为设计+缺口诊断 |
+| 需用户本地 | Java 单测/集成、Python、Playwright 实际跑测(沿用 `docs/tdd/test/runbook.md`) |
+
+> **下一步(阶段 3 闸门)**:请用户确认「范围 + 执行档」后,主理人建立团队 `test-cfc`,按方案分四阶段调度八域专家,并最终产出缺口清单 / 五要素问题清单 / 门禁结论。确认前**不执行任何测试命令**。

File diff ditekan karena terlalu besar
+ 682 - 682
docs/tdd/test/inventory.md


+ 93 - 0
docs/tdd/test/runbook.md

@@ -0,0 +1,93 @@
+# CFC · 测试工作 Runbook(发现/跟踪 + 本机执行)
+
+> 生成日期:2026-11-01 | 模式:discovery-only(发现/跟踪)
+> 本仓库的 tdd-orchestrator 定位为「发现 / 格式化 / 跟踪已有测试」,**实际跑测试在开发机完成**
+> (需 mvn / MySQL / 已配好的 Python 环境)。本沙箱负责发现、编目、规划与进度跟踪。
+
+## 1. 当前测试资产(只读扫描,2026-11-01)
+
+| 来源 | 文件数 | 用例/方法 |
+|---|---|---|
+| 结构化用例 `tests/test-cases/*.md` | 9 | 678 |
+| Playwright `tests/**/*.spec.js` | 70 | 411 |
+| Python pytest(`cfc-langgraph` + `tools/xaf_agent_hub`) | 12 | 47 |
+| Java 后端 `@Test`(`cfc-backend/src/test/java`) | 182 | 1379 |
+| 用户场景 `tests/user-scenarios/*.md` | 8 | 文件级 |
+| **合计** | — | **2515** |
+
+后端 Controller 共 357 个、handler 方法 1933,**已覆盖仅 199(10.3%)**,未覆盖 271 个。
+
+## 2. 后端覆盖缺口 Backlog(按模块,真实扫描结果)
+
+> 缺口 = 当前测试源中没有任何 handler 被命中的 Controller。这是发现出的真实缺口,非发明。
+
+| 模块 | 未覆盖 | 总数 | 覆盖率 | 优先级 |
+|---|---|---|---|---|
+| `admin`(运营后台) | 103 | 120 | 14% | **P0** |
+| `guide`(规划师) | 14 | 19 | 26% | P1 |
+| `family`(家庭) | 8 | 15 | 47% | P1 |
+| `mind`(心理) | 6 | 8 | 25% | P2 |
+| `assessment`(测评) | 5 | 6 | 17% | P2 |
+| `diet` / `recommendation` / `fatloss` / `task` / `wealth` / `user` 等 | 各 3–5 | 0% | — | P2/P3 |
+
+`admin` 占全部未覆盖的约 38%,且多为核心管理接口,补测收益最高。
+
+## 3. 执行 Runbook(开发机)
+
+### 3.1 Java 纯单测子集(无需数据库)
+```bash
+cd cfc-backend
+mvn -q -DskipTests compile
+# 只跑不依赖 Spring 上下文 / 数据库的纯单测包
+mvn test -Dtest='com.etotem.cfc.unit.**,com.etotem.cfc.util.**,com.etotem.cfc.common.**'
+```
+
+### 3.2 Java 集成测试(需 MySQL@3306 + Redis@6379 已起)
+```bash
+cd cfc-backend
+mvn test -Dtest='com.etotem.cfc.integration.**'
+# 全量(耗时较长,需完整基础设施):
+mvn test
+```
+
+### 3.3 Python(cfc-langgraph)
+```bash
+cd cfc-langgraph
+python -m venv .venv && .venv\Scripts\activate
+pip install -r requirements.txt pytest pysqlite3   # 含 chromadb/langchain/deepface 等原生重依赖
+pytest tests -q
+```
+
+### 3.4 Playwright E2E(需后端 9082 在跑)
+```bash
+cd tests
+npm install
+npx playwright install chromium
+npx playwright test --project=smoke          # 冒烟子集
+npx playwright test                          # 全量
+```
+
+## 4. 推荐执行顺序(先立基线,再补重依赖)
+
+1. **Java 纯单测子集** —— 最快建立通过基线,无需基础设施。
+2. **Python pytest** —— 需装完整依赖(较重,原生包可能耗时)。
+3. **Java 集成测试** —— 起 MySQL + Redis 后跑。
+4. **Playwright E2E** —— 后端 9082 起来后跑冒烟。
+
+## 5. 进度跟踪(本沙箱侧车)
+
+- 进度落 `.tdd/test-progress.json`,按 `anchor = source_path#local_id` 索引(如 `tests/test-cases/admin.md#TC-A-01`)。
+- 执行后在本沙箱跑 `test_inventory.py` 即从侧车派生 `docs/tdd/test/automation-status.md`。
+- **原始测试文件零侵入**:只改侧车,不改 `.md` / `.spec.js` / `.py` / `.java`。
+- 发现 / 台账命令(只读):
+  ```bash
+  python <skill>/discover_tests.py --project d:/cfc
+  python <skill>/test_inventory.py --project d:/cfc
+  ```
+  `<skill>` = `C:/Users/iwt/.workbuddy/skills/tdd-orchestrator/scripts`
+
+## 6. 优先级与下一步
+
+- **先补 `admin` 模块**(103 未覆盖,核心管理接口),再 `guide` / `family` / `mind` / `assessment`。
+- 在开发机执行完任一子集后,把结果回填侧车(`通过 / 失败 / 阻塞`),再跑 `test_inventory.py` 刷新共享台账。
+- 本沙箱不推送 `.tdd/`;`docs/tdd/test/*.md` 可提交推送给测试团队。

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini