Эх сурвалжийг харах

test(测试负责人·70轮·18:30): B-50华为健康5端点未鉴权200直通(P0契约缺口) health契约0/10→5/10 | B-47(636c42103)上线后健康模块404→已访问 | 浏览器15/15+Jest双绿(90+313)+langgraph51绿维持 | 补录17:47轮health契约用例

E2E Test Bot 5 өдөр өмнө
parent
commit
8dcc1fd5fc

+ 208 - 0
docs/tdd/test/automation-run-2026-11-07-1747.md

@@ -0,0 +1,208 @@
+# 测试闭环报告 · 2026-11-07 17:47 (GMT+8)
+
+> 主理人:陆谨(软件测试专家团 / 测试架构师)|执行档:**review 档(已授权内网 + 测试用例编写)**
+> 对象:d:/cfc(浠艾福 XAF)|内网 cfc.iwintrue.com → 192.168.16.251(hosts 解析,已授权,不联网)
+> 本产物**未提交、未推送**;仅写入测试目录的用例见第五节。
+
+---
+
+## 一、历史审查记录(跨会话召回)
+
+- 本次为该对象**持续每小时闭环的第 N 次**(最近一次 14:55,HEAD=d21a887cc;再前 12:25/10:46…)。
+- 上次结论:⛔**不通过(有条件)**。遗留缺口:① 37 红类(3 类 B-13 环境硬编码 `127.0.0.1:3306` + 34 类契约漂移 ~112 红,含 S-cfc-31 blank-key 真实校验缺陷);② JaCoCo 缺失,覆盖率仅 surefire 口径 95.02%;③ growth_records 表 schema 重复列(P1,历史未处置);④ `/admin` 登录 E2E 连续 2 轮失败(P0)。
+- **本次改善**:`/admin` E2E 由 3/5 → **5/5**(B-46 根因已定位并关闭:属测试缺陷非部署回归,16:46 轮已修复滑块/登录脚本);Jest 双绿连绿;E2E 全量 15/15。
+- **本次新增**:华为/小米运动健康模块(36 文件/+3360 行)作为新生产代码**零测试覆盖**;新增契约 E2E 10 条并实测发现该模块**未在目标部署实例上线**(404/502)。
+
+---
+
+## 二、项目画像(速览)
+
+| 模块 | 技术栈 | 端口 | 本周期可测范围 / 关键路径 |
+|------|--------|------|---------------------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 接口 `@PostMapping` 统一;JWT 拦截 `/api/**`;本次新增 Huawei/Xiaomi 健康接入(§4.43/§4.44) |
+| cfc-web | Vue 2 + Element UI 管理端 | 8082 | Jest 组件/逻辑测试(mock API) |
+| cfc-frontend | uni-app 微信小程序 (Vue 2) | — | Jest 逻辑测试(无 vue-jest,SFC 不可单测) |
+| 部署实例 | cfc.iwintrue.com → 192.168.16.251 | 80/443 | 内网 E2E 目标(/admin、/frontend、/api) |
+
+**质量目标(沿用)**:核心接口须有契约测试;门禁 0 失败 0 错误;覆盖率(JaCoCo 真值)≥80%。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 状态 | 证据 |
+|---|------|------|------|
+| 1 | 单元测试(后端 JUnit) | 已发现 | 基线 288 类/2389 例(16:46 轮,复用);健康模块缺口 |
+| 2 | 组件测试(前端) | 已发现 | cfc-web 12 套件/90 例、cfc-frontend 16 套件/313 例 全绿 |
+| 3 | 测试覆盖率 | 待核实 | JaCoCo 离线缺失,仅 surefire 口径 95.02% |
+| 4 | 变异测试 | 未发现 | 未配置 pitest,未执行 |
+| 5 | 快照测试 | 未发现 | 无 |
+| 6 | 冒烟测试 | 已发现 | E2E 探活 /frontend+/admin 200/302;/admin 登录冒烟 5/5 |
+| 7 | 回归测试 | 已发现 | Jest 双绿连绿 + 后端基线复用 + E2E 15/15 |
+| 8 | 探索性测试 | 未发现 | 无专职脚本 |
+| 9 | 集成测试(后端) | 已发现 | 后端集成/契约基线;新增 health 契约 E2E 10 条 |
+| 10 | 性能测试 | 未发现 | 需联网压测,未授权未执行 |
+| 11 | 可靠性测试 | 待核实 | 无专职可靠性套件 |
+| 12 | 安全测试(SAST/DAST/依赖漏洞) | 未发现 | 需联网,未授权未执行 |
+| 13 | 兼容性测试 | 已发现 | 前端移动/桌面双视口 E2E |
+| 14 | 可用性测试 | 未发现 | 无 |
+| 15 | 无障碍测试 | 未发现 | 无 |
+| 16 | QA 流程 | 已发现 | 自动化状态台账 docs/tdd/test/automation-status.md + 每小时闭环 |
+| 17 | 质量指标 | 已发现 | 覆盖率台账/自动化状态 |
+| 18 | 全项目代码审查 | 待核实 | 本次聚焦测试闭环,未做全量代码审查 |
+| 19 | 契约测试 | 已发现 | 后端契约 JUnit + 新增 health 契约 E2E |
+| 20 | 接口 API 测试 | 已发现 | shop-sort-api E2E + health 契约 E2E |
+
+---
+
+## 四、测试方案与执行档(预授权,无需交互确认)
+
+- **执行档**:review(已授权内网 + 测试用例编写);联网命令一律不执行。
+- **范围**:功能层次 + 功能保障 + 兼容性(已实测);非功能(性能/安全/依赖漏洞)因需联网**降级为测试设计**。
+- **优先级**:P0 `/admin` 登录真实性;P1 新增健康模块覆盖;P1 JaCoCo 真值;P1 37 红类清零。
+- **排除项**:变异测试、探索性、可用性、无障碍(无资产,标记未发现/待核实,不伪造);后端全量 mvn 因本沙箱无 mvn 复用基线。
+
+---
+
+## 五、执行范围与实测结果
+
+| 维度 | 命令/来源 | 用例总数 | 通过 | 失败 | 备注 |
+|------|-----------|----------|------|------|------|
+| cfc-web Jest | `CI=true npm test` | 90 | 90 | 0 | 12 套件全绿(26.7s,mock API) |
+| cfc-frontend Jest | `CI=true npm test` | 313 | 313 | 0 | 16 套件全绿(23.4s,逻辑镜像) |
+| E2E /admin | Playwright `admin-desktop` | 5 | 5 | 0 | TC-A-U01~U05 全绿,B-46 关闭 |
+| E2E /frontend | Playwright `frontend-mobile` | 6 | 6 | 0 | TC-F-U01~U06 全绿 |
+| E2E shop-api | Playwright `shop-api` | 4 | 4 | 0 | TC-S-U01~U04 全绿(需求变更 S1) |
+| **E2E 合计** | | **15** | **15** | **0** | 2.5m,无数据写入 |
+| cfc-backend | mvn(本沙箱无 PATH/无 wrapper) | — | — | — | **复用 16:46 权威基线 288 类/2389 例/95.02%**(surefire 口径) |
+| 健康契约 E2E(新增) | `playwright.config.health.js` | 10 | 0 | 10 | 实测 404(curl)/502(Playwright),模块未上线(见 R-new-1) |
+
+**覆盖率**:后端 95.02%(surefire 口径,**非 JaCoCo 真值**,待联网引 JaCoCo);前端 Jest 无覆盖率采集(逻辑镜像)。
+
+**回归对比(vs 14:55 轮)**:
+- Jest 双绿连绿(90/90、313/313),无新增失败。
+- E2E /admin 由 3/5(P0)→ **5/5**,B-46 已关闭,**无新增回归**。
+- 后端:自 16:46 基线零新增回归;但新增健康模块(36 文件/+3360 行)**未纳入任何测试**,为新增风险。
+
+---
+
+## 六、测试用例编写产出(SRS 闸门触发)
+
+**闸门判定**:自 14:55 以来,SRS/需求文档有变更 →
+- `docs/superpowers/api/API_REFERENCE.md`(+42 行,新增 §4.43 华为健康、§4.44 小米健康,各 5 端点)
+- `docs/superpowers/specs/2026-11-07-referral-team-profit-sharing.md`(团队分润设计 v0.5)
+
+**本次落库用例(仅测试目录,未提交未推送)**:
+
+| 新增文件 | 用例 | 对应需求/接口编号 | 状态 |
+|----------|------|------------------|------|
+| `tests/e2e-live/health-contract.spec.js` | TC-H-U01~U10(10 条鉴权契约) | API_REFERENCE §4.43 / §4.44;设计文档 D1-D5、X1-X5 | 已落地,**执行 0/10**(目标未上线,待部署后复跑) |
+| `tests/playwright.config.health.js` | 隔离运行配置 | — | 配套,不干扰现有 15/15 套件 |
+
+**未落库(设计替代,零抖动)**:
+- **referral-team-profit-sharing v0.5**:纯设计文档,后端未见对应实现(仅有历史 referral 代码),**断言无锚点 → 出测试设计,0 落库**。待实现后补契约测试。
+- **后端 @Test 版健康契约**:本沙箱无 mvn,写入存在 B-26/B-47 式编译阻断风险;且接口真实路径为 mock 默认、需成员 JWT,E2E 缺可用凭据无法断言真实行为 → 按本项目既有规范(多轮"闸门触发→出测试设计,0落库")**仅出设计,不落库**。
+
+> 设计(待 mvn 可用或模块上线后转用例):`HuaweiHealthControllerTest`/`XiaomiHealthControllerTest`(MockMvc/@WebMvcTest),覆盖 auth-url/callback/sync/revoke/status 五端点,mock `HealthSyncServiceImpl`,断言 mock 通道默认返回 + JWT 拦截(无 token → 401)。
+
+---
+
+## 七、新增风险 / 覆盖缺口清单
+
+| ID | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|----|----------|------|------|--------------|--------|----------|
+| R-new-1 | 功能覆盖缺口(新增生产代码) | 华为/小米健康模块 36 文件/+3360 行,**0 专用测试**;E2E 契约实测 404/502(模块未在 192.168.16.251 上线) | 新接口无回归保护;上线后可能带缺陷暴露 | 后端 MockMvc 契约 10 端点 + E2E 鉴权契约(已落 health-contract.spec.js) | P1 | 模块部署后复跑 E2E 应得 401/403 全绿;后端 mvn 可用补 @Test 全绿 |
+| R-2 | 工具缺口 | JaCoCo 离线缺失,覆盖率仅 surefire 口径 | 门禁"覆盖率≥80%"无真值依据 | 联网下载 jacoco-maven-plugin 接入 pom | P1 | 联网授权后 mvn verify 出 JaCoCo 报告,行/分支≥80% |
+| R-3 | 环境缺口 | 本沙箱 PATH 无 mvn、无 mvnw | 后端无法独立复跑,只能复用兄弟环境基线 | 在 cfc-backend 提供 mvnw 或把 mvn 加入执行环境 PATH | P1 | 提供后本环境 `mvn -o test` 可独立复跑,对比基线无新增失败 |
+| R-4 | 历史 P1 未处置 | `schema.sql` growth_records 重复列(~775 次 "Duplicate column name") | DDL 噪声、迁移异常风险 | 删重复列定义 | P2 | 改后迁移日志无 Duplicate 即闭环 |
+| R-5 | 历史红类 | 37 红类(3 B-13 环境硬编码 + 34 契约漂移,含 S-cfc-31 blank-key 真实缺陷) | 门禁 0 失败 0 错误不达标 | B-13 配置化 DB 地址;漂移逐条核对;S-cfc-31 修服务端校验 | P1 | 红类归零,BUILD SUCCESS |
+
+---
+
+## 八、五要素问题清单
+
+### 问题 1(P1)— 华为/小米运动健康模块零测试覆盖
+① **问题描述**:d21a887cc→9d1fcbec4 新增 `HuaweiHealthController`/`XiaomiHealthController` 等 36 文件/+3360 行生产代码,无对应测试文件;E2E 契约实测未上线(404/502)。
+② **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/controller/huawei/HuaweiHealthController.java`、`.../xiaomi/XiaomiHealthController.java`;`schema.sql:7069/7083`。
+③ **最优修改方案**:新增 `HuaweiHealthControllerTest`/`XiaomiHealthControllerTest`(MockMvc/@WebMvcTest),覆盖 5 端点,mock `HealthSyncServiceImpl`,断言 mock 通道默认返回 + JWT 拦截;E2E 鉴权契约已落 `health-contract.spec.js`。
+④ **修改目的**:闭环新增生产代码的契约覆盖,防回归(质量目标:核心接口须有契约测试)。
+⑤ **问题闭环**:mvn 可用后跑通=10 端点全绿;E2E 模块部署后复跑应得 401/403 全绿。通过标准:全绿且覆盖率达阈值。
+
+### 问题 2(P1)— 覆盖率工具 JaCoCo 离线缺失
+① **问题描述**:pom.xml 仅 spring-boot/compiler/surefire 三插件,无 jacoco;`~/.m2` 无 jacoco;当前 95.02% 为 surefire 口径非 JaCoCo 真值。
+② **测试 bug 点**:`cfc-backend/pom.xml` build/plugins。
+③ **最优修改方案**:联网下载 jacoco-maven-plugin 并接入 pom(或命令行 -javaagent),产出报告。
+④ **修改目的**:满足门禁"覆盖率≥80%"需 JaCoCo 真值。
+⑤ **问题闭环**:联网授权后 `mvn verify` 出 jacoco 报告,行/分支覆盖率均≥80% 方达标。
+
+### 问题 3(P1)— 后端无法在本闭环沙箱独立复跑
+① **问题描述**:自动化沙箱 PATH 无 mvn、无 mvnw,无法 `mvn test`;只能复用测试负责人 16:46 轮基线(2389/95.02%)。
+② **测试 bug 点**:环境层(非代码缺陷)。
+③ **最优修改方案**:在 cfc-backend 提供 `mvnw` wrapper,或将执行环境 mvn 加入 PATH。
+④ **修改目的**:使每小时闭环可独立复跑后端全量,避免基线陈旧。
+⑤ **问题闭环**:提供后本环境可跑 `mvn -o test`,对比基线无新增失败即闭环。
+
+### 问题 4(P2)— growth_records 表 schema 重复列
+① **问题描述**:`schema.sql` growth_records CREATE TABLE 重复 `family_member_id`/`family_member_age` 列,全量日志 ~775 次 "Duplicate column name"。
+② **测试 bug 点**:`cfc-backend/src/main/resources/schema.sql`(growth_records 段,~529+ 行)。
+③ **最优修改方案**:删重复列定义;`DatabaseInitializer` 幂等迁移确认已含该列则不重复建。
+④ **修改目的**:消除冗余 DDL、降低迁移噪声、避免未来迁移异常。
+⑤ **问题闭环**:改后跑 `DatabaseInitializer` 迁移,日志无 "Duplicate column name" 即闭环。
+
+### 问题 5(P1)— 37 红类未清零(含 1 真实缺陷 S-cfc-31)
+① **问题描述**:后端基线仍有 37 红类;S-cfc-31 blank-key 已确认是真实校验缺陷(期望 500 得 200)。
+② **测试 bug 点**:`SleepConfigTagsMechanismContractTest.publicValue_blankKey_returnsError`(99 行)等 34 类契约漂移 + 3 类 B-13 环境硬编码 `127.0.0.1:3306`。
+③ **最优修改方案**:B-13 改为配置化 DB 地址;34 类漂移逐一核对实现与文档;S-cfc-31 修复服务端 blank-key 校验。
+④ **修改目的**:门禁要求 0 失败 0 错误。
+⑤ **问题闭环**:红类归零,全量 BUILD SUCCESS 且无失败/错误。
+
+### 问题 6(设计,未落库)— 团队分润设计 v0.5 无测试锚点
+① **问题描述**:`2026-11-07-referral-team-profit-sharing.md` v0.5 为设计文档,后端未见对应新实现。
+② **测试 bug 点**:需求/接口信息不足(无实现锚点)。
+③ **最优修改方案**:实现落地后补契约测试(分润计算/星级门槛/奖池切分)。
+④ **修改目的**:防分润逻辑回归。
+⑤ **问题闭环**:实现 + 测试全绿;当前标"待核实",不臆造断言。
+
+---
+
+## 九、待核实项
+
+- 后端覆盖率 JaCoCo 真值(当前 95.02% 仅 surefire 口径)。
+- 16:46 基线 2389 例是否已包含健康模块编译(无法本环境复跑确认)。
+- `/admin` 登录态凭据:本次 admin E2E 5/5 由 16:46 轮脚本修复达成,本环境未注入 CFC_ADMIN_TOKEN,依赖其修复;若部署态变化需重新验证。
+- 健康模块目标部署时间(决定 R-new-1 复跑窗口)。
+- growth_records 重复列是否已随某迁移处置(历史 P1 未闭环)。
+
+---
+
+## 十、需用户单独授权才能继续的项(未授权未执行 → 测试设计)
+
+| 项 | 原因 | 测试设计 |
+|----|------|----------|
+| 依赖漏洞扫描(OWASP DC / npm audit) | 需访问外部公网 | 在隔离环境跑 `mvn org.owasp:dependency-check-maven:check` + `npm audit`,产出 CVE 清单 |
+| 性能压测(JMeter / k6) | 需联网打目标/远端 | 对 /api 关键链路做基线压测,定吞吐/RT/错误率阈值 |
+| DAST(ZAP) | 需联网 | 对 cfc.iwintrue.com 做被动+主动扫描,产出注入/XSS 清单 |
+| JaCoCo 下载与接入 | 需联网 | 联网后改 pom 接入 jacoco-maven-plugin,出真值覆盖率 |
+| 后端全量 mvn 复跑 | 需 mvn(本沙箱无) | 提供 mvnw/PATH 后 `mvn -o -DskipTests=false test` 固化新基线 |
+| B-34/B-35 LangGraph 复验 | 需 AI 服务 9000(超内网授权) | 授权后调 9000 复验问卷降级/DAN 解析 |
+
+---
+
+## 十一、门禁结论
+
+**⛔ 不通过(有条件)**
+
+**正向进展**:Jest 双绿连绿(90+313)、E2E 15/15(含 `/admin` 5/5,B-46 关闭)、无新增回归、新增健康契约 E2E 已落地并暴露部署缺口。
+
+**未达标项(复评条件)**:
+1. 华为/小米健康模块补齐契约测试(后端 @Test 10 端点 + E2E 部署后复跑全绿)— R-new-1;
+2. 提供 mvnw / 授权 mvn PATH,本环境可独立复跑后端全量,对比基线无新增失败 — R-3;
+3. 联网引 JaCoCo 出真值覆盖率 ≥80% — R-2;
+4. 37 红类(3 B-13 + 34 漂移含 S-cfc-31)归零(0 失败 0 错误)— R-5;
+5. 处置 growth_records 重复列 — R-4;
+6. 授权安全压测/依赖漏洞扫描后补非功能维度。
+
+满足 1–5 可复评为「有条件通过」;叠加 6 与 JaCoCo 达标可「通过」。
+
+---
+*产物路径:d:/cfc/docs/tdd/test/automation-run-2026-11-07-1747.md(未提交未推送)|新增测试文件:tests/e2e-live/health-contract.spec.js、tests/playwright.config.health.js(未提交未推送)*

+ 160 - 0
docs/tdd/test/automation-run-2026-11-07-1830.md

@@ -0,0 +1,160 @@
+# 测试闭环报告 · 2026-11-07 18:30 (GMT+8) · 第 70 轮
+
+> 主理人:陆谨(软件测试专家团 / 测试架构师)|执行档:**review 档(已授权内网 + 测试用例编写)**
+> 对象:d:/cfc(浠艾福 XAF)|内网 cfc.iwintrue.com → 192.168.16.251(hosts 解析,已授权,不联网)
+> 本产物**待提交推送**(测试结果有变化:health 契约由 0/10 → 5/10,暴露 B-50 新缺陷)
+
+---
+
+## 一、历史审查记录(跨会话召回)
+
+- 最近一次 17:47 轮(HEAD=d21a887cc 时代结论),结论为 ⛔**不通过(有条件)**,主要缺口:① 健康模块零测试覆盖且未上线(E2E 0/10);② JaCoCo 缺失;③ 37 红类;④ growth_records 重复列;⑤ 后端沙箱无 mvn 无法独立复跑。
+- 17:47 后远端推进(本轮基线=636c42103):**B-47 已修复并入主干并部署**(华为健康 JDK8 编译阻断,18:06 fix 提交 `636c42103`),研发侧状态机口径 22 键 = 14 DONE + 8 GREEN + 0 RED/YELLOW。
+- **本次核心变化**:健康模块由「404 未上线」→「已上线」,health 契约从 0/10 变为 **5/10**——华为 5 端点暴露真实鉴权缺口(**B-50 新登记**)。
+
+---
+
+## 二、项目画像(速览)
+
+| 模块 | 技术栈 | 端口 | 本周期可测范围 / 关键路径 |
+|------|--------|------|---------------------------|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | B-47 修复后健康模块可编译;华为/小米健康 10 端点已上线 |
+| cfc-web | Vue 2 + Element UI 管理端 | 8082 | Jest 组件/逻辑测试(mock API) |
+| cfc-frontend | uni-app 微信小程序 (Vue 2) | — | Jest 逻辑测试(无 vue-jest,SFC 不可单测) |
+| cfc-langgraph | Python FastAPI + LangGraph | 9000 | pytest 本机 venv 兜底(251 派发通道不可达,承袭 B-42) |
+| 部署实例 | cfc.iwintrue.com → 192.168.16.251 | 80/443 | 内网 E2E 目标(/admin、/frontend、/api) |
+
+**质量目标(沿用)**:核心接口须有契约测试;门禁 0 失败 0 错误;覆盖率(JaCoCo 真值)≥80%。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
+
+| # | 类型 | 状态 | 证据 |
+|---|------|------|------|
+| 1 | 单元测试(后端 JUnit) | 待核实 | 本轮沙箱无 mvn,复用 16:46 基线 288 类/2389 例/95.02%;B-47 修复后待补跑 |
+| 2 | 组件测试(前端) | 已发现 | cfc-web 12 套件/90 例、cfc-frontend 16 套件/313 例 全绿(本轮实测) |
+| 3 | 测试覆盖率 | 待核实 | JaCoCo 离线缺失,仅 surefire 口径 95.02%(承袭 R-2) |
+| 4 | 变异测试 | 未发现 | 未配置 pitest,未执行 |
+| 5 | 快照测试 | 未发现 | 无 |
+| 6 | 冒烟测试 | 已发现 | E2E 探活 /frontend+/admin;admin 登录 5/5(B-46 已闭环) |
+| 7 | 回归测试 | 已发现 | Jest 双绿 + 浏览器 15/15 维持 + health 契约首次带发现 |
+| 8 | 探索性测试 | 未发现 | 无专职脚本 |
+| 9 | 集成测试(后端) | 已发现 | 后端集成/契约基线(复用) |
+| 10 | 性能测试 | 未发现 | 需联网压测,未授权未执行 |
+| 11 | 可靠性测试 | 待核实 | 无专职套件 |
+| 12 | 安全测试(SAST/DAST) | 未发现 | 需联网,未授权未执行;**本轮借 E2E 契约发现华为鉴权缺口(B-50)** |
+| 13 | 兼容性测试 | 已发现 | 桌面 /admin + 移动 /frontend 双视口 E2E |
+| 14 | 可用性测试 | 未发现 | 无 |
+| 15 | 无障碍测试 | 未发现 | 无 |
+| 16 | QA 流程 | 已发现 | automation-status + 每小时闭环 |
+| 17 | 质量指标 | 已发现 | 覆盖率台账/自动化状态 |
+| 18 | 全项目代码审查 | 待核实 | 聚焦测试闭环 |
+| 19 | 契约测试 | 已发现 | 后端契约 JUnit + health 契约 E2E 10 条(5/10) |
+| 20 | 接口 API 测试 | 已发现 | shop-sort-api E2E + health 契约 E2E |
+
+---
+
+## 四、测试方案与执行档(预授权)
+
+- **执行档**:review(已授权内网 + 测试用例编写);联网命令一律不执行。
+- **范围**:浏览器自动化(admin/frontend/shop-api)+ health 契约 + Jest 全量 + langgraph pytest(本机兜底)+ 节点派发验证。
+- **节点拓扑(本轮实测)**:189:4090 opencode API 可达、会话可建但 prompt 无 agent 输出(0 tokens,指标未产出);204:4091 与本地 4091 共享同一 opencode 实例(会话 ID 全同,非独立节点);251:9000/4090/4091 不可达(8080 为 Gitea)→ **浏览器自动化由本机单节点直跑完成(既统一口径),langgraph 由本机 venv 兜底**。
+
+---
+
+## 五、执行范围与实测结果
+
+| 维度 | 命令/来源 | 用例总数 | 通过 | 失败 | 备注 |
+|------|-----------|----------|------|------|------|
+| 浏览器 admin-desktop | `npx playwright test -c playwright.config.live.js --project=admin-desktop` | 5 | 5 | 0 | TC-A-U01~U05 全绿(含真实登录,B-46 持续闭环) |
+| 浏览器 frontend-mobile | 同配置 `--project=frontend-mobile` | 6 | 6 | 0 | TC-F-U01~U06 全绿(游客浏览 6 场景) |
+| 浏览器 shop-api | 同配置 `--project=shop-api` | 4 | 4 | 0 | TC-S-U01~U04 全绿(价格排序契约) |
+| **浏览器合计** | 本机单节点串行(1802 轮直跑) | **15** | **15** | **0** | ~3.5m |
+| **health 契约** | `npx playwright test -c playwright.config.health.js` | **10** | **5** | **5** | **TC-H-U01~U05 华为失败(200 直通,B-50)**;TC-H-U06~U10 小米 401 正确 |
+| cfc-frontend Jest | `CI=true jest` | 313 | 313 | 0 | 16 套件全绿(19.2s) |
+| cfc-web Jest | `CI=true jest` | 90 | 90 | 0 | 12 套件全绿(23.4s) |
+| cfc-langgraph pytest | `.venv/Scripts/python.exe -m pytest tests --ignore=tests/qna` | 63 | 51 | 0 | 51 passed / 12 skipped,EXIT 0(本机 venv 兜底;251 派发通道不可达承袭 B-42) |
+| cfc-backend | mvn | — | — | — | 沙箱无 mvn,复用 16:46 基线 288 类/2389 例/95.02%(B-47 修复后待复跑,登记 R-3) |
+
+**浏览器自动化直接访问**:`http://cfc.iwintrue.com/admin`(后台,302→登录)与 `http://cfc.iwintrue.com/frontend`(小程序 H5)均在 `/api` 后端存活状态下实测,只读无数据写入。
+
+**回归对比(vs 17:47 轮)**:
+- Jest 双绿维持(90/90 + 313/313),浏览器 15/15 维持,**无新增回归**。
+- health 契约 **0/10 → 5/10**:模块上线(404 消除),小米 401 达标;**华为 5 端点暴露真实鉴权缺口(B-50)**——这是本轮唯一实质变化,且是正向暴露(可修复)。
+
+---
+
+## 六、SRS / 场景变更检查与测试用例更新
+
+**闸门判定(自 17:47 轮)**:
+- `docs/superpowers/api/API_REFERENCE.md`:无新增变更(§4.43/§4.44 已于 14:14 落库并随 17:47 轮建 health-contract.spec.js;本轮其由"待部署设计"转为"实测用例")。
+- `docs/superpowers/specs/2026-11-07-referral-team-profit-sharing.md`:v0.4/v0.5 纯设计演进,后端无实现锚点 → **出测试设计、0 落库**(承袭 17:47 轮处理口径)。
+- B-47 fix(`636c42103`):实现修复非需求变更;触发 health-contract 由设计态转实测态。
+- **本轮无新增测试用例落库**:health 契约 10 条已于前轮落地;B-50 为缺陷发现不需新建用例(契约已覆盖),仅登记台账。**后续若需求/场景变更将按闸门流程补充用例。**
+
+---
+
+## 七、新增风险 / 覆盖缺口清单
+
+| ID | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|----|----------|------|------|--------------|--------|----------|
+| B-50(新) | 安全鉴权缺口 | 华为健康 5 端点未鉴权 200 直通(`LOGIN_REQUIRED_PATHS` 缺 `/api/huawei-health/`,小米在列) | 私有健康数据端点可匿名访问(业务 400 但 HTTP 200,契约漂移,与小米不对称) | `JwtInterceptor` 清单 +health-contract 已覆盖(华为 5 端点 401/403 断言) | P0 | 研发补 `/api/huawei-health/` 入清单 → 复跑 health 契约 10/10 |
+| R-new-1(收窄) | 新增代码覆盖 | 健康模块已上线,E2E 契约 5/10;后端 @Test 版契约测试仍未建(无 mvn) | 上线无回归保护 | 后端 mvn 可用后补 MockMvc 契约 | P1 | 授权 mvn 后补 @Test 全绿 |
+| R-2(承袭) | 工具缺口 | JaCoCo 离线缺失 | 覆盖率无真值 | 联网引 jacoco | P1 | 授权后 verify ≥80% |
+| R-3(承袭) | 环境缺口 | 沙箱无 mvn | 后端不能独立复跑 | mvnw 或 PATH | P1 | 提供后对比基线 |
+| R-4(承袭) | 历史 P1 | growth_records 重复列 | DDL 噪声 | 删重复列 | P2 | 迁移无 Duplicate |
+| R-5(承袭) | 历史红类 | 37 红类(B-13 + 契约漂移 + S-cfc-31) | 门禁不达标 | 逐条处置 | P1 | 红类归零 |
+
+---
+
+## 八、五要素问题清单(本轮新增 1 项,其余承袭)
+
+### 问题 1(P0)— 华为健康 5 端点未鉴权 200 直通(B-50)
+① **问题描述**:B-47 修复并部署后,`/api/huawei-health/auth-url|callback|sync|revoke|status` 未携带 Authorization 时返回 **HTTP 200**(业务坏请求),而 SDK 契约与兄弟模块小米(5 端点 401 正确)要求 401/403。
+② **测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java`(`LOGIN_REQUIRED_PATHS` 缺 `/api/huawei-health/`,小米 `/api/xiaomi-health/` 在列);实测证据 `tests/e2e-live/health-contract.spec.js`(TC-H-U01~U05)。
+③ **最优修改方案**:`LOGIN_REQUIRED_PATHS` 数组追加 `"/api/huawei-health/"` 一条(与 `/api/xiaomi-health/` 对齐);确认 `WebConfig.excludePathPatterns` 无对应豁免。
+④ **修改目的**:私有健康授权/同步/撤销 endpoints 强制登录,杜绝匿名直通(对齐 SEC-20261031-01 / SC-G-06 鉴权统一口径),防越权。
+⑤ **问题闭环**:研发修复推送后,复跑 `npx playwright test -c playwright.config.health.js` → 10/10 全绿(华为 5 端点均为 401/403)即闭环;通过标准:health 套件 0 失败。
+
+### 问题 2~6(承袭 17:47 轮)
+R-2 JaCoCo 真值、R-3 沙箱无 mvn、R-4 growth_records 重复列、R-5 37 红类、分润设计无锚点——内容同 17:47 轮第五/八节,不再重复展开(详见 automation-run-2026-11-07-1747.md)。
+
+---
+
+## 九、待核实项
+
+- 后端 2389 例在 B-47 修复后的基线(本沙箱无 mvn)。
+- 189 节点 opencode prompt 无 agent 输出(建会话成功但 tokens=0),判定通道建连正常、执行不产出,浏览器自动化以本机直跑为准。
+- 204 节点与本地 4091 实例关系(会话列表全同,非独立节点),待运维确认网络拓扑。
+- B-50 修复的提交与部署时间。
+
+---
+
+## 十、需授权才能继续的项(未授权未执行 → 测试设计)
+
+与 17:47 轮一致:依赖漏洞扫描 / 性能压测 / DAST / JaCoCo 下载接入 / 后端全量 mvn 复跑 / LangGraph 9000 复核(超内网授权),均标注未实测。
+
+---
+
+## 十一、门禁结论
+
+**⛔ 不通过(有条件)**
+
+**正向进展**:
+- 健康模块上线闭环:404 → 可访问,且 **health 契约首次产出真信号(5/10)**,直接暴露华为鉴权缺口(B-50)——本轮最有价值发现,证明契约测试落地有效。
+- 浏览器自动化 15/15 维持全绿(含 /admin 真实登录)、Jest 双绿、langgraph 51 绿、无新增回归。
+- 研发 B-47(JDK8 编译阻断)当日修复并入主干,构建阻断解除。
+
+**未达标项(复评条件)**:
+1. **B-50(P0):华为健康 5 端点补鉴权 → health 契约 10/10**(本轮新暴露,最高优先);
+2. 提供 mvnw / 授权 mvn PATH,复跑后端 2389 例基线(R-3);B-47 修复后首次全量;
+3. 联网引 JaCoCo 出真值覆盖率 ≥80%(R-2);
+4. 37 红类归零(0 失败 0 错误)(R-5);
+5. 处置 growth_records 重复列(R-4);
+6. 授权安全/压测/依赖漏洞维度(可选)。
+
+满足 1–5 可复评「有条件通过」;叠加 6 + JaCoCo 达标可「通过」。
+
+---
+*产物:d:/cfc/docs/tdd/test/automation-run-2026-11-07-1830.md|新增台账:blockers.md +B-50(待推送)*

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
docs/tdd/test/blockers.md


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

@@ -7,11 +7,11 @@
 
 | 指标 | 数值 |
 | --- | --- |
-| 控制器总数 | 359 |
-| handler 方法总数 | 1943 |
-| handler 方法已覆盖 | 432 (22.2%) |
+| 控制器总数 | 361 |
+| handler 方法总数 | 1953 |
+| handler 方法已覆盖 | 434 (22.2%) |
 | 单元-全覆盖(handler 方法) | 32 |
-| 单元-部分覆盖(handler 方法) | 196 |
+| 单元-部分覆盖(handler 方法) | 198 |
 | 单元-未覆盖(handler 方法) | 130 |
 | 单元-无handler 方法 | 1 |
 | 测试文件数 | 290 |
@@ -90,7 +90,7 @@
 
 > 这些控制器**已有测试但只覆盖了部分handler 方法**——即用户要求的「已经做了一部分测试的情况,要能够找到」。
 
-共 196 个:
+共 198 个:
 
 - `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
@@ -187,6 +187,7 @@
 - `HealthDimensionController`:覆盖 4/5,未覆盖方法:radarData
 - `HealthGrowthRecordController`:覆盖 1/5,未覆盖方法:detail、create、update、delete
 - `HealthMealController`:覆盖 2/5,未覆盖方法:daily、weekly、alerts
+- `HuaweiHealthController`:覆盖 1/5,未覆盖方法:authUrl、callback、sync、revoke
 - `InviteController`:覆盖 3/5,未覆盖方法:bind、getQrCode
 - `MbtiController`:覆盖 2/5,未覆盖方法:submit、profile、history
 - `MiniGameController`:覆盖 1/5,未覆盖方法:getGameByCode、getAllGames、updateStatus、completeGame
@@ -199,6 +200,7 @@
 - `SurveyController`:覆盖 1/5,未覆盖方法:activeTemplates、confirmQuestions、submit、history
 - `TeacherFamilyBindingController`:覆盖 1/5,未覆盖方法:approve、reject、myRequests、cancel
 - `TeacherMessageController`:覆盖 1/5,未覆盖方法:sendMessage、replyMessage、getUnreadCount、getMyMessages
+- `XiaomiHealthController`:覆盖 1/5,未覆盖方法:authUrl、callback、sync、revoke
 - `AdminActivityCheckinController`:覆盖 1/4,未覆盖方法:export、add、review
 - `AdminAfterSalesController`:覆盖 1/4,未覆盖方法:detail、review、complete
 - `AdminCfEarnRuleController`:覆盖 1/4,未覆盖方法:save、toggle、history

+ 54 - 0
tests/e2e-live/health-contract.spec.js

@@ -0,0 +1,54 @@
+/**
+ * ================================================================
+ * 华为 / 小米运动健康接入 · 接口级鉴权契约 E2E · TC-H-U01 ~ TC-H-U10
+ * ================================================================
+ * 需求来源:docs/superpowers/api/API_REFERENCE.md
+ *   §4.43 华为运动健康接入(HuaweiHealthController  /api/huawei-health)
+ *   §4.44 小米运动健康云服务接口接入(XiaomiHealthController /api/xiaomi-health)
+ *   设计文档:docs/2026-11-06-华为运动健康开放平台接入方案.md(D1-D5 / X1-X5)
+ *
+ * 契约要点(来自 API_REFERENCE):
+ *   - 全部 @PostMapping,需 JWT(JwtInterceptor 拦截 /api/**,仅 8 个公开路径除外)。
+ *   - memberId 为空时取当前登录成员;令牌仅后端持有,不落小程序。
+ *
+ * 本契约验证「未携带 Authorization 时,10 个端点应被拒绝(401/403),不可 200 直通」。
+ * 只读:仅发送空 body 探测鉴权门禁,不写任何业务数据;凭据缺失属预期(验证拦截),
+ *      禁止在日志/报告中打印明文口令或令牌。
+ *
+ * 运行(隔离配置,避免干扰现有 15/15 套件):
+ *   npx playwright test -c playwright.config.health.js
+ */
+const { test, expect } = require('@playwright/test');
+
+const API = process.env.LIVE_API_BASE || 'http://cfc.iwintrue.com';
+
+// [用例编号, 品牌, 动作]
+const ENDPOINTS = [
+  ['TC-H-U01', 'huawei', 'auth-url'],
+  ['TC-H-U02', 'huawei', 'callback'],
+  ['TC-H-U03', 'huawei', 'sync'],
+  ['TC-H-U04', 'huawei', 'revoke'],
+  ['TC-H-U05', 'huawei', 'status'],
+  ['TC-H-U06', 'xiaomi', 'auth-url'],
+  ['TC-H-U07', 'xiaomi', 'callback'],
+  ['TC-H-U08', 'xiaomi', 'sync'],
+  ['TC-H-U09', 'xiaomi', 'revoke'],
+  ['TC-H-U10', 'xiaomi', 'status'],
+];
+
+test.describe('华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44)', () => {
+  for (const [tc, brand, action] of ENDPOINTS) {
+    test(`${tc} POST /api/${brand}-health/${action} 未鉴权应被拒绝(401/403)`, async ({ request }) => {
+      const resp = await request.post(`${API}/api/${brand}-health/${action}`, {
+        data: {},
+        timeout: 20000,
+      });
+      const status = resp.status();
+      // 仅打印状态码,绝不打印响应体(可能含敏感字段)或任何凭据
+      console.log(`[${tc}] POST /api/${brand}-health/${action} -> HTTP ${status}`);
+      // 契约:需 JWT;未鉴权必须被拦截,绝不 200 直通。
+      // 当前若返回 404 = 该模块尚未在目标部署实例上线(已实测),属部署缺口,非断言错误。
+      expect([401, 403], `未鉴权应被拒绝(401/403),实际 ${status}`).toContain(status);
+    });
+  }
+});

+ 30 - 0
tests/playwright.config.health.js

@@ -0,0 +1,30 @@
+/**
+ * 隔离配置:仅运行健康模块鉴权契约 E2E(tests/e2e-live/health-contract.spec.js)
+ * 不接入 globalSetup(不重置任何数据库),只读探测鉴权门禁。
+ */
+var path = require('path');
+
+var LIVE_BASE = process.env.LIVE_BASE_URL || 'http://cfc.iwintrue.com';
+
+module.exports = {
+  testDir: path.join(__dirname, 'e2e-live'),
+  timeout: 60000,
+  expect: { timeout: 15000 },
+  retries: 0,
+  workers: 1,
+  fullyParallel: false,
+  outputDir: path.join(__dirname, '.live-artifacts', 'health'),
+  reporter: [['list']],
+  use: {
+    baseURL: LIVE_BASE,
+    headless: true,
+    ignoreHTTPSErrors: true,
+  },
+  projects: [
+    {
+      name: 'health-api',
+      testMatch: /health-contract\.spec\.js$/,
+      use: { browserName: 'chromium' },
+    },
+  ],
+};

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно