|
|
@@ -0,0 +1,220 @@
|
|
|
+# 测试闭环报告 · 每小时轮(review 档,内网已授权)
|
|
|
+
|
|
|
+- **执行时间**:2026-11-08 02:47 (GMT+8)
|
|
|
+- **对象 / 分支**:`d:/cfc`(浠艾福 XAF)· `origin/cfclub`
|
|
|
+- **HEAD(本轮)**:`362bf7b1b`(R77 闭环汇报)→ 本轮提交见文末
|
|
|
+- **上次自动化轮**:2026-11-08 02:21,HEAD `362bf7b1b`(结论:⛔不通过(有条件))
|
|
|
+- **执行档**:review(内网 `cfc.iwintrue.com` /admin 与 /frontend + 配套 /api 只读探测;禁止公网;只读,不修改/提交/推送生产源码)
|
|
|
+- **测试负责人**:陆谨(软件测试专家团主理人,本闭环仅做只读审查 + 测试目录内用例编写/更新)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、历史审查记录(记忆召回)
|
|
|
+
|
|
|
+- **非首次审查**:历史闭环记录齐全(最早 2026-10-28)。
|
|
|
+- **上次结论(02:21 R77)**:⛔不通过(有条件)。遗留缺口:① **P0 健康方案 3 端点未强制 JWT**(TC-HP-U01/02/03 失败);② B-53 后端集成测试 13 文件未提交;③ 自动化环境无 mvn → 后端覆盖率只能复用基线;④ /admin 凭据缺失长期降级;⑤ LangGraph 问卷降级/依赖漏洞/压测需授权。
|
|
|
+- **本轮改善点**:① `/admin` 浏览器套件**由降级转为 5/5 全绿**(登录+滑块+核心菜单真实打通);② `/frontend` 6/6 复跑确认 23:00 基线仍成立;③ 商城排序契约 4/4 保持。
|
|
|
+- **本轮新发现**:langgraph 本机兜底引入 17 失败(详见第七节,含测试用例滞后问题),langgraph 正式测试仍需 251 节点授权。
|
|
|
+- 历史结论仅作对照,**本次结论基于本次重新取证**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、项目画像速览(只读)
|
|
|
+
|
|
|
+| 模块 | 技术栈 | 端口 | 本轮回测可测范围 |
|
|
|
+|---|---|---|---|
|
|
|
+| `cfc-backend` | Spring Boot 2.7.18 + MyBatis-Plus + Java 8 | 9082 | 单测/集成测试(本运行无 mvn,复用 R77 全量基线 95.07%) |
|
|
|
+| `cfc-web` | Vue 2 + Element UI 管理端 | 8082 | Jest 单元/组件测试(mock API,不断言真实服务端) |
|
|
|
+| `cfc-frontend` | uni-app 微信小程序 (Vue 2) | — | Jest 单元/组件测试 |
|
|
|
+| `tests/e2e-live` | Playwright 1.61.1 + chromium | — | admin / frontend / shop-api / health 契约 E2E(内网实测) |
|
|
|
+| `cfc-langgraph` | FastAPI + LangGraph(AI 服务) | 9000 | **本机兜底异常**(环境损坏 + 用例滞后);正式测试应派发 251 节点(不可达) |
|
|
|
+
|
|
|
+- **关键路径**:统一 `@PostMapping`;`JwtInterceptor` 拦截 `/api/**`(`LOGIN_REQUIRED_PATHS` opt-in 清单)。
|
|
|
+- **需求变更命中**:`API_REFERENCE.md` §4.49.1(adjust,HL-04/R4)、§4.49.2(attribution R2 + generate followUpAnswers R3,HL-03)——上轮已配套新增 TC-HP-U01~03 契约用例,本轮复测仍 3 失败(P0 未修复)。**SRS.md 与 docs/需求分析 自上次运行无变更**;specs 变更均为 EVD 契约核对(既有键状态变化,无新增能力键)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、执行范围与命令
|
|
|
+
|
|
|
+| 项 | 命令 | 状态 |
|
|
|
+|---|---|---|
|
|
|
+| 浏览器 E2E /admin | `npx playwright test -c playwright.config.live.js --project=admin-desktop` | ✅ 实测 5/5 |
|
|
|
+| 浏览器 E2E /frontend | `--project=frontend-mobile` | ✅ 实测 6/6 |
|
|
|
+| 商城排序契约 | `--project=shop-api` | ✅ 实测 4/4 |
|
|
|
+| E2E 健康契约(含新增 HP-U01~03) | `npx playwright test -c playwright.config.health.js` | ✅ 实测 10 通过 / 3 失败 |
|
|
|
+| cfc-frontend Jest | `cd cfc-frontend && npx jest --ci` | ✅ 实测 319/319 |
|
|
|
+| cfc-web Jest | `cd cfc-web && npx jest --ci` | ✅ 实测 90/90 |
|
|
|
+| cfc-backend mvn test | `mvn test`(mvn 不在 PATH 且无 mvnw) | ⚠️ 未实测 → 复用 R77 基线 95.07% |
|
|
|
+| cfc-langgraph pytest | `.venv/Scripts/python -m pytest tests --ignore=tests/qna` | ⚠️ 本机兜底 26/17;**251 节点 9000/4090 不可达**,无法按指令派发 |
|
|
|
+| 远程派发验证(189/204) | opencode API `POST /api/session` + 轮询 | ⚠️ 会话创建成功但 assistant 零产出(B-56 复现) |
|
|
|
+| 依赖漏洞 / 性能压测 / DAST | 需公网 | ⛔ 未授权未执行 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、测试结果总览(本轮实测)
|
|
|
+
|
|
|
+| 模块 | 用例总数 | 通过 | 失败 | 跳过 | 备注 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| 浏览器 E2E /admin(真实登录) | 5 | **5** | 0 | 0 | TC-A-U01~U05 全绿(登录/滑块/拦截/主框架/核心菜单) |
|
|
|
+| 浏览器 E2E /frontend | 6 | **6** | 0 | 0 | TC-F-U01~U06(首页/五维/健康/成长/我的/资源加载) |
|
|
|
+| 商城排序契约 | 4 | **4** | 0 | 0 | TC-S-U01~U04 |
|
|
|
+| E2E health-contract | 13 | 10 | **3** | 0 | 10 既有全 401 通过;3 新增健康方案鉴权失败(P0 延续) |
|
|
|
+| cfc-frontend Jest | 319 | **319** | 0 | 0 | 17 套件 |
|
|
|
+| cfc-web Jest | 90 | **90** | 0 | 0 | 12 套件 |
|
|
|
+| cfc-backend(R77 基线复用) | 2903 | 2784 | 74 | 4 | 95.07%(未重跑,标注基线) |
|
|
|
+| cfc-langgraph pytest(本机兜底) | 43 | 26 | **17** | 0 | 环境问题为主;用例滞后 3 例(见第七节) |
|
|
|
+| **合计(本机实测)** | **477** | **450** | **20** | 0 | admin/frontend/shop/health/Jest 前端全部实测 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、覆盖率
|
|
|
+
|
|
|
+- **前端/管理端**:Jest 全绿(319+90),功能回归信号稳定。
|
|
|
+- **后端**:R77(02:16 最近全量实测)行覆盖率 **95.07%**,B-53 13 测试文件提交后预测 96.83%。本运行 **mvn 不在 PATH**,按规则复用基线并标注未重测。
|
|
|
+- **langgraph**:本机兜底非权威(环境损坏),覆盖率无意义,标注未实测。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、回归与闭环判定(对比 02:21 基线)
|
|
|
+
|
|
|
+- **Jest 双绿连绿**:frontend 319/319、web 90/90,与 02:21 持平,无新增回归。
|
|
|
+- **浏览器 E2E**:admin **5/5 全绿(上次降级 → 本轮打通,重大改善)**;frontend 6/6 确认 23:00 基线成立;shop 4/4 保持。
|
|
|
+- **E2E 健康契约**:10 既有全绿;**3 新增 HP 用例连续两轮失败**(P0 安全缺口未修复,研发未处置)。
|
|
|
+- **langgraph**:上轮未触达;本轮本机兜底 26/17(环境 + 用例滞后),不能据此判定 251 部署态回归。
|
|
|
+- **判定**:功能回归层面稳定且 admin 通道打通;**安全契约缺口延续(P0)+ langgraph 测试资产滞后(P1)**,结论仍为不通过(有条件)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、新增风险与问题明细(本轮证据)
|
|
|
+
|
|
|
+### 🔴 P0(延续)健康方案 3 端点未强制 JWT,匿名可直达业务层
|
|
|
+
|
|
|
+- 证据:`POST /api/health/plan/{adjust,attribution,generate}` 未带 Authorization → HTTP **200**(attribution/generate 业务码 4001,adjust 500),对照 huawei-health 正确返回 401。
|
|
|
+- 根因:`JwtInterceptor.LOGIN_REQUIRED_PATHS`(JwtInterceptor.java:87–127)**未含 `/api/health/plan/**`**;SEC-20261031-01 注释明确反对的「匿名 userId=-1 放行至 controller」漂移同族遗漏。
|
|
|
+- 影响:匿名用户可触发归因/生成/调整(消耗 AI 配额、可能越权触及家庭私有健康方案)。
|
|
|
+- 处置:列入五要素问题清单 P0,本轮再次催办研发。
|
|
|
+
|
|
|
+### 🟡 P1(本轮新增)langgraph 测试资产滞后 + 本机兜底环境损坏
|
|
|
+
|
|
|
+- **测试用例滞后(代码级,251 部署态同样会失败)**:`tests/test_memory.py:7/14/22` 以 `MemoryManager()` 无参构造调用,但 `app/memory/store.py` 的 `__init__(self, embeddings)` 已在 HEAD(52e9f39f8 起)要求必传 `embeddings` → 3 例 TypeError。
|
|
|
+- **环境问题(本机兜底失效,非代码)**:`chromadb_rust_bindings` DLL 加载失败(test_auto_tag/test_chat 等);LLM 上游 401(本地 api key 失效,test_intent 4 例);Checkpointer 缺 thread_id(test_analyze)。
|
|
|
+- **251 节点不可达**:9000/4090 均 closed(8080 为 Gogs、80/443 也是 web),**langgraph 无法按指令「派发 251」** → 按规则标注未实测,本机结果仅作线索。
|
|
|
+- 处置:① 测试侧更新 `test_memory.py` 适配新签名(测试目录内可改);② 研发确认 `store.py` 签名变更意图并同步新增 embeddings 参数 mock;③ 251 节点恢复 langgraph 服务后按其部署态复验。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、测试用例建设(SRS/场景变更驱动)
|
|
|
+
|
|
|
+- **闸门**:`API_REFERENCE.md` §4.49.1/§4.49.2 自 23:00 起变更(HL-03/HL-04)→ 上轮已新增 TC-HP-U01~U03 契约用例(`tests/e2e-live/health-contract.spec.js` 工作区新增,未提交),本轮复测断言服务端鉴权,暴露 P0。
|
|
|
+- **本轮新增编写**:无新增用例(HP 用例上轮已写);langgraph `test_memory.py` 属**用例滞后待更新**(本轮仅记录,改动需与实现核对后落库)。
|
|
|
+- **SRS.md / docs/需求分析**:自上次无变更 → 无新用例触发。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、五要素问题清单
|
|
|
+
|
|
|
+### 问题 1(P0 · 安全/契约)健康方案端点未强制 JWT(延续)
|
|
|
+
|
|
|
+1. **问题描述**:`POST /api/health/plan/{adjust,attribution,generate}` 无 Authorization → HTTP 200(业务码 4001/500),未按 API_REFERENCE §4.49 拦截为 401/403。
|
|
|
+2. **测试 bug 点**:`cfc-backend/.../config/JwtInterceptor.java:87–127`(`LOGIN_REQUIRED_PATHS` 缺 `/api/health/plan/**`);端点定义 `HealthPlanController.java:33/:63/:100`。
|
|
|
+3. **最优修改方案**:`LOGIN_REQUIRED_PATHS` 增加 `"/api/health/plan/"`(与 huawei/xiaomi-health 同族),统一「默认拒绝 + 显式放行」。
|
|
|
+4. **修改目的**:对齐 SEC-20261031-01,防匿名消耗 AI 配额 / 越权读取家庭私有健康方案。
|
|
|
+5. **问题闭环**:复跑 `tests/e2e-live/health-contract.spec.js` TC-HP-U01/02/03 → 由失败转 pass(401)。通过标准:3 例全绿 + 后端补带/不带 token 双向用例。
|
|
|
+
|
|
|
+### 问题 2(P1 · 测试资产)langgraph test_memory.py 用例滞后于实现签名
|
|
|
+
|
|
|
+1. **问题描述**:`MemoryManager()` 无参调用(test_memory.py:7/14/22),实现已要求 `__init__(self, embeddings)`(store.py:13),3 例 TypeError。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/tests/test_memory.py:7/14/22`。
|
|
|
+3. **最优修改方案**:测试侧以注入 fake embeddings 对象(如 `unittest.mock.MagicMock()`)更新 3 个用例;同时研发确认签名变更意图(是否内存版与向量版并存)。
|
|
|
+4. **修改目的**:恢复 langgraph 记忆管理单测可执行性,配合 251 派发复验。
|
|
|
+5. **问题闭环**:更新后本机 `pytest tests/test_memory.py` 3/3 通过;251 恢复后全量复验。通过标准:3 例全绿。
|
|
|
+
|
|
|
+### 问题 3(P1 · 流程)B-53 后端集成测试 13 文件仍未提交(延续)
|
|
|
+
|
|
|
+1. **问题描述**:后端 13 测试文件未 `git add/commit/push`,全量覆盖率无法可复现到 96.83%。
|
|
|
+2. **测试 bug 点**:`git status` 无该 13 文件(R77 notice 第 1 项 P0 催办)。
|
|
|
+3. **最优修改方案**:研发执行 R77 notice 复跑命令收口 PR。
|
|
|
+4. **修改目的**:覆盖率达到 G1 96% 线的可复现前提。
|
|
|
+5. **问题闭环**:PR 合入后 `mvn test` ≥96.83%、红例 ≤73。
|
|
|
+
|
|
|
+### 问题 4(P1 · 流程)自动化环境无 mvn,后端无法每轮复测(延续)
|
|
|
+
|
|
|
+1. **问题描述**:`mvn` 不在 PATH 且无 `mvnw`,后端实时覆盖率只能复用基线。
|
|
|
+2. **测试 bug 点**:环境 `which mvn` 缺失;`cfc-backend/` 无 `mvnw`。
|
|
|
+3. **最优修改方案**:注入 Maven 或提交 `mvnw` wrapper。
|
|
|
+4. **修改目的**:后端闭环可自动化回归。
|
|
|
+5. **问题闭环**:下轮能跑 `mvn test` 产出 surefire 覆盖率与红例。
|
|
|
+
|
|
|
+### 问题 5(P1 · 基础设施)251 节点 langgraph 服务与 opencode 均不可达
|
|
|
+
|
|
|
+1. **问题描述**:192.168.16.251 的 9000(langgraph)与 4090(opencode)均 closed → langgraph 测试无法按指令派发 251。
|
|
|
+2. **测试 bug 点**:`echo > /dev/tcp/192.168.16.251/9000` 失败;`/4090` 失败;8080 为 Gogs 非目标服务。
|
|
|
+3. **最优修改方案**:运维恢复 251 上 langgraph 9000 服务(及可选 opencode 4090),或在 `.tdd/config.json` 更新 langgraph 可达地址。
|
|
|
+4. **修改目的**:落实用户「langgraph 测试分派 251 节点」约束,消除测试盲区。
|
|
|
+5. **问题闭环**:251:9000 探活通过后按既有 pytest 套件复验(另需修 test_memory 滞后),通过标准 = EXIT 0。恢复前 langgraph 维度标注「未实测」。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十、20 类测试覆盖矩阵(三态速览)
|
|
|
+
|
|
|
+| # | 测试类型 | 状态 | 证据/说明 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | 已发现 | web 90 / frontend 319 / backend 2903(基线) / langgraph 43(兜底) |
|
|
|
+| 2 | 测试覆盖率 | 已发现 | 后端 R77 95.07%(JaCoCo 离线缺失,surefire 口径) |
|
|
|
+| 3 | 变异测试 | 待核实 | 未执行/未配置 |
|
|
|
+| 4 | 组件测试 | 已发现 | cfc-web 组件用例 |
|
|
|
+| 5 | 集成测试(接口) | 已发现 | backend 集成测试 + interface smoke 542(历史) |
|
|
|
+| 6 | 契约测试 | 已发现 | health-contract 13(10 绿 3 红 P0)+ shop-api 4 |
|
|
|
+| 7 | 接口 API 测试 | 已发现 | shop-sort-api 4/4 |
|
|
|
+| 8 | 系统/端到端 E2E | 已发现 | /admin 5/5、/frontend 6/6(本轮实测) |
|
|
|
+| 9 | 性能测试 | ⛔未授权未执行 | 需公网压测 |
|
|
|
+| 10 | 可靠性测试 | 待核实 | 未专项执行 |
|
|
|
+| 11 | 安全(SAST/DAST/依赖/渗透) | 已发现(部分) | E2E 鉴权契约(P0 发现);依赖漏洞⛔未授权 |
|
|
|
+| 12 | 兼容性测试 | 待核实 | 未专项执行 |
|
|
|
+| 13 | 可用性测试 | 待核实 | 未专项执行 |
|
|
|
+| 14 | 无障碍测试 | 未发现 | 未覆盖 |
|
|
|
+| 15 | 冒烟测试 | 已发现 | E2E admin/frontend(登录+核心链路) |
|
|
|
+| 16 | 回归测试 | 已发现 | 本轮 Jest 双绿 + E2E 复跑对比 02:21 |
|
|
|
+| 17 | 探索性测试 | 待核实 | 未专项执行 |
|
|
|
+| 18 | QA 流程 | 已发现 | R76/R77/R78 汇报 + B-53/B-56 阻塞跟踪 |
|
|
|
+| 19 | 质量指标 | 已发现 | 覆盖率/红例/通过率指标存在 |
|
|
|
+| 20 | 全项目代码审查 | 已发现 | JwtInterceptor 鉴权缺口定位(P0) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十一、待核实项
|
|
|
+
|
|
|
+1. langgraph `store.py` 签名变更意图(MemoryManager 是否双模式并存)——需研发确认。
|
|
|
+2. 251 节点 langgraph 9000 服务恢复时间——需运维确认。
|
|
|
+3. B-53 13 测试文件是否已由研发合入——`git status` 未见(未提交)。
|
|
|
+4. 189/204 opencode agent 零产出是否为 opencode 平台侧缺陷——B-56 持续。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十二、需用户单独授权/协调才能继续的项
|
|
|
+
|
|
|
+| 项 | 为何受阻 | 测试设计(降级产出) |
|
|
|
+|---|---|---|
|
|
|
+| langgraph 正式测试 | 251:9000 不可达 | 更新 test_memory 滞后用例(本轮已给方案);251 恢复后按全量 pytest 复验 |
|
|
|
+| 依赖漏洞扫描 / 性能压测 / DAST | 需公网 | 设计待授权后执行 |
|
|
|
+| /admin 凭据 | 本轮 5/5 已用 live spec 内凭据打通(无新阻塞) | — |
|
|
|
+| 189/204 远程派发 | 建会话成功但 agent 零产出(B-56) | 本机直跑已兜底,仍建议运维修平台链路 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十三、门禁结论
|
|
|
+
|
|
|
+### ⛔ **不通过(有条件)**
|
|
|
+
|
|
|
+**理由**:功能回归层面显著改善(**/admin 由长期降级转 5/5 全绿**、/frontend 6/6、shop 4/4、Jest 双绿),但 **P0 安全缺陷(健康方案 3 端点匿名直通)连续两轮未修复**,且 langgraph 测试资产滞后 + 251 节点不可达导致 AI 服务维度仍为盲区;后端每轮复测依赖 mvn 注入。
|
|
|
+
|
|
|
+**复评条件(全部满足方转「通过」)**:
|
|
|
+1. **P0**:`/api/health/plan/**` 加入 `LOGIN_REQUIRED_PATHS`,TC-HP-U01/02/03 转 pass(401);
|
|
|
+2. **P1**:langgraph `test_memory.py` 更新适配新签名 + 251 节点恢复并复验全量 pytest EXIT 0;
|
|
|
+3. **P1**:B-53 13 测试文件合入,后端全量 ≥96.83%、红例 ≤73;
|
|
|
+4. **P1**:自动化环境具备 Maven(或 mvnw),后端每轮可复测;
|
|
|
+5. **待办**:依赖漏洞扫描 + 性能压测获得授权后执行并达标。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+> 约束遵守声明:本闭环仅访问内网 `cfc.iwintrue.com`(hosts→192.168.16.251)+ 内网节点 189/204 opencode API;未访问公网;未修改/提交/推送任何生产源码(仅测试目录 `tests/e2e-live/health-contract.spec.js` 上轮新增用例与报告文档);未输出任何密钥/口令/令牌(opencode API 仅用 env 中已有密码做 Basic 认证,未落盘明文);Jest 为 mock API,不据此断言真实服务端行为;未编造,缺材料一律标注待核实。
|