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

test(测试负责人·20:10轮): 浏览器双端全绿(admin5/5+front6/6+shop4/4) | B-51/B-52关闭(根目录跑Playwright双版本冲突误判为Chromium缺失) | B-50第2次复现(华为5端点未鉴权200) | 后端288类2389例95.02%零漂移 | 新B-53(70项WIP含11测试文件修复,提交即96.78%)/B-54(langgraph chromadb DLL)/B-55(189+251不可达) | 通知研发

E2E Test Bot 5 өдөр өмнө
parent
commit
5711558871

+ 278 - 0
docs/tdd/test/automation-run-2026-11-07-2010.md

@@ -0,0 +1,278 @@
+# CFC 闭环自动化测试执行报告 · 2026-11-07 20:10(第 73 轮)
+
+> 执行角色:测试负责人(软件测试专家团 · 主理人编排)
+> 执行档位:**review(离线白名单)** — 不联网安装依赖、不启停服务、不改被审生产代码
+> 基线:`cfclub` @ `5073a5013`(= `origin/cfclub`,跑前跑后 SHA 未变;主工作区 70 项 WIP 只读,零侵入)
+> 隔离执行树:`D:\_wt_r2110`(`git worktree` @ HEAD,node_modules 以 junction 复用主仓)
+
+---
+
+## 一、执行摘要(本轮最重要 5 件事)
+
+| # | 结论 | 证据 |
+|---|------|------|
+| 1 | **浏览器自动化全部实测通过**:管理端 5/5、小程序 H5 6/6、商城排序契约 4/4 | `_r2110_admin_live.log` / `_r2110_frontend_live.log` / `_r2110_shopapi.log` |
+| 2 | **B-51 关闭(上轮定性有误)**:本机 Chromium **完全可用**,上轮「二进制缺失」实为在仓库根目录跑 Playwright 触发双版本冲突(与 B-52 同根因) | `cd tests && npx playwright test -c playwright.config.live.js` 直接跑通 5/5 + 6/6 |
+| 3 | **B-52 关闭**:health 契约在 `tests/` 目录内运行正常,不再报 `test.describe() called here` | `_r2110_health.log` → 5 passed / 5 failed(失败全部是 B-50 本体) |
+| 4 | **B-50 复现但重新定性为「部署滞后」**:线上华为 5 端点未鉴权仍 **200**、小米仍 401(契约 5/10);但源码 `origin/cfclub` `JwtInterceptor.java:116` **已含** `/api/huawei-health/`(`cc7b3e00b` 已修、`WebConfig` 无豁免)→ **不是研发没修,是目标实例没部署新构建** | 同上 + 源码复核 |
+| 5 | **B-53(P0 流程)**:研发 70 项 WIP 内含 **11 个后端测试文件修复**,实测带入后 170 例红 48→6,后端预测 **95.02% → 96.78%(越 G1 阈值)**,卡点只是「未提交」 | `_r2110_wip_targeted.log`(170 例 / F4 / E2) |
+
+---
+
+## 二、测试节点分派实测(按本轮新拓扑指令)
+
+| 目标 | 指令要求 | 实测 | 结论 |
+|------|----------|------|------|
+| `192.168.16.189`(浏览器自动化节点) | 承担一个浏览器任务 | TCP 22/80/4090 **全部拒绝**(`curl` 000,6s 超时) | ❌ 不可达 → 回退本机节点 |
+| `192.168.16.251`(langgraph 部署节点) | langgraph 测试全部分派 | `:9000/health` **超时**(000) | ❌ 不可达 → langgraph 本机 `.venv` 兜底 |
+| 本机(浏览器自动化节点) | 每节点仅一个浏览器任务 | admin → frontend → shop-api **严格串行**,`workers=1` | ✅ 遵守「单节点单任务」 |
+| `cfc.iwintrue.com/admin`、`/frontend` | 浏览器自动化目标 | HTTP 200 | ✅ 可达 |
+
+> 分派缺口升级为 **B-55(P1)**:两节点均不可达,"按节点分派"在物理上无法执行,本轮全部回退本机串行,与 B-42 同族。
+
+---
+
+## 三、20 类测试覆盖矩阵(三态,不省略任何一类)
+
+| # | 测试类型 | 状态 | 证据 / 说明 |
+|---|----------|------|-------------|
+| 1 | 单元测试 | 已发现 | 后端 288 类 / 2389 例(`_surefire_r2110_main` 288 份 XML) |
+| 2 | 测试覆盖率 | 未发现 | pom 无 jacoco;覆盖率数字未实测(工具缺失,未联网安装) |
+| 3 | 变异测试 | 未发现 | pom 无 pitest |
+| 4 | 集成测试 | 已发现 | `com.etotem.cfc.integration.*` 多类;`tests/integration/*.spec.js` |
+| 5 | 契约测试 | 已发现 | `*ContractTest` 族 + `tests/e2e-live/*contract*.spec.js`;health 契约本轮实测 5/10 |
+| 6 | 接口 API 测试 | 已发现 | 后端 MockMvc/直调 + 根级 `tests/` 黑盒 23 例 + shop-api 4 例 |
+| 7 | 系统 / 端到端 | 已发现 | `tests/e2e-live/admin-live.spec.js`(5 例)、`frontend-live.spec.js`(6 例)本轮实跑通过 |
+| 8 | 验收 UAT | 待核实 | 无独立 UAT 台账;验收证据目前借用 e2e + 契约(口径待主理人裁决) |
+| 9 | BDD 规格 | 已发现 | `docs/flows/*.md` 35 篇 + `tests/user-scenarios/*.md` 11 篇为场景来源,但**未与 Gherkin 绑定** |
+| 10 | 冒烟测试 | 已发现 | `playwright.config.smoke.js` |
+| 11 | 回归测试 | 已发现 | 本报告即为全量回归;但**无 CI 定时回归**(G6 ❌) |
+| 12 | 探索性测试 | 待核实 | 无 charter/记录留存;B-46 属事实上的探索性定位,但未入台账 |
+| 13 | 性能测试 | 未发现 | 无压测脚本/基线 |
+| 14 | 可靠性测试 | 未发现 | 无故障注入 |
+| 15 | 安全测试(SAST/DAST/依赖漏洞) | 未发现 | 无工具;仅契约级鉴权断言(本轮 health 契约暴露 B-50) |
+| 16 | 兼容性测试 | 待核实 | 仅 chromium 单浏览器;移动端仅 375×812 单视口 |
+| 17 | 可用性测试 | 未发现 | 无真实用户测试 |
+| 18 | 无障碍测试 | 未发现 | 无 axe/aria 断言 |
+| 19 | QA 流程 | 已发现 | `docs/tdd/` 全套台账、blockers、pending |
+| 20 | 质量指标 | 已发现 | 本报告 1~7 节即指标体系;但指标脚本受 `.gitignore:70 *.py` 限制无法入库(B-33 持续) |
+
+**三态小计**:已发现 10 / 待核实 4 / 未发现 6。
+
+---
+
+## 四、执行结果总表(本轮真实数据)
+
+| 套件 | 执行 | 通过 | 失败 | 错误 | 跳过 | 通过率 |
+|------|------|------|------|------|------|--------|
+| cfc-backend(全量 `mvn -o -B clean test`,33:37) | 2389 | 2270 | 65 | 50 | 4 | **95.02%**(剔环境红 95.35%) |
+| cfc-frontend(jest) | 296 | 296 | 0 | 0 | 0 | **100%** |
+| cfc-web(jest) | 90 | 90 | 0 | 0 | 0 | **100%** |
+| 根级 tests(jest 黑盒) | 23 | 11 | 12 | 0 | 0 | 47.83% |
+| cfc-langgraph(pytest) | 51 | 34 | 17 | 0 | 0 | 66.67% |
+| 浏览器 · 管理端 live(admin 5 例) | 5 | 5 | 0 | 0 | 0 | **100%** |
+| 浏览器 · 小程序 H5 live(6 例) | 6 | 6 | 0 | 0 | 0 | **100%** |
+| 接口 · 商城排序契约(4 例) | 4 | 4 | 0 | 0 | 0 | **100%** |
+| 接口 · 健康鉴权契约(10 例) | 10 | 5 | 5 | 0 | 0 | 50% |
+| **合计** | **2874** | **2721** | — | — | — | **94.68%** |
+
+**后端细分**:288 类 / 35 红类 / 115 红例 / 8 例环境红(3 类,硬编码 `127.0.0.1:3306`)
+**完整性**:源码测试类 288 → 报告 288,`silent_missing=0`;XML 耗时总和 1744.5s;`@GetMapping` 8 处(仍违 AGENTS.md「统一 @PostMapping」)
+**恒等式(本轮勘误后精确成立)**:`@Test 2379 + 参数化展开 27 − 早退截断 17 = 2389`,误差 0。
+
+> 恒等式说明(B-27 家族新口径):① `JwtInterceptorLoginRequiredPathTest` 1 个 `@ParameterizedTest` 展开为 **27** 例(+27);② `TeacherLoginTest`(4→1)、`TaskServiceMinigameTest`(5→1)、`DataMigrationServiceTest`(11→1) 三类在首例后即中断,仅上报 1 例(−17)。**只减 @Disabled 的老口径本轮会差 +14**。
+
+---
+
+## 五、与上一轮(16:46)对账:全字段零漂移
+
+| 指标 | 16:46 轮 | 本轮 20:10 | 差 |
+|------|----------|------------|----|
+| 后端类数 | 288 | 288 | 0 |
+| 用例数 | 2389 | 2389 | 0 |
+| 通过 | 2270 | 2270 | 0 |
+| F / E / S | 65 / 50 / 4 | 65 / 50 / 4 | 0 |
+| 通过率 | 95.02% | 95.02% | 0 |
+| 红类 / 红例 | 35 / 115 | 35 / 115 | 0 |
+| 环境红 | 8 | 8 | 0 |
+| 异常类型分布 | 54/26/22/8/4/1 | 54/26/22/8/4/1 | 0 |
+
+> **结论**:B-47(JDK8 编译阻断)已由研发修复并入主干(`URLEncoder.encode(...UTF_8.name())` 实测在位),基线重回可编译 → 本轮拿到与 16:46 **逐字段一致**的结果。这是同码复跑第 9 次零漂移,说明当前 115 例红是**稳定可复现**的夹具/测试缺口,不是抖动。
+
+---
+
+## 六、红例三层归因(115 例)
+
+| 层 | 例数 | 说明 |
+|----|------|------|
+| **A 测试缺陷** | 92 | 夹具未跟进新依赖(NPE 26)、断言基线过时(54)、Mockito 误用(`when(mock)` 而非 `when(mock.method())`,22)、ISOLATED 桩缺失 |
+| **B 疑似生产缺陷** | 12 | `GuideOrder`/`GuideRolePermission` 批量审核口径(期望 3/2 实得 0)、`ProductOrder` 快递字段 |
+| **C 环境/数据** | 8 | 3 类 Spring 上下文 `Failed to load ApplicationContext`(硬编码 `127.0.0.1:3306`) |
+| **待核实** | 3 | `DimensionRegistryMapContractTest` 3 例,契约口径未决(P-2) |
+
+**A 类规模量化**:修完 A 类 92 例 → 后端 2362/2389 = **98.87%**;叠加 C 类环境修复 → 99.20%。
+
+---
+
+## 七、本轮重点:浏览器自动化证据(B-46 后首次「双端全绿」)
+
+| 用例 | 断言要点 | 结果 |
+|------|----------|------|
+| TC-A-U01 | 登录页标题/账号/密码/登录按钮齐备 | ✅ 5.0s |
+| TC-A-U02 | 滑块人机验证存在且可拖动通过(含强断言「验证通过」) | ✅ 8.9s |
+| TC-A-U03 | 未登录访问受保护路由被拦截到登录页 | ✅ 3.7s |
+| TC-A-U04 | 真实登录(滑块 + 凭据)进入后台主框架 | ✅ 10.6s |
+| TC-A-U05 | 核心菜单可访问(用户管理 / 数据看板) | ✅ 58.7s |
+| TC-F-U01~U06 | 首页渲染 / 五维沙盘 / TabBar 四项切换 / 「我的」鉴权引导 / 首屏无 `requestfailed` | ✅ 6/6(47.1s) |
+
+**B-51 根因纠正(重要)**:上轮记「本机 `ms-playwright` 无可用 Chromium」,本轮实测 `~/AppData/Local/ms-playwright` 存在 chromium-1243/1234/1228,`chromium.launch()` 直接成功(`OK title= 浠艾福管理后台`)。上轮失败的真正原因是在**仓库根目录**执行 `npx playwright test`,命中根与 `tests/` 的**双版本 `@playwright/test`**,报错被误读为「浏览器缺失」(与 B-52 同一根因)。**结论:浏览器节点从未缺失,缺的是「在 tests/ 目录内执行」这一执行纪律。**
+
+---
+
+## 八、WIP 预演:研发只差「一次提交」(B-53)
+
+把主工作区 11 个已修改的后端测试文件带入隔离树后定向复跑(不全量、不 clean):
+
+| 类 | 基线 F+E | 带 WIP 后 |
+|----|----------|-----------|
+| ArticleControllerTest | 9 | **0**(11/11 绿) |
+| AuthControllerTest | 4 | **0**(39/39) |
+| FamilyControllerTest | 1 | **0**(8/8) |
+| GuideOrderControllerTest | 8 | **0**(8/8) |
+| GuideTeamControllerTest | 2 | **0**(9/9) |
+| PaymentControllerTest | 4 | **0**(12/12) |
+| ProductControllerTest | 3 | **0**(16/16) |
+| ProductOrderControllerTest | 6 | **0**(20/20) |
+| GuideFamilyTaskControllerTest | 5 | 3 |
+| GuideRolePermissionTest | 5 | 2 |
+| StatsControllerTest | 1 | 1 |
+| **合计** | **48** | **6**(170 例 / F4 / E2) |
+
+剩余 6 例集中在「审核类」用例(`batchReviewTasks_Success` 期望 3 实得 0、`reviewTask_Success` NPE、`batchReview_TeacherAllowed` 期望 2 实得 0),与 B-21 家族同源(`rewardRuleService` 新依赖未注入)。
+
+**预测(若研发提交这 11 个文件)**:后端 2270+42 = **2312 / 2389 = 96.78%**;全量 2763/2874 = **96.14%**;G1 首次全口径达标。
+
+---
+
+## 九、覆盖缺口清单(G-1 ~ G-9)
+
+| ID | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
+|----|----------|------|------|--------------|--------|----------|
+| G-1 | 通过率 | 94.68%(后端 95.02%) | 未达「全部通过」目标 | 先提交 WIP(B-53)→ 修 A 类 92 例 → 修 C 类 8 例 | P0 | 全量 clean 复跑 ≥96% |
+| G-2 | 红例 | 115 + 12 + 17 + 5 = 149 | 掩盖真实缺陷 | 按 §6 三层分批清零 | P0 | 红例逐类归零 |
+| G-3 | 前端 | 296 + 90 全绿 | — | 保持 | — | ✅ 已闭环 |
+| G-4 | 编译 | `mvn clean test` 通过(B-47 已修) | — | 保持 | — | ✅ 已闭环 |
+| G-5 | 资产完整性 | 288/288、沉默 0 | — | 保持 | — | ✅ 已闭环 |
+| G-6 | 浏览器 E2E | admin 5/5 + frontend 6/6 + shop 4/4 | 仅单浏览器/单视口 | 补 firefox/webkit + 多视口 | P2 | 加入每轮回归 |
+| G-7 | langgraph | 34/51(66.67%) | 17 红 | 修 chromadb 运行时 + 更新 test_memory 签名 | P1 | pytest 全绿 |
+| G-8 | 契约 | health 5/10(B-50)、MapContract 3 红 | 鉴权缺口上线 | `LOGIN_REQUIRED_PATHS` 补 `/api/huawei-health/` | **P0(安全)** | 契约 10/10 |
+| G-9 | SRS/场景覆盖 | 241 SC / 15 跑通(6.2%) | 场景覆盖不可量化 | 按 sc-key-map 逐 SC 补三类流证据 | P1 | 跑通数单调上升 |
+
+---
+
+## 十、五要素问题清单(P-1 ~ P-8)
+
+### P-1(P0)研发 70 项 WIP 未提交,42 例可立即转绿
+1. **问题描述**:主工作区 `git status --porcelain` 70 项未提交,其中 11 个 `cfc-backend/src/test/**` 已修好测试缺陷;主干(`origin/cfclub`)仍为红。
+2. **测试 bug 点**:`cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleControllerTest.java:201/215/226`(`when(articleService).recordRead(...)` 应为 `when(articleService.recordRead(...))`)等 11 文件。
+3. **最优修改方案**:研发 `git add` 这 11 个测试文件 + `git commit` + `git push origin cfclub`;剩余 6 例审核类按 P-3 处理。
+4. **修改目的**:把「已修好但未入库」的绿转正,使主干可复现 96.78%。
+5. **闭环**:主干全量 `mvn -o -B clean test` 复跑,后端 ≥96.78%、115 红例降至 ≤73。
+
+### P-2(P0·安全)华为健康 5 端点未鉴权 200 直通
+1. **问题描述**:`TC-H-U01~U05` 未带 token 请求 `auth-url/callback/sync/revoke/status` 全部返回 **HTTP 200**,小米 5 端点正确 401。
+2. **测试 bug 点**:`JwtInterceptor.java:114-127` `LOGIN_REQUIRED_PATHS` 含 `/api/xiaomi-health/` 无 `/api/huawei-health/`;契约用例 `tests/e2e-live/health-contract.spec.js:41-52`。
+3. **最优修改方案**:① **源码侧已完成**(`JwtInterceptor.java:116` 含 `/api/huawei-health/`,`cc7b3e00b`);② 待办 = **部署含该提交的构建到 `cfc.iwintrue.com`**;③ 建议补「公开路径清单快照」断言防漂移。
+4. **修改目的**:匿名请求不得触达依赖 `@RequestAttribute currentMemberId` 的控制器。
+5. **闭环**:部署后同一契约复跑 10/10 全绿(当前 5/10 由部署滞后导致)。
+
+### P-3(P1)审核类 6 例仍红(B-21 家族延续)
+1. **问题描述**:`GuideFamilyTaskControllerTest.batchReviewTasks_Success:263`、`reviewTask_Success:247`、`GuideRolePermissionTest.batchReview_TeacherAllowed:222`、`reviewTask_TeacherAllowed:199`、`StatsControllerTest` 1 例。
+2. **测试 bug 点**:上述 5 处;`new TaskController()` 式手工注入未补新增的 `rewardRuleService`/`attachTaskListEstimate` 依赖。
+3. **最优修改方案**:夹具按 `@Mock RewardRuleService` + 构造注入补齐;断言基线核对「批量审核返回条数」口令。
+4. **修改目的**:消除 A 类夹具缺口,避免每次新增依赖都打红一批。
+5. **闭环**:5 类审核用例全绿且连跑 2 轮零漂移。
+
+### P-4(P1)langgraph 本机 venv 不可用(chromadb 原生 DLL 缺失)
+1. **问题描述**:17 例红中 14 例为 500/降级(`DLL load failed while importing chromadb_rust_bindings: 找不到指定的模块`、`api key ****ocal is invalid`);`test_memory` 3 例为 `MemoryManager.__init__() missing 1 required positional argument: 'embeddings'`。
+2. **测试 bug 点**:`cfc-langgraph/tests/test_memory.py:7/14/22`(A 类签名漂移);`cfc-langgraph/.venv/Lib/site-packages/chromadb_rust_bindings/chromadb_rust_bindings.pyd`(C 类环境)。
+3. **最优修改方案**:① 测试侧 `MemoryManager(FakeEmbeddings())`;② 环境侧补 VC++ 运行时或重建 venv(`pip install --force-reinstall chromadb`);③ 修复后按指令改派 251 节点执行。
+4. **修改目的**:让 langgraph 17 红可归因为真实缺陷,而非环境噪音。
+5. **闭环**:`pytest --ignore=tests/qna` ≥ 45 绿,且剩余红可由用例级证据归因。
+
+### P-5(P1)两节点均不可达,"按节点分派"无法执行
+1. **问题描述**:`192.168.16.189` TCP 22/80/4090 全拒;`192.168.16.251:9000/health` 超时。
+2. **测试 bug 点**:非测试代码缺陷;分派链路无健康探针(缺 `node-probe` 断言)。
+3. **最优修改方案**:在 `tests/` 增 `node-probe.spec.js`,每轮先探活再分派;节点恢复后把 admin 任务派 189、langgraph 派 251。
+4. **修改目的**:使「节点分派」可验证,避免每轮静默回退本机。
+5. **闭环**:探针 3/3 可达且任务在目标节点产出日志。
+
+### P-6(P2)根级黑盒 23 例 12 红(凭据/环境门控)
+1. **问题描述**:`tests/` jest 23 例中 12 红,全部依赖在线服务与测试账号口令。
+2. **测试 bug 点**:`tests/integration/mini-games-api.spec.js:255` 等断言依赖线上数据状态。
+3. **最优修改方案**:改为「契约级最小断言 + 显式 skip 标注未授权」,避免红噪音淹没真实缺陷。
+4. **修改目的**:让根级套件的红具备可解释性。
+5. **闭环**:12 红转「显式 skip(未授权)」或绿。
+
+### P-7(P2)`@GetMapping` 8 处仍违 AGENTS.md
+1. **问题描述**:`grep -rn "@GetMapping" cfc-backend/src/main/java` = 8 处 3 文件,项目规范要求统一 `@PostMapping`。
+2. **测试 bug 点**:无测试守护「路由注解风格」。
+3. **最优修改方案**:补一条架构测试(扫描 `@GetMapping` 计数应为 0)。
+4. **修改目的**:把规范变成可执行门禁。
+5. **闭环**:架构测试绿 + 8 处清零。
+
+### P-8(P2)metrics 脚本无法入库(B-33 延续)
+1. **问题描述**:`.gitignore:70 *.py` 全仓忽略 Python,导致 `docs/tdd/tools/test_report_metrics.py` 写了就丢。
+2. **测试 bug 点**:`.gitignore:70`。
+3. **最优修改方案**:加 `!docs/tdd/tools/*.py` 例外。
+4. **修改目的**:让度量脚本成为可复现资产,避免每轮重写。
+5. **闭环**:`git ls-files docs/tdd/tools/*.py` 非空。
+
+---
+
+## 十一、门禁结论(**不通过**)
+
+| 门禁 | 阈值 | 实测 | 判定 |
+|------|------|------|------|
+| G1 全量通过率 | ≥96% | 94.68%(后端 95.02%) | ❌ |
+| G2 红例数 | ≤10 | 149 | ❌ |
+| G3 前端全绿 | 386/386 | 386/386 | ✅ |
+| G4 编译 | 0 错 | `mvn clean test` 通过(B-47 已修) | ✅ |
+| G5 资产完整性 | 100%、沉默 0 | 288/288、0 | ✅ |
+| G6 浏览器 E2E | 100% | admin 5/5 + front H5 6/6 + shop 4/4 = 15/15 | ✅ |
+| G7 langgraph | 0 失败 | 34/51(17 红) | ❌ |
+| G8 契约 | 0 红 | health 5 红(B-50)+ MapContract 3 红 | ❌ |
+| G9 SRS/场景覆盖 | ≥80% | 241 SC / 15 跑通 = 6.2% | ❌ |
+| G10 节点分派 | 按指令分派成功 | 0/2 节点可达,全回退本机 | ❌ |
+
+**结论:不通过。**(B-50 已由研发修复、卡在部署 — 见 §十 P-2 源码复核) 方向性变化:**可构建的恢复了(B-47 已修,288 类全量可跑)、可测的浏览器端全绿了(15/15)**,但**绿的门槛只差一次提交(B-53)**——这是本轮与上轮最大的不同:缺口从"缺能力"变成"缺动作"。
+
+**使绿顺序**:P-1(提交 WIP,+42 例)→ P-2(华为鉴权,安全 P0)→ P-3(审核 6 例)→ P-4(langgraph 17 例)→ P-5(节点探针)→ P-6 → P-7 → P-8。
+
+---
+
+## 十二、未实测项(如实登记,不得视为通过)
+
+1. 覆盖率(jacoco)/ 变异(pitest)/ 性能压测 / SAST-DAST / 依赖漏洞扫描 — 工具未安装,未联网安装
+2. `192.168.16.189`、`192.168.16.251` 节点上的任何执行 — TCP 不可达
+3. `cfc-langgraph` 需真实 LLM 的用例(chat/analyze/intent/auto_tag)— 本机凭据无效,仅验证降级路径
+4. Playwright 其余 90 个 spec(含 `tests/e2e/**`,`globalSetup` 会 reset 共享库,禁止对已部署站点执行)
+5. `@Disabled` 4 例 + 1 个 `@ParameterizedTest` 全量展开以外的分支
+6. UAT / 无障碍 / 可用性 / 兼容性(firefox、webkit、多视口)
+7. `dan/danshop` 独立商城(不在本轮方案范围)
+
+---
+
+## 十三、本轮产出与证据
+
+| 类型 | 路径 |
+|------|------|
+| 后端全量日志 | `_r2110_backend.log`(33:37,BUILD SUCCESS) |
+| 后端全量 XML 备份 | `d:\_surefire_r2110_main\`(288 份) |
+| 聚合脚本 / 结果 | `_r2110_aggregate.py` / `d:\_r2110_agg.json` |
+| WIP 预演日志 | `_r2110_wip_targeted.log`(170 例 / F4 / E2) |
+| 前端 / 管理端 / 根级 / pytest | `_r2110_frontend.log` / `_r2110_cfcweb.log` / `_r2110_root_tests.log` / `_r2110_pytest.log` |
+| 浏览器 live | `_r2110_admin_live.log` / `_r2110_frontend_live.log` / `_r2110_shopapi.log` / `_r2110_health.log` |
+| 截图 | `_artifacts_live\admin-0*.png`、`frontend-01*.png` |
+
+> 只读声明:未修改被审生产代码、未提交任何 WIP、未联网安装依赖、未启停任何服务。

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


+ 47 - 0
docs/tdd/test/notice-2026-11-07-2010-73round.md

@@ -0,0 +1,47 @@
+# 研发侧通知 · 第 73 轮测试闭环结果(2026-11-07 20:10)
+
+> 来源:测试负责人第 73 轮(20:10 主报告 `docs/tdd/test/automation-run-2026-11-07-2010.md`)
+> 触发条件:**测试结果有变化** → 按闭环铁律推送远程并通知研发
+
+## 一、本轮核心变化(相对 18:50 轮)
+
+| 维度 | 18:50 轮 | 本轮 20:10 | 说明 |
+|---|---|---|---|
+| 后端全量 | 未跑(R-3 记为「无 mvn」) | **288 类 / 2389 例 / 95.02%** | B-47 已修 → 主干恢复可编译;本轮打通 IDEA 自带 Maven 3.9.9 + JDK8 |
+| 浏览器 admin | 0/5(记「Chromium 缺失」) | **5/5 ✅** | **B-51 关闭**:Chromium 一直可用,上轮失败真因是在仓库根跑 Playwright 触发双版本冲突 |
+| 浏览器 frontend H5 | 6/6 | **6/6 ✅** | 488×812 移动视口,串行单任务 |
+| 商城排序契约 | 4/4 | **4/4 ✅** | — |
+| health 契约 | 5/10(环境受限未独立复跑) | **5/10(独立复跑成功)** | **B-52 关闭**(原为版本冲突),失败全部是 B-50 本体 |
+| langgraph | 51 绿(记录口径可疑) | **34 绿 / 17 红** | 本机 venv 的 chromadb 原生 DLL 缺失 + LLM 凭据无效 → 新增 **B-54** |
+| 节点分派 | 部分不可达 | **0/2 可达** | 189 TCP 全拒、251:9000 超时 → 新增 **B-55** |
+
+**门禁结论:⛔ 不通过**(G1 94.68%、G2 149 红例、G7 langgraph、G8 契约 5 红、G9 场景 6.2%、G10 分派失败)。
+**但性质变了:缺口从「缺能力」变成「缺一次提交」** —— 见 B-53。
+
+## 二、待研发处理(按优先级)
+
+| 编号 | 事项 | 优先级 | 处置要求 | 证据 |
+|---|---|---|---|---|
+| **B-53** | **70 项 WIP 内含 11 个后端测试修复,未提交** | **P0** | `git add` `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/` 下 11 个 `*Test.java` → commit → push `origin/cfclub`。实测带入后 170 例红 48→6,**后端 95.02%→96.78%(越 G1)** | `_r2110_wip_targeted.log`(170 例 / F4 / E2) |
+| **B-50** | **华为健康 5 端点线上未鉴权 200(改为「部署滞后」)** | **P0(安全/部署)** | **源码侧已修**(`JwtInterceptor.java:116` 已含 `/api/huawei-health/`,`cc7b3e00b`;`WebConfig` 无豁免)→ **待办:把含该提交的构建部署到 `cfc.iwintrue.com`** | `health-contract.spec.js` TC-H-U01~U05 线上仍 200;源码 grep 已含该路径 |
+| **B-54** | langgraph 本机不可实测 | P1 | ① 补 VC++ 运行时或 `pip install --force-reinstall chromadb`(`DLL load failed ... chromadb_rust_bindings`);② `tests/test_memory.py:7/14/22` 补 `MemoryManager(FakeEmbeddings())`;③ report_parse 2 例去掉容器路径 `/app/cfc/...` | `_r2110_pytest.log`:34 绿 / 17 红 |
+| **B-55** | 测试节点 189 / 251 不可达 | P1(运维) | 开放 189 的 22/4090、对 251 放通 9000;测试侧将补 `node-probe` 用例 | `curl` 实测 000(拒绝/超时) |
+| P-3 | 审核类 6 例仍红(含 WIP 后) | P1 | `GuideFamilyTaskControllerTest:247/263`、`GuideRolePermissionTest:199/222` 的夹具未补 `rewardRuleService`;`StatsControllerTest` 1 例 | 同上日志 |
+| P-7 | `@GetMapping` 8 处仍违 AGENTS.md | P2 | 统一改 `@PostMapping`,测试侧将加「路由注解风格」架构断言 | `grep -rn "@GetMapping"` = 8 |
+
+## 三、B-53 闭环标准(复评门槛)
+
+1. 11 个测试文件入 `origin/cfclub`(`git merge-base --is-ancestor <sha> origin/cfclub` ✓)
+2. 主干全量 `mvn -o -B clean test`:后端 ≥ 96.78%(2312/2389),红例 ≤ 73
+3. 全量合计 ≥ 96%(2763/2874)
+4. 工作区 `git status --porcelain` 对本轮测试文件为空
+
+## 四、本轮已闭环(测试侧自处置,无需研发动作)
+
+- **B-51 关闭**:浏览器节点从未缺失 Chromium;纪律改为「必须在 `tests/` 目录内执行 Playwright」。
+- **B-52 关闭**:health 契约在 `tests/` 内可独立复跑,已纳入每轮回归。
+
+---
+
+**报告全文**:`docs/tdd/test/automation-run-2026-11-07-2010.md`
+**阻塞台账**:`docs/tdd/test/blockers.md`(B-50 复现、B-51/B-52 解除、B-53/B-54/B-55 新增)

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