|
|
@@ -0,0 +1,201 @@
|
|
|
+# 测试闭环报告 · 浠艾福 XAF(每小时轮 · 第 81 轮)
|
|
|
+
|
|
|
+- **执行时间**:2026-11-08 06:30 (GMT+8)
|
|
|
+- **执行档**:review 档(已授权内网 `cfc.iwintrue.com`→`192.168.16.251`,仅 `/admin`、`/frontend` 及同源只读契约;不联网)
|
|
|
+- **本轮 HEAD**:`b6d5b0391`(本地工作树,含 S-cfc-63/64 使绿提交)
|
|
|
+- **远端 HEAD**:`origin/cfclub = 72d5d77d7`(较本地 +4 commits:S-cfc-65 team.star.multiplier 实现 + 2 版本号提交 + 研发 06:10 汇报)
|
|
|
+- **上次自动化 HEAD**:`b6d5b0391`(2026-11-08 05:50 轮,本地未再推进)
|
|
|
+- **两轮间远端提交**:4 commits(team.* 实现 + 版本号 + 研发汇报;SRS/需求/接口文档零变更)
|
|
|
+- **测试负责人**:陆谨(软件测试专家团主理人,只读审查 + 授权内测试用例执行)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、历史审查记录(对照,非本次结论依据)
|
|
|
+
|
|
|
+按记忆库召回(本对象历史密集,近 10 轮均为「⛔不通过(有条件)」)。遗留长期风险:
|
|
|
+- **B-61 / P0**:`/api/health/plan/**` 未纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS`,匿名 POST 直通 200(自 02:21 起持续,**本轮为第 3 轮复现**)。
|
|
|
+- **JaCoCo 缺失**:离线不可得,覆盖率 N/A(无量化门槛)。
|
|
|
+- **37 红类 / S-cfc-31 blank-key**:历史红类集合长期未归零(R77 全量 35 红类 / 115 红例)。
|
|
|
+- **growth_records 重复列**(P1)历史未处置。
|
|
|
+- **B-34/B-35** LangGraph 问卷降级(需 AI 9000,超内网授权)。
|
|
|
+- **/admin 真实登录**:05:50 轮曾退化(U04/U05 身份带出失败 3/5);本轮恢复 5/5(见第五节)。
|
|
|
+
|
|
|
+**较上轮新增改善**:B-62(14 RED 预期未实现)→ 闭环;B-53(11 文件 WIP)→ 闭环(13 文件已入库);B-58(langgraph 8 文件 WIP)→ 入库(但修复内容未落地,见第六节)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、项目画像速览(只读)
|
|
|
+
|
|
|
+| 模块 | 技术栈 | 端口 | 本轮可测范围 |
|
|
|
+|---|---|---|---|
|
|
|
+| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 单测/契约单测(离线 test-compile 验证) |
|
|
|
+| cfc-frontend | uni-app 小程序 (Vue2) | — | Jest 单元/组件(mock API) |
|
|
|
+| cfc-web | Vue2 + ElementUI 管理端 | 8082 | Jest 单元/组件(mock API) |
|
|
|
+| cfc-langgraph | Python FastAPI + LangGraph | 9000 | 本地 .venv pytest(qna 排除;LLM/chromadb 受限) |
|
|
|
+| 内网部署 | `cfc.iwintrue.com`→192.168.16.251 | — | Playwright 只读 E2E(`/admin`、`/frontend`、shop、health 契约) |
|
|
|
+
|
|
|
+**关键路径/约束(据 AGENTS.md)**:统一 `@PostMapping`、JWT 拦截 `/api/**`(8 公开路径)、`JwtInterceptor.LOGIN_REQUIRED_PATHS` 为鉴权门禁核心;小程序禁用可选链/CSS Grid;迁移唯一入口 `DatabaseInitializer`。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、20 类测试覆盖矩阵(三态:已发现 / 未发现 / 待核实)
|
|
|
+
|
|
|
+| # | 测试类型 | 三态 | 证据 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | 已发现(实测) | cfc-frontend 19套件/342+1skip;cfc-web 12套件/90 |
|
|
|
+| 2 | 组件级测试 | 已发现(实测) | cfc-web `*/*.spec.js` 组件测试(ProductPicker/SkuEditor/Audit…) |
|
|
|
+| 3 | 集成测试 | 已发现(部分) | 后端 S-cfc-* 契约单测(未全量复跑,复用基线);shop-api 接口契约 |
|
|
|
+| 4 | 接口/API 测试 | 已发现(实测) | shop-sort-api TC-S-U01~04、health-contract TC-H-U01~10 |
|
|
|
+| 5 | 系统/端到端 | 已发现(实测) | frontend-live 6、admin-live 5、health 13(Playwright 真实浏览器) |
|
|
|
+| 6 | 冒烟测试 | 已发现 | ci-smoke、frontend TC-F-U01 首屏渲染 |
|
|
|
+| 7 | 回归测试 | 已发现(实测) | Jest 双绿连绿 + E2E 复跑对比(见第五节) |
|
|
|
+| 8 | 探索性测试 | 未发现 | 无现成资产 → 降级为测试设计 |
|
|
|
+| 9 | 验收/UAT/BDD | 未发现 | 待核实(无 BDD 规格资产) |
|
|
|
+| 10 | 性能测试 | 未发现 | 未授权未执行(需公网/打远端)→ 测试设计 |
|
|
|
+| 11 | 可靠性测试 | 待核实 | 无现成资产;健康探针 302 可达但无持续可靠性刻画 |
|
|
|
+| 12 | 安全(SAST/DAST/依赖) | 未发现 | 未授权未执行(需公网)→ 测试设计 |
|
|
|
+| 13 | 兼容性测试 | 已发现(部分) | admin-desktop(1440×900) + frontend-mobile(375×812, isMobile) |
|
|
|
+| 14 | 可用性测试 | 待核实 | 前端 E2E 含「无 requestfailed」部分覆盖 |
|
|
|
+| 15 | 无障碍测试 | 未发现 | 无资产 → 降级设计 |
|
|
|
+| 16 | 覆盖率度量 | 待核实(未实测) | JaCoCo 离线缺失,覆盖率 N/A;仅 surefire 口径基线 |
|
|
|
+| 17 | 质量指标 | 已发现 | 通过率/套件数/红例数持续采集 |
|
|
|
+| 18 | 全项目代码审查 | 已发现(只读) | 本轮回溯 4 远端提交 + 历史 B-类问题;不修改代码 |
|
|
|
+| 19 | 变异测试 | 未发现 | 无资产 → 降级设计 |
|
|
|
+| 20 | 契约测试 | 已发现 | S-cfc-35~49 红/绿契约单测(后端);health-contract 鉴权契约(E2E) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、测试方案与执行档
|
|
|
+
|
|
|
+- **范围**:cfc-frontend / cfc-web Jest(全量实跑);内网 E2E(admin/frontend/shop/health 只读);后端 `mvn test-compile`(验证本机树编译,mvn 3.9.9 已定位);langgraph 本机 `.venv` pytest(qna 排除)。
|
|
|
+- **执行档**:review(内网已授权;公网命令一律不执行)。
|
|
|
+- **排除项**:依赖漏洞/压测/DAST(公网)、JaCoCo(联网下载)、全量后端 `mvn test`(被 S-cfc-* 预期 RED 污染 + 时长,复用权威基线 R77 95.07%)、langgraph 远程派发(251 不可达/限流,见第十二节)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、执行结果
|
|
|
+
|
|
|
+| 维度 | 用例总数 | 通过 | 失败 | 备注 |
|
|
|
+|---|---|---|---|---|
|
|
|
+| cfc-frontend Jest | 343 | 342 | 0 | 1 skipped;19 套件连绿;**B-62 的 14 例 RED 已全部转绿** |
|
|
|
+| cfc-web Jest | 90 | 90 | 0 | 12 套件连绿 |
|
|
|
+| 后端 test-compile | — | — | — | EXIT 0(mvn 3.9.9,5m52s;本机树 b6d5b0391+WIP 编译通过) |
|
|
|
+| E2E admin | 5 | 5 | 0 | TC-A-U01~U05 全绿;**U04/U05 真实登录+菜单遍历恢复**(上轮 3/5) |
|
|
|
+| E2E frontend | 6 | 6 | 0 | TC-F-U01~U06 游客态全绿 |
|
|
|
+| E2E shop-api | 4 | 4 | 0 | TC-S-U01~U04 排序契约绿 |
|
|
|
+| E2E health | 13 | 10 | 3 | TC-H-U01~U10 绿;**TC-HP-U01/02/03 仍 200 直通(B-61 P0 第 3 轮)** |
|
|
|
+| langgraph pytest | 43 | 26 | 17 | 与 R77/R78 一致;C 类环境 14(chromadb DLL + LLM 401 + 数据路径)+ A 类夹具 3(MemoryManager embeddings 签名) |
|
|
|
+
|
|
|
+**覆盖率**:行/分支覆盖率 N/A(JaCoCo 离线缺失);后端权威全量基线 surefire 口径 ≈ 95.07%(R77,本轮未重跑,标未实测)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、回归与对比(vs 上次自动化 05:50,HEAD b6d5b0391)
|
|
|
+
|
|
|
+- **Jest 双绿连绿**:frontend 19/342+1skip、web 12/90,与基线一致,**无新增回归**。
|
|
|
+- **/admin 恢复**:05:50 轮 3/5(U04/U05 登录身份自动带出失败,报告列为「退化信号待核实」);**本轮 5/5 全绿**,U04/U05 通过 → 上轮退化未再复现,初步判定为瞬态/账号数据抖动,**待下轮复测确认稳定**(不排除上轮账号角色查询偶发)。
|
|
|
+- **P0 健康方案鉴权(B-61)**:TC-HP-U01/02/03 匿名 POST `/api/health/plan/{adjust,attribution,generate}` 仍返回 200,**连续第 3 轮未修复**。
|
|
|
+- **langgraph**:43 收集/26 过/17 红,与 R77/R78 完全一致(无改善、无劣化)。B-58 的 8 个 WIP 文件已入库(`git status` 该路径已干净),但**入库 conftest.py 并不含 R76 工作区版本的 `collect_ignore`/`llm_live` 重构**(`git log -- cfc-langgraph/tests/conftest.py` 最近触达为版本号/ai-q/restore 提交)→ 主干 17 红仍真实存在,B-58 仅「已修未提交」维度收口,「修复内容落地」未实现。
|
|
|
+- **生产 src/main 自 02:21 起变更**:team.*(S-cfc-63/64/65)+ family.invite 前端(S-cfc-66/67 birthday/gender),均随契约单测合入,本机树编译通过。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、测试用例编写产出(SRS 闸门)
|
|
|
+
|
|
|
+- **闸门判定**:`git diff 362bf7b1b..origin/cfclub -- docs/tdd/SRS.md "docs/需求分析" docs/superpowers/specs docs/superpowers/api` → **无任何变更**(EXIT 0,空输出)。
|
|
|
+- **结论**:**本次无需求/SRS/接口文档变更,跳过测试用例编写**,零仓库抖动(符合闭环「零抖动」约定)。
|
|
|
+- 注:远端 +4 提交中 `docs/tdd/*` 为研发汇报,不在闸门路径内,不触发编写。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、测试案例变更(对照场景)
|
|
|
+
|
|
|
+- **B-62 场景闭环**:家庭加入 join-form birthday/gender 捕获(S-cfc-35/S-cfc-38)——研发已于 04:53/04:56 提交实现(`4f40a8973`/`2c65d98f7`),本轮 frontend Jest 19 套件 343 例(含此前 14 例 RED 契约)全绿 → **14 例 RED 转绿,B-62 闭环**。无需新增/修改用例,仅状态更新。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、新增/更新风险
|
|
|
+
|
|
|
+- **🔴 /admin 登录(P2,观察项)**:上轮 U04/U05 退化本轮未复现(5/5),标注「待下轮复测确认稳定」,暂不升级为 P1。
|
|
|
+- **🟡 langgraph 17 红**:B-58 入库后无改善(conftest 未含重构),主干 langgraph 26/43 持续;需研发确认 conftest 意图或本机装 VC++/重建 venv。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十、覆盖缺口清单
|
|
|
+
|
|
|
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| P0 健康方案鉴权 | `/api/health/plan/**` 未入 LOGIN_REQUIRED_PATHS | 匿名可调用的付费/隐私接口 | 复跑 TC-HP-U01~03,期望 401/403 | P0 | 修 JwtInterceptor 后 E2E 转绿 |
|
|
|
+| langgraph 17 红 | chromadb DLL + LLM 401 + MemoryManager 签名 | 问卷/解析/意图链路不可信 | 本机装 VC++ 运行时/重建 venv + 补 FakeEmbeddings;或 251 恢复 9000 派发 | P1 | 环境修复后 43 例归绿 |
|
|
|
+| 远程派发通道 | 189 prompt 404;204/251 provider 配额限流(1req/3min) | 无法按节点分派浏览器/langgraph | 升级/对齐 opencode 版本 + 恢复模型配额 | P1 | 通道恢复后按 189→admin / 204→frontend / 251→langgraph 分派 |
|
|
|
+| JaCoCo 覆盖率 | 离线缺失 | 覆盖率无量化门槛 | 联网下载插件或改 pom 引 jacoco | P1 | 引入后 `mvn test jacoco:report` |
|
|
|
+| 37 红类/115 红例 | 3 B-13 + 34 漂移 | 已知缺陷长期未闭环 | 逐类派发修复 + 复跑 | P1 | 红例归零 |
|
|
|
+| growth_records 重复列 | 历史未处置 | 数据模型冗余/写入风险 | 架构审查 + 迁移去重 | P1 | 处置后复跑 |
|
|
|
+| 探索性/无障碍/变异/BDD | 无资产 | 非功能覆盖盲区 | 补探索性脚本 + axe 无障碍 + pitest | P2 | 设计态→资产化 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十一、五要素问题清单
|
|
|
+
|
|
|
+### 问题 1(P0)— 健康方案接口匿名可调用(B-61,第 3 轮)
|
|
|
+1. **问题描述**:匿名 POST `/api/health/plan/{adjust,attribution,generate}` 返回 200(应 401/403)。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/health-contract.spec.js:84`(`expect([401,403,404]).toContain(status)`,实际 200);根因 `cfc-backend` `JwtInterceptor.LOGIN_REQUIRED_PATHS`(约 87–127 行)未含 `/api/health/plan/**`。
|
|
|
+3. **最优修改方案**:在 `LOGIN_REQUIRED_PATHS` 追加 `/api/health/plan/**`(与 API_REFERENCE §4.49 口径一致,同族对齐华为/小米健康)。
|
|
|
+4. **修改目的**:闭合鉴权门禁,防止未授权访问健康方案付费/隐私能力。
|
|
|
+5. **问题闭环**:修复后复跑 `playwright.config.health.js` → TC-HP-U01~03 由失败转 401/403 即通过;标准:3 例全绿。
|
|
|
+
|
|
|
+### 问题 2(P1)— langgraph 17 红持续(B-54/B-58-Update 承袭)
|
|
|
+1. **问题描述**:langgraph pytest 43 收集 / 26 过 / 17 红,与 R77/R78 完全一致;B-58 入库后无改善。
|
|
|
+2. **测试 bug 点**:C 类环境 14 例(`chromadb_rust_bindings` DLL 缺失→/chat、/analyze、/auto_tag 500;LLM 凭据无效→test_intent 4 例退化 CHAT;test_report_parse 数据路径)+ A 类夹具 3 例(`tests/test_memory.py:7/14/22` `MemoryManager()` 缺 `embeddings`,`app/memory/store.py:15` 已改必填)。
|
|
|
+3. **最优修改方案**:① 本机装 VC++ 运行时或 `pip install --force-reinstall chromadb`;② 用例补 `FakeEmbeddings`(研发确认 MemoryManager 签名意图后);③ 或恢复 251 节点 langgraph 9000 后按指令派发复跑。
|
|
|
+4. **修改目的**:恢复问卷/解析/意图链路可测性。
|
|
|
+5. **问题闭环**:修复后 43 例全绿或 ≥45 绿(51 口径);标准:红例归零。
|
|
|
+
|
|
|
+### 问题 3(P1)— 远程派发通道受限(B-56 演进)
|
|
|
+1. **问题描述**:按指令应将浏览器任务派 189/204、langgraph 派 251,但三节点探针均无法有效派发。
|
|
|
+2. **测试 bug 点**:`192.168.16.189:4090` `POST /api/session/{id}/prompt` → **404**(API 路径/版本不符);`192.168.16.204:4091` 与 `192.168.16.251:4096` 通道可用(prompt 200,assistant 有响应)但返回 `[RETRY provider.rate-limit You have used up today's text quota...1 request every 3 min]` → 模型今日文本额度用尽。
|
|
|
+3. **最优修改方案**:① 189 节点对齐 opencode API 版本(`/api/session/{id}/prompt` 404 需按实例实际路由适配);② 204/251 恢复模型配额或切换模型/提供方;③ 升级本机 CLI 至与节点同版本。
|
|
|
+4. **修改目的**:恢复「admin→189 / frontend→204 / langgraph→251」节点化分派,满足「每节点仅一浏览器任务」。
|
|
|
+5. **问题闭环**:三节点派发任务能回传真实 playwright/pytest 结果 JSON;标准:任一节点分派成功且产出非空。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十二、待核实项
|
|
|
+
|
|
|
+- /admin 登录(上轮退化)是否稳定恢复:待下轮复测确认(本轮 5/5)。
|
|
|
+- 后端全量 `mvn test` 真实红例/红类数(本轮仅 test-compile,复用 R77 基线 95.07%,标未实测)。
|
|
|
+- cfc-langgraph 远程派发(251 可达但 9000 服务 closed + 配额限流;本机 .venv 兜底)。
|
|
|
+- B-34/B-35 LangGraph 问卷降级复验(需 AI 9000,超内网授权)。
|
|
|
+- 探索性/无障碍/BDD/变异测试资产缺失(无材料,标待核实,不臆造)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十三、需用户单独授权才能继续的项(未授权未执行 + 测试设计)
|
|
|
+
|
|
|
+| 项 | 为何未执行 | 测试设计(降级产出) |
|
|
|
+|---|---|---|
|
|
|
+| 依赖漏洞扫描 | 需公网(maven/github 元数据) | 离线可用 `mvn dependency-check:check`(需先联网拉规则库一次);或人工核对 `pom.xml` 依赖版本 |
|
|
|
+| 性能压测 | 需公网 + 打目标环境 | k6/JMeter 脚本针对 `/api/product/list`、`/api/health/plan/*`;授权后仅打内网 192.168.16.251 |
|
|
|
+| DAST(OWASP ZAP) | 需公网下载 | 对 `/admin`、`/frontend` 做被动/主动扫描;授权后仅内网 |
|
|
|
+| JaCoCo 覆盖率 | 需联网下载插件 | 引入 jacoco 插件后 `mvn test jacoco:report` |
|
|
|
+| LangGraph 复验(B-34/B-35) | 需 AI 9000(超内网授权) | 启动 9000 最小服务后复跑问卷降级用例 |
|
|
|
+| 全量 `mvn test` 重跑 | 被 S-cfc-* 预期 RED 污染 + 时长 | 已用 test-compile 验证编译;建议环境就绪后整轮实跑固化新基线 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十四、门禁结论
|
|
|
+
|
|
|
+**⛔ 不通过(有条件)**
|
|
|
+
|
|
|
+**依据**:P0 健康方案鉴权缺口(B-61)连续第 3 轮未修;langgraph 17 红持续(B-58 入库未改善);远程派发通道受限(189 404 / 204·251 配额限流);JaCoCo 覆盖率不可量化(N/A);历史 35 红类/115 红例未闭环;growth_records 重复列未处置。本轮改善显著:**/admin 5/5 恢复、B-62(14 RED)闭环、B-53/B-58 WIP 收口、Jest 双绿连绿、浏览器 15/15 全绿(除 health 3 例 B-61)**、后端编译通过——但门禁硬条件未满足。
|
|
|
+
|
|
|
+**复评条件(全部满足方可转「通过」)**:
|
|
|
+1. 修 P0:将 `/api/health/plan/**` 纳入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` → 复跑 `playwright.config.health.js` 全绿(TC-HP-U01~03 转 401/403)。
|
|
|
+2. langgraph 43 例红例归零(环境 + MemoryManager 夹具),或恢复 251 派发复跑。
|
|
|
+3. 引入 JaCoCo,后端行覆盖率 ≥ 80%。
|
|
|
+4. 37/35 红类归零(含 S-cfc-31 blank-key 真缺陷修复)。
|
|
|
+5. 处置 growth_records 重复列。
|
|
|
+6. 恢复节点派发通道(189/204/251),浏览器/langgraph 按节点分派。
|
|
|
+7. 用户单独授权:依赖漏洞/压测/DAST 公网项;B-34/B-35 经 AI 9000 复验。
|
|
|
+
|
|
|
+**本轮产物**:本报告 `docs/tdd/test/automation-run-2026-11-08-0630.md`(随 `docs/tdd/test/` 推送);上轮未推送报告 `docs/tdd/test/automation-run-2026-11-08-0550.md`(本次一并入库推送)。
|