|
@@ -0,0 +1,329 @@
|
|
|
|
|
+# 测试负责人工作汇报(第 156 轮 · 2026-11-12 23:35–00:50 GMT+8)
|
|
|
|
|
+
|
|
|
|
|
+> 角色:`cfc-tester`(测试负责人 / 陆谨)|执行档:**review(离线 + 内网已授权)**——内网浏览器自动化(`cfc.iwintrue.com/admin` + `/frontend`)、langgraph 实派 `192.168.16.251:4096`、后端 `mvn -o -B clean test` **全量实跑**;**未联网装依赖、未启停服务、未改生产源码/测试**。
|
|
|
|
|
+> 基线 HEAD:跑测起点 `722de8f37`;**跑测窗口内远端合入 1 个功能变更** `3d35ab714 merge(miniprogram): 聊天/消息类入口按有效会员隐藏`(10 文件 +124/−29,新增 `utils/membershipGate.js`)→ 收尾 rebase 至 `c7d921bcf` 后**做了增量复验**(前端全量 624 例,见 §5.1),并按「变更→补用例」原则新增 **7 条用例**。
|
|
|
|
|
+> 节点分工(用户约束:每节点单任务,串行):`189:4090` = **admin-desktop 5/5**|`251:4096` = **langgraph pytest 51 例**|本机 = fe/shop/health/dx + 三套 Jest + 根级 + 后端全量。
|
|
|
|
|
+> **结论:⛔ 不通过**——后端 99.29%(17 红,**与 R154 逐类逐例一致 → 零回归第 14 次**);langgraph **41/51(3→10 红,本轮唯一恶化项)**;浏览器 **28/28 + 2 skip**;前端在功能合入后增量复验 **624 例 / 609 过 / 3 红(集合不变)**;全量 **3790 例 / 3726 过 = 98.31%**。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 0. 基本信息(测试负责人模板)
|
|
|
|
|
+
|
|
|
|
|
+| 项目 | 内容 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| 汇报人 | `cfc-tester`(测试负责人) |
|
|
|
|
|
+| 汇报周期 | 2026-11-12 第 156 轮(跑测窗口 23:36–00:50) |
|
|
|
|
|
+| 负责模块/单元 | cfc-backend(JUnit 全量实跑)· cfc-frontend(Jest)· cfc-web(Jest)· cfc-langgraph(251 实派)· 浏览器 E2E(admin@189 / fe·shop·health·dx@本机)· 根级黑盒 |
|
|
|
|
|
+
|
|
|
|
|
+### 0.1 测试用例建设与执行
|
|
|
|
|
+
|
|
|
|
|
+| 指标 | 数量 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| **本轮新增测试用例数** | **7** 个 | `cfc-frontend/__tests__/utils/membershipGate.test.js`(**TC-MG-U01~U07**),覆盖窗口内合入的 `utils/membershipGate.js`(此前**零测试**)。SRS/场景/API_REFERENCE 本身零变更,但功能合入属「场景实现落地」→ 按纪律**补用例**(未改任何生产代码) |
|
|
|
|
|
+| **本轮验证执行测试数** | **3790** 个 | 后端 2946 + 前端 624 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip) |
|
|
|
|
|
+| **用例通过率** | **98.31%**(3726/3790) | 剔 skip 口径 **98.78%**(3726/3772);红 46 = 后端 17 + 根级 16 + langgraph 10 + 前端 3 |
|
|
|
|
|
+| **新增覆盖资产** | **1** 项 | 新增 `TC-MG-U01~U07` 可执行锚点(`membershipGate` 会员门控契约);反向核查无死资产(`tests/e2e-live` 4 个 spec 全部挂入 project,dx 2 例按 404 正确 skip) |
|
|
|
|
|
+| **SRS/场景变更** | **0(文档)/ 1(实现)** | SRS `specs` **201** 份 + `test-cases` **15** 份 + `API_REFERENCE.md` 窗口内**零变更**;但同日 00:33 合入会员门控实现(`3d35ab714`)→ 已有场景「聊天/消息入口按有效会员可见」实现落地,**已补 7 条用例**覆盖 |
|
|
|
|
|
+
|
|
|
|
|
+### 0.2 会话与任务分发
|
|
|
|
|
+
|
|
|
|
|
+| 指标 | 数量 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| **分派任务数** | **2** 个 | ① 189:admin-desktop(1.4m,5/5,`EXIT=0`);② 251:langgraph pytest(126.67s,41/51) |
|
|
|
|
|
+| **恢复智能体会话数** | 0 | 无中断重建 |
|
|
|
|
|
+| **当前在用会话数** | 3 | 本机(done)/ 189(done)/ 251(done) |
|
|
|
|
|
+
|
|
|
|
|
+| 会话标签 | 会话 ID | 状态 | 任务 | 耗时 | 工作目录 | 备注 |
|
|
|
|
|
+|----------|---------|------|------|------|----------|------|
|
|
|
|
|
+| 本机 | localhost | done | 后端全量 + Jest×3 + 根级 + 浏览器 fe/shop/health/dx | 61:02 | `d:\cfc` | fe 6/6、shop 4/4、health 13/13、dx 2 skip |
|
|
|
|
|
+| 189:4090 | `sh_1cb439b16…` | done | admin-desktop E2E | 1.4m | `C:\code\cfc\tests` | **5/5(EXIT=0)**;节点 HEAD `3c3d4b0a5`、spec blob `4703d73fb` 与本机完全一致 → 跨节点可比 |
|
|
|
|
|
+| 251:4096 | shell 直连(`setsid nohup` + 落盘) | done | langgraph pytest | 126.67s | `/sc-data/cfc/cfc-langgraph` | **41/51**;节点 HEAD `722de8f37` = 本机 |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 1. 历史审查记录(对照,非本次结论依据)
|
|
|
|
|
+
|
|
|
|
|
+- **对象**:cfc 周期性自动化闭环,R148–R156 连续稳态轮。上一轮 **R155 @ 23:01** 结论 **⛔ 有条件通过**(G7 langgraph 3 红 + EXIT=124 消失、后端/前端/管理端采信 R153/R154)。
|
|
|
|
|
+- **遗留缺口**(沿用):后端 17 红存量、cfc-web 覆盖率 9.95%<20%(G7)、langgraph 上游 429/401、安全/性能/依赖扫描未授权、CI 硬门禁必红(G11)、admin.referral(TR-25)零覆盖、dx-bridge 未部署(G14)。
|
|
|
|
|
+- **本轮相对 R155 的整改核查**:R155 起「后端采信」已累计 1 轮 → 本轮**改回全量实跑**(`mvn -o -B clean test`,61:02)以排除窗口内隐式回归。结果与 R154 逐类逐例一致,**采信期无漏检**。
|
|
|
|
|
+- **本次非首次审查**,结论以本轮实际取证为准。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 2. 项目画像速览(只读)
|
|
|
|
|
+
|
|
|
|
|
+- **业务**:浠艾福 XAF 家庭成长平台(家长端/孩子端/规划师端 + 管理端 + 独立商城 + AI 解析)。
|
|
|
|
|
+- **技术栈**:cfc-backend(Spring Boot 2.7.18 / Java 8 / MyBatis-Plus,9082)、cfc-web(Vue 2 + Element UI 管理端,8082)、cfc-frontend(uni-app 微信小程序)、cfc-langgraph(FastAPI + LangGraph + ChromaDB,9000)、`dan/danshop`(8888)。
|
|
|
|
|
+- **关键路径**:JWT 鉴权 `/api/**`(`JwtInterceptor`,8 个公开路径)、统一 `@PostMapping`(`@GetMapping` 仅存 8 处、`@Put/@DeleteMapping` 0 处)、`AiGateway` 调 LangGraph、健康报告 PDF 上传解析、五维能量、测评订单、家庭关系与邀请、商城价格排序。
|
|
|
|
|
+- **规模**:后端控制器 **366** 个、`@RestController` 366 个;测试源 **353** 份 / `@Test` **2935**;编译产出 `*.class` **2330**;浏览器 spec:`tests/e2e` 75 份 + `tests/e2e-live` 5 份。
|
|
|
|
|
+- **测试现状**:单元/组件/契约/集成资产齐备(后端 347 类可执行);E2E 走「线上只读浏览器 + 接口契约」双轨;**无 JaCoCo**(`pom.xml` 无 jacoco 插件)→ 后端覆盖率无法度量;CI 存在(`.gitlab-ci.yml`)但硬门禁必红。
|
|
|
|
|
+- **风险点**:① 后端测试装置使全量耗时 61:02(34 次 Spring 上下文 + 每次重跑 `DatabaseInitializer` 全量迁移);② langgraph 依赖单一免费额度上游(429 即整片红);③ 管理端匿名访问鉴权门缺失;④ 根级黑盒套件强依赖本机 9082。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 3. 20 类测试覆盖矩阵(三态)
|
|
|
|
|
+
|
|
|
|
|
+| # | 测试类型 | 状态 | 本轮证据 |
|
|
|
|
|
+|---|----------|------|----------|
|
|
|
|
|
+| 1 | 单元测试 | **已实测** | 后端 347 类 / 2946 例(含单测包 `com.etotem.cfc.unit`、`service`、`util`);cfc-web 116/116;cfc-frontend 617 |
|
|
|
|
|
+| 2 | 组件测试 | **已实测** | `cfc-frontend/__tests__/pages/**`、`cfc-web/src/__tests__/views/**`(含 `FamiliesPlanEntry.spec.js` 等) |
|
|
|
|
|
+| 3 | 集成测试 | **已实测** | `com.etotem.cfc.integration.*`(EnergySystemFlow 7、DimensionRegistryMap 7、GuideModule 4、ArticleWorkflow…) |
|
|
|
|
|
+| 4 | 接口 API 测试 | **已实测** | `tests/e2e-live/shop-sort-api.spec.js` 4/4、`health-contract.spec.js` 13/13(直连 `/api`)、`tests/e2e/api` 契约集 |
|
|
|
|
|
+| 5 | 系统/端到端 | **已实测** | 浏览器 **28/28**(189 admin 5/5 + 本机 fe 6/6、shop 4/4、health 13/13) |
|
|
|
|
|
+| 6 | 冒烟测试 | **已实测** | langgraph@251 51 例 126.67s 正常收尾;站点 `/admin` `/frontend` 302→200 |
|
|
|
|
|
+| 7 | 回归测试 | **已实测** | 后端 17 红与 R154 逐类逐例一致(零漂移第 14 次);浏览器 28/28 连续零漂移;前端 3 红集合不变 |
|
|
|
|
|
+| 8 | 探索性测试 | **待核实** | 无 charter 文档、无会话记录(`tests/exploratory` 不存在) |
|
|
|
|
|
+| 9 | 契约测试 | **已实测** | `*ContractTest`(DimensionRegistryMap 3 红、UserServiceWechatLoginContract 1 红、TeamProfitCronContract 1 红);dx-bridge 2 例按 404 skip |
|
|
|
|
|
+| 10 | 性能测试 | **未授权未执行** | 仓库无 k6/JMeter/Locust 脚本;压测属 execute 档(需联网 + 打目标环境) |
|
|
|
|
|
+| 11 | 可靠性测试 | **已实测(失败面)** | 34 次 Spring 上下文重跑 + langgraph 429 熔断面;`AiGateway` 熔断/超时存在但无专项可靠性用例 |
|
|
|
|
|
+| 12 | 安全测试 | **未授权未执行** | 无 semgrep/DAST 配置;仅做鉴权契约 5/5(本机可达性)与匿名探针(B-142-1) |
|
|
|
|
|
+| 13 | 依赖漏洞扫描 | **未授权未执行** | 无 `dependency-check`/SBOM/`.sarif`;需联网拉库 |
|
|
|
|
|
+| 14 | 兼容性测试 | **待核实** | 无浏览器/机型矩阵;Playwright 仅 chromium(1440×900 / 375×812) |
|
|
|
|
|
+| 15 | 可用性测试 | **待核实** | 无可用性指标与用户测试记录 |
|
|
|
|
|
+| 16 | 无障碍测试 | **未发现** | `tests/**` 无 `aria`/`axe-core` 引用(0 命中) |
|
|
|
|
|
+| 17 | 测试覆盖率 | **已实测(部分未达标)** | cfc-web Lines **9.95%** / Branch 6.06% / Funcs 7.48%(<20% 不达标);cfc-frontend Lines **53.57%** / Branch 28.96%;**后端无 JaCoCo** |
|
|
|
|
|
+| 18 | 质量指标 | **已实测** | 全量 **3790 / 3726 = 98.31%**(剔 skip 98.78%);红 46 / 跳 18;新增 7 例全绿 |
|
|
|
|
|
+| 19 | QA 流程 | **待核实(负向证据)** | CI 存在但 `BACKEND_OBSERVED_CLASSES` 漏拦 3 个当前红类 → `backend-blocking-junit` 必然失败 |
|
|
|
|
|
+| 20 | 全项目代码审查 | **已实测(抽样)** | 本轮定位 `schema.sql:5354` DDL 无效、`NutritionAgeDosage` 实体/表列不一致、`NutritionProductService:48` 死注入;未做全量逐文件审查(方案排除) |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 4. 执行范围 / 用例总数·通过·失败
|
|
|
|
|
+
|
|
|
|
|
+| 模块 | 命令 | 总数 | 通过 | 失败 | 跳过 | 结果 |
|
|
|
|
|
+|------|------|------|------|------|------|------|
|
|
|
|
|
+| **cfc-backend 全量** | `cd cfc-backend && mvn -o -B clean test`(JDK1.8.0_25 + Maven 3.6.1) | **2946** | **2925** | **17** | 4 | **99.29%**(剔 skip 99.42%),**61:02**,`BUILD FAILURE`(预期:红例存量) |
|
|
|
|
|
+| **浏览器 admin@189** | `playwright test -c playwright.config.live.js --project=admin-desktop` | 5 | 5 | 0 | 0 | **EXIT 0 ✅ 1.4m** |
|
|
|
|
|
+| **浏览器 frontend(本机)** | `--project=frontend-mobile` | 6 | 6 | 0 | 0 | **EXIT 0 ✅ 1.0m** |
|
|
|
|
|
+| **浏览器 shop(本机)** | `--project=shop-api` | 4 | 4 | 0 | 0 | **EXIT 0 ✅ 15.4s** |
|
|
|
|
|
+| **浏览器 health(本机)** | `-c playwright.config.health.js` | 13 | 13 | 0 | 0 | **EXIT 0 ✅ 14.6s** |
|
|
|
|
|
+| **浏览器 dx-bridge(本机)** | `--project=dx-bridge` | 2 | 0 | 0 | 2 | EXIT 0;两端点 **404** → 按设计 skip(B-DX-1 第 16 轮) |
|
|
|
|
|
+| **langgraph@251** | `.venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py` | 51 | **41** | **10** | 0 | **10 failed / 41 passed / 126.67s**(R155 为 48/3 → **恶化 7 例**) |
|
|
|
|
|
+| cfc-web (Jest) | `npx jest --coverage` | 116 | 116 | 0 | 0 | **EXIT 0 ✅ 179.2s**(17 套件) |
|
|
|
|
|
+| cfc-frontend (Jest) | `npx jest --coverage` | **624** | **609** | 3 | 12 | EXIT 1;3 红 = 预期 RED(S-cfc-138 AC-R1/R2 + S-cfc-134 RED-A7)集合不变;含本轮新增 7 例;**合入后复验** 47.4s |
|
|
|
|
|
+| 根级黑盒 (Jest) | `cd tests && npx jest -c jest.config.js` | 23 | 7 | 16 | 0 | EXIT 1;16 红全 `fetch failed`(本机 9082 未启动,B-36 第 50 轮) |
|
|
|
|
|
+| **合计** | — | **3790** | **3726** | **46** | **18** | **98.31%**(剔 skip 98.78%) |
|
|
|
|
|
+
|
|
|
|
|
+**红例分布(46)**:后端 17 + 根级 16 + langgraph 10 + 前端 3。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 5. 关键变化(vs R155)
|
|
|
|
|
+
|
|
|
|
|
+| 维度 | R155 | **R156** | 变化 |
|
|
|
|
|
+|------|------|----------|------|
|
|
|
|
|
+| 后端全量 | 采信 R154:2946/2925/17 | **实跑:2946/2925/17(347 类,61:02)** | ✅ 零漂移(第 14 次),采信期无漏检 |
|
|
|
|
|
+| langgraph@251 | 48 过 / 3 红 | **41 过 / 10 红** | ❌ **恶化 7 例**(唯一实质变化) |
|
|
|
|
|
+| 浏览器 | 28/28 + 2 skip | **28/28 + 2 skip** | ✅ 零漂移 |
|
|
|
|
|
+| cfc-web | 采信 116/116 | **实跑 116/116** | ✅ 零漂移 |
|
|
|
|
|
+| 前端功能合入 | — | **`3d35ab714` 会员门控(10 文件)** | ⚠️ 跑测窗口内落库 → 已做增量复验 + 补 7 例(§5.1) |
|
|
|
|
|
+| cfc-frontend | 采信 602/3/12 | **实跑 609/3/12(624 总)** | ✅ 零漂移 + 新增 7 例全绿(3 红集合不变) |
|
|
|
|
|
+| 根级黑盒 | 7/16 | **7/16** | 持平(B-36 第 50 轮) |
|
|
|
|
|
+| 全量通过率 | 98.91%(R155 口径) | **98.31%**(3790/3726) | ❌ 下行,全部由 langgraph 承担(分母 +7 为新增用例) |
|
|
|
|
|
+| 门禁结论 | 有条件通过 | **不通过** | 收紧(G7 由 ✅ 改善态回落为 ❌ 阻断) |
|
|
|
|
|
+
|
|
|
|
|
+### 5.1 跑测窗口内功能合入 → 增量复验(新增)
|
|
|
|
|
+
|
|
|
|
|
+跑测期间远端合入 `3d35ab714 merge(miniprogram): 聊天/消息类入口按有效会员隐藏`(`cfc-frontend` 10 文件 +124/−29,含新文件 `utils/membershipGate.js`)。按纪律**不把窗口内合入当成「零变更」**,收尾 rebase 至 `c7d921bcf` 后重跑前端全量:
|
|
|
|
|
+
|
|
|
|
|
+| 项 | 结果 |
|
|
|
|
|
+|---|---|
|
|
|
|
|
+| 前端全量复验 | **624 例 / 609 过 / 3 红 / 12 跳**(47.4s,EXIT 1) |
|
|
|
|
|
+| 红例集合 | `signature.consignee`(AC-R1/AC-R2)+ `growthHistory.dayGroupView`(RED-A7)—— **与合入前完全一致 → 功能合入零回归** |
|
|
|
|
|
+| 覆盖率变化 | Lines 53.57% → **53.57% 同档**;Stmts 46.16→**46.25**、Branch 28.96→**29.16**、Funcs 18.75→**18.95**(新用例带来的小幅提升) |
|
|
|
|
|
+| 新增用例 | `cfc-frontend/__tests__/utils/membershipGate.test.js` **7 例(TC-MG-U01~U07)全绿** |
|
|
|
|
|
+| 覆盖缺口闭合 | `membershipGate.js` 合入时**零测试、零用例编号**;本轮补齐 4 条契约分支(无 token 不发请求 / `isActive===true` / 非布尔真值不误放行 / 异常 fail-closed) |
|
|
|
|
|
+
|
|
|
|
|
+> 补测设计要点:该函数唯一判据是 `data.isActive === true`(**严格等值**),所以专门加了 `isActive: 1` 与 `isActive: 'true'` 两个反向用例——若后端把布尔退化成数字/字符串,用例会立刻转红而不是**静默放行非会员**。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 6. langgraph 10 红根因定性(**环境红,非代码回归**)
|
|
|
|
|
+
|
|
|
|
|
+| 失败文件 | 例数 | 失败表征 | 日志证据 |
|
|
|
|
|
+|---|---|---|---|
|
|
|
|
|
+| `tests/test_analyze.py` | 1 | `test_analyze_missing_report` → `assert 500 == 200` | `RateLimitError 429 AgnesAI_error`(analyze 3.66s) |
|
|
|
|
|
+| `tests/test_auto_tag.py` | 5 | `endpoint_responds` / `valid_format` / `content_relevance` / `short_content` / `empty_content` → `assert 500 == 200` | 每次 chat 调用 9~10s 后抛 429 |
|
|
|
|
|
+| `tests/test_intent.py` | 4 | `classify_analysis/recommend/mind/health` → `assert <Intent...>` ≠ 期望 | `intent_classifier.py:62` 429 后**静默兜底 `chat`**(B-134-4 延续未修) |
|
|
|
|
|
+
|
|
|
|
|
+- **上游原文**:`"You have used up today's text quota and are now limited to 1 request every 3 minutes."` / `"You've reached the API rate limit for free users."`(429,AgnesAI)。
|
|
|
|
|
+- **叠加 401**:`chat_graph.py:148 召回记忆失败: 401 Authentication Fails, Your api key: ****ab12 is invalid`(记忆召回 key 失效,非本轮新增)。
|
|
|
|
|
+- **服务本身健康**:同窗口 `251:9000/health` = **200**;说明「服务活、仅 LLM 面被配额掐断」——**不可用单一指标否定另一面**。
|
|
|
|
|
+- **结论**:10 红全部落在 LLM 调用面,**无一条为代码回归**;但按门禁纪律**红例即红例**,G7/G2 照实判 ❌。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 7. SRS/需求变更感知(G12)
|
|
|
|
|
+
|
|
|
|
|
+| 检查项 | 结果 |
|
|
|
|
|
+|---|---|
|
|
|
|
|
+| `docs/superpowers/specs/*.md` | **201** 份,窗口 `abf53aa0d..722de8f37` **零变更** |
|
|
|
|
|
+| `tests/test-cases/*.md` | **15** 份,零变更 |
|
|
|
|
|
+| `docs/superpowers/api/API_REFERENCE.md` | 零变更 |
|
|
|
|
|
+| 场景/用例度量(官方脚本 `test_report_metrics.py --scene`) | 场景 **215**;映射到 TC **155 = 72.1%**;场景 ID 字面出现在 spec **33 = 15.3%**;TC **837**;异常流 TC **498 = 59.5%**;有可执行锚点 **104**(扫描资产 523) |
|
|
|
|
|
+| 场景缺口台账 | `docs/tdd/test/scenario-gap-backlog.csv` **98** 条缺口(A 真缺口·需补用例为主) |
|
|
|
|
|
+| 实现落地(非 SRS 文档变更) | **1 项**:`3d35ab714` 会员门控(`utils/membershipGate.js` + 9 个页面入口),合入时**零测试** → 本轮补 **7** 条用例(TC-MG-U01~U07) |
|
|
|
|
|
+| 判定 | **G12 ✅ 合规**:SRS 文档零变更 → 不因文档变更改用例;**实现变更按纪律补用例**(7 条,见 §5.1);`admin.referral`(TR-25)仍为零用例零锚点(遗留) |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 8. 五要素问题清单
|
|
|
|
|
+
|
|
|
|
|
+### ① 后端 17 红存量(P0 · 研发)
|
|
|
|
|
+- **① 问题描述**:`mvn clean test` 全量 2946 例中 16F+1E,10 个类;其中 `UserServiceWechatLoginTest`、`UserServiceWechatLoginContractTest`、`TeamProfitCronContractTest` **不在 CI 排除清单**内。
|
|
|
|
|
+- **② 测试 bug 点**:`cfc-backend/target/surefire-reports/`:`EnergySystemFlowTest`(7例/6F)、`DimensionRegistryMapContractTest`(7/3F)、`GuideModuleIntegrationTest`(4/1E)、`OrchestrationEngineTest`(8/1F)、`OrchestrationIntegrationTest`(7/1F)、`MembershipPaySwitchTest`(6/1F)、`PaymentServiceORDRoutingTest`(3/1F)、`UserServiceWechatLoginTest`(5/1F)、`UserServiceWechatLoginContractTest`(6/1F)、`TeamProfitCronContractTest`(22/1F)。
|
|
|
|
|
+- **③ 最优修改方案**:按类归因修:① 集成夹具类(EnergySystem/GuideModule)改为 `@Transactional` 回滚 + 固定种子数据;② 契约类(DimensionRegistryMap/WechatLoginContract/TeamProfitCron)由产品裁决契约后同步实现与断言;③ 装置类(Orchestration/MembershipPay/PaymentORD)去 `Thread.sleep`、外部调用打桩。
|
|
|
|
|
+- **④ 修改目的**:消除长期红底噪,使 G13(≤17)可收敛至 0,并为 G2(红例 ≤20)腾出额度。
|
|
|
|
|
+- **⑤ 闭环**:修后 `mvn -o -B clean test` 该 10 类 0 红 + 全量 0 红,连续 2 轮零漂移 → 销号。
|
|
|
|
|
+
|
|
|
|
|
+### ② CI 硬门禁漏拦 3 个红类(P0 · 研发,B-152-1 延续)
|
|
|
|
|
+- **① 问题描述**:`.gitlab-ci.yml` 的 `BACKEND_OBSERVED_CLASSES`(33 类)未包含本轮实测红类 `UserServiceWechatLoginTest`、`UserServiceWechatLoginContractTest`、`TeamProfitCronContractTest`。
|
|
|
|
|
+- **② 测试 bug 点**:`.gitlab-ci.yml:61`。
|
|
|
|
|
+- **③ 最优修改方案**:把上述 3 类加入 `BACKEND_OBSERVED_CLASSES`;或更优——改为「运行期生成红类快照」而非静态白名单。
|
|
|
|
|
+- **④ 修改目的**:让 `backend-blocking-junit` 从「必然失败」变为可信门禁,恢复 G11。
|
|
|
|
|
+- **⑤ 闭环**:CI 流水线跑绿一次 + 人为移除一类实现使其红、验证门禁能拦住 → 双证销号。
|
|
|
|
|
+
|
|
|
|
|
+### ③ CI 排除清单含 26 个已转绿类(P1 · 研发,B-152-2 延续)
|
|
|
|
|
+- **① 问题描述**:33 类白名单中 **26 类**本轮实测全绿(如 `AuthControllerTest` 239s 全绿、`ProductControllerTest`、`StatsControllerTest`、`WishControllerTest` 等),仍被永久排除 → 硬门禁覆盖被人为缩小。
|
|
|
|
|
+- **② 测试 bug 点**:`.gitlab-ci.yml:61`(与 ② 同一行,缺陷方向相反)。
|
|
|
|
|
+- **③ 最优修改方案**:按 R156 实测快照重建白名单(仅保留 10 个红类),并把「白名单衰减」写入 CI 注释要求每轮复核。
|
|
|
|
|
+- **④ 修改目的**:恢复这 26 类的 CI 阻断力,避免「绿了也测不到」。
|
|
|
|
|
+- **⑤ 闭环**:清单重建后 CI 一次跑绿 + 抽查 3 类故意改坏能拦住。
|
|
|
|
|
+
|
|
|
|
|
+### ④ `nutrition_age_dosage` 三重不一致(P2 · 研发,B-145-1 未修 + B-156-1 新增)
|
|
|
|
|
+- **① 问题描述**:`schema.sql:5354` 建表语句含 `INDEX idx_product (product_id)`,而表定义**没有 `product_id` 列** → 建表恒失败;本轮 34 次 Spring 上下文启动中 **34/34 失败**(`SQLSyntaxErrorException: Key column 'product_id' doesn't exist`),`DatabaseInitializer` catch 后仍打「数据表检查完成」,**该表从未创建成功**。追加发现:实体 `NutritionAgeDosage` 声明 `updateTime`(→ `update_time`),而 DDL 无此列;`NutritionProductService:48` 注入 `ageDosageMapper` 但**全类零调用**(死注入)。
|
|
|
|
|
+- **② 测试 bug 点**:`cfc-backend/src/main/resources/schema.sql:5354`;`cfc-backend/src/main/java/com/etotem/cfc/entity/NutritionAgeDosage.java:33-34`;`cfc-backend/src/main/java/com/etotem/cfc/service/NutritionProductService.java:48`。
|
|
|
|
|
+- **③ 最优修改方案**:① 删 `INDEX idx_product (product_id)`(或补 `product_id BIGINT` 列);② DDL 补 `update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`;③ 按 AGENTS.md 纪律在 `DatabaseInitializer.runMigrations()` 增加幂等迁移(`ensureColumn("nutrition_age_dosage","update_time",…)`),**并同步 schema.sql**;④ 死注入删除或补齐调用方。
|
|
|
|
|
+- **④ 修改目的**:消除每次启动必现的 DDL 异常(也污染全量日志与耗时);同时避免「表建好后运行期 `Unknown column 'update_time'`」的第二层失败。
|
|
|
|
|
+- **⑤ 闭环**:`grep -c SQLSyntaxErrorException` 归零 + 启库后 `SHOW CREATE TABLE nutrition_age_dosage` 成功 + 剂量建议接口实调 200 → 销号。
|
|
|
|
|
+
|
|
|
|
|
+### ⑤ langgraph 10 红(P0 · 运维 + 研发,B-142-2 恶化 / B-134-4 未修)
|
|
|
|
|
+- **① 问题描述**:51 例 10 红,全部为 LLM 面 429(免费额度耗尽)+ 401(记忆召回 key 失效);`intent_classifier.py:62` 把 429 静默兜底成 `chat`,使 4 条分类用例从「上游故障」伪装成「分类错误」。
|
|
|
|
|
+- **② 测试 bug 点**:`tests/test_analyze.py::test_analyze_missing_report`、`tests/test_auto_tag.py`(5 例)、`tests/test_intent.py`(4 例);`cfc-langgraph/app/agents/intent_classifier.py:62`;`app/graphs/chat_graph.py:148`。
|
|
|
|
|
+- **③ 最优修改方案**:① 运维为 251 的 AgnesAI key 提额/换付费 key;② `intent_classifier` 改为显式降级(抛错或返回 `degraded=true`)而非默认 `chat`;③ 修补 `chat_graph` 记忆召回 key;④ 测试侧为 LLM 依赖用例加 `pytest.mark.env_skip`(429 时 skip 而非 fail),避免环境红污染通过率。
|
|
|
|
|
+- **④ 修改目的**:让 langgraph 套件能反映代码质量而非配额状态,恢复 G7(≥46/51)。
|
|
|
|
|
+- **⑤ 闭环**:连续 2 轮 51/51 全绿(或红例全为显式 env_skip)→ 销号。
|
|
|
|
|
+
|
|
|
|
|
+### ⑥ 根级黑盒 16 红:本机 9082 不可达(P1 · 测试装置,B-36 第 50 轮)
|
|
|
|
|
+- **① 问题描述**:`tests/` 根级 Jest 23 例中 16 红,全部 `fetch failed`(`/api/admin-auth/login-by-password`、`/api/guide/plans/family-list`、`/api/admin/tasks/stats` 等直连 `127.0.0.1:9082`)。
|
|
|
|
|
+- **② 测试 bug 点**:`tests/integration/plan-chain.spec.js`、`tests/integration/mini-games-api.spec.js`。
|
|
|
|
|
+- **③ 最优修改方案**:加 `beforeAll` 探活 9082,不可达则 `describe.skip` 并输出 `BACKEND_UNAVAILABLE`(与 dx-bridge 的 404→skip 同构);或在 CI 中以 service 容器拉起后端后再跑。
|
|
|
|
|
+- **④ 修改目的**:把「环境缺失」与「功能失败」分离,避免 16 条永久红把通过率压低 0.4pt 且掩盖真实回归。
|
|
|
|
|
+- **⑤ 闭环**:无后端时 16 例转 skip(红 0);有后端时全绿 → 双态各验一次销号。
|
|
|
|
|
+
|
|
|
|
|
+### ⑦ 前端 3 红(P2 · 研发,预期 RED)
|
|
|
|
|
+- **① 问题描述**:`signature.consignee` 2 例(AC-R1 确认回调方法缺失、AC-R2 模板缺 `HandSignature` 段)、`growthHistory.dayGroupView` 1 例(RED-A7:3 条无效日期记录中 1 条未被跳过,`flat.length` 实测 **7**、期望 **6**)。
|
|
|
|
|
+- **② 测试 bug 点**:`cfc-frontend/__tests__/pages/signature/signature.consignee.test.js`、`cfc-frontend/__tests__/pages/growth-main/growthHistory.dayGroupView.test.js:287`。
|
|
|
|
|
+- **③ 最优修改方案**:① 交付 `consignee-edit.vue` 的确认回调与 `HandSignature` 内嵌段;② `groupByDate` 对 `checkinDate` 解析失败且无 `recordDate` 兜底的记录直接跳过(不改写输入)。
|
|
|
|
|
+- **④ 修改目的**:让契约测试转绿,同时修掉「脏日期记录泄漏进分组」的真实体验缺陷。
|
|
|
|
|
+- **⑤ 闭环**:前端 jest 3 红→0 且连 2 轮 0 红 → 销号(S-cfc-138 / S-cfc-134)。
|
|
|
|
|
+
|
|
|
|
|
+### ⑧ 管理端匿名访问鉴权门缺失(P1 · 安全,B-142-1 延续未修)
|
|
|
|
|
+- **① 问题描述**:匿名 `POST /api/admin/families/overview` → **HTTP 200 + body `code:400`**(`请求参数格式错误`);对照组 `/api/energy/overview` 等 5 个接口均 401。说明 `/api/admin/**` 未纳入 JWT 强校验,仅靠参数校验拦住。
|
|
|
|
|
+- **② 测试 bug 点**:`cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java`(`LOGIN_REQUIRED_PATHS` 未覆盖 `/api/admin/`)。
|
|
|
|
|
+- **③ 最优修改方案**:`LOGIN_REQUIRED_PATHS` 增 `/api/admin/`,admin 族控制器补 `role=admin` 校验;补一条「匿名 → 401/403」浏览器/接口契约用例。
|
|
|
|
|
+- **④ 修改目的**:消除越权面;顺带把「200 + 业务错误码」这种伪正常态变成可断言的红线。
|
|
|
|
|
+- **⑤ 闭环**:匿名探测返回 401/403(非 200)+ 新增契约用例常绿 → 销号。
|
|
|
|
|
+
|
|
|
|
|
+### ⑨ 后端全量耗时 61:02 的装置放大(P3 · 效率,B-152-3 延续)
|
|
|
|
|
+- **① 问题描述**:347 类耗时 61:02,其中 **34 次** `@SpringBootTest` 上下文启动,每次重跑 `DatabaseInitializer` 全量迁移(日志 `DatabaseInitializer` 命中 10715 行、`cfc-scheduler` 22365 行 = 全日志 75346 行的 **29.7%**);最慢类 `UserServiceFamilyNameLinkTest` 331s、`GuidePackageServiceTest` 307s、`GuideRolePermissionTest` 258s、`AuthControllerTest` 239s。
|
|
|
|
|
+- **② 测试 bug 点**:`CfcApplication:12 @EnableScheduling` + 缺 `src/test/resources/application-test.yml`(无 `spring.task.scheduling.pool.size=1` 与 `DatabaseInitializer` 开关)。
|
|
|
|
|
+- **③ 最优修改方案**:① 测试 profile 关闭 `DatabaseInitializer` 与 `@EnableScheduling`;② 统一 `@SpringBootTest(webEnvironment=NONE)` + `@DirtiesContext` 策略合并上下文;③ 引入 JaCoCo 顺带产出覆盖率。
|
|
|
|
|
+- **④ 修改目的**:把全量从 61 分钟压回 30 分钟量级,让全量可在 CI 每提交运行(G11 前置条件),并解锁 G7 后端覆盖率度量。
|
|
|
|
|
+- **⑤ 闭环**:连续 2 轮全量 <35:00 且红例集合不变 → 销号。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 9. 覆盖缺口清单
|
|
|
|
|
+
|
|
|
|
|
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
|
|
+|---|---|---|---|---|---|
|
|
|
|
|
+| 后端覆盖率不可度量 | `pom.xml` 无 JaCoCo(0 命中) | 无法证明单测有效性 | 接 jacoco-maven-plugin + 阈值门禁 | **P0** | 出首份报告并设 `line≥60%` 门禁 |
|
|
|
|
|
+| cfc-web 覆盖率 | Lines 9.95% / Branch 6.06% | 管理端回归靠人眼 | 按 `views/**` 高价值页补组件测试 | P1 | 覆盖率 ≥20% 连续 2 轮 |
|
|
|
|
|
+| 场景→用例映射 | 215 场景,映射 TC 155(72.1%),有锚点 104 | 40 条场景无自动化 | 按 `scenario-gap-backlog.csv` 98 条逐条补 | P1 | 映射率 ≥90% |
|
|
|
|
|
+| 安全测试 / 依赖漏洞 | 未授权未执行(0 配置) | 漏洞不可见 | semgrep + OWASP dependency-check(需联网授权) | P1 | 高危 0 |
|
|
|
|
|
+| 性能 / 可靠性 | 无脚本 | 全量耗时劣化无基线 | k6 冒烟 + `/health` P95 基线 | P2 | 基线入库 + 回归对比 |
|
|
|
|
|
+| 兼容性 / 无障碍 | chromium 单浏览器、无 axe | 小程序机型/无障碍盲区 | Playwright 多 viewport + axe-core 冒烟 | P2 | 3 viewport × 关键 5 页 |
|
|
|
|
|
+| 探索性测试 | 无 charter | 脚本外缺陷遗漏 | 每轮 1 个 30 分钟 charter 并落记录 | P3 | charter + 缺陷单双证据 |
|
|
|
|
|
+| `admin.referral`(TR-25) | 0 用例 0 锚点 | 功能黑盒 | 补接口契约 + 后台页面 E2E | P2 | 2 条用例常绿 |
|
|
|
|
|
+| 会员门控页级 E2E | 函数级已补 7 例,**页面级 0 例**(9 个入口页未验渲染隐藏) | 入口可见性只在函数层受保护,模板层漏改不会被发现 | Playwright 游客态断言「聊天/消息」入口不可见 + 会员态可见 | P1 | 2 条 E2E 常绿 |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 10. 门禁矩阵(14 条)
|
|
|
|
|
+
|
|
|
|
|
+| 门 | 阈值 | 本轮实测 | 状态 |
|
|
|
|
|
+|----|------|----------|------|
|
|
|
|
|
+| G1 全量通过率 | ≥95% | **98.31%** | ✅ |
|
|
|
|
|
+| G2 红例数 | ≤20 | **46**(be17 + 根16 + lg10 + fe3) | ❌ |
|
|
|
|
|
+| G3 前端预期 RED | 已知 3 | **3** | ✅ |
|
|
|
|
|
+| G4 cfc-web 零红 | 0 | **0(实跑 116/116)** | ✅ |
|
|
|
|
|
+| G5 编译 | EXIT 0 | **testCompile 353 源 0 错;classes 2330** | ✅ |
|
|
|
|
|
+| G6 浏览器 E2E | ≥26/28 | **28/28** | ✅ |
|
|
|
|
|
+| G7 langgraph | ≥46/51 | **41/51** | ❌(由 ✅ 回落) |
|
|
|
|
|
+| G8 鉴权契约 | 5 端点全 401 | **5/5 = 401** | ✅ |
|
|
|
|
|
+| G9 安全/依赖扫描 | 中危 0 | 未授权未执行 | ❌ |
|
|
|
|
|
+| G10 节点派发 | ≥1 | **3**(189 + 251 + 本机) | ✅ |
|
|
|
|
|
+| G11 CI 固化 | 门禁可信 | **CI 存在但必红**(漏拦 3 类) | ❌ |
|
|
|
|
|
+| G12 SRS 变更→用例更新 | 合规 | 零变更 → 零写入 | ✅ |
|
|
|
|
|
+| G13 后端红例 | ≤17 | **17** | ⚠️ 临界(零漂移) |
|
|
|
|
|
+| G14 dx-bridge | 已部署 | **404** 未部署(2 例 skip) | ❌ |
|
|
|
|
|
+
|
|
|
|
|
+**门禁结论:⛔ 不通过** —— 正向 G1/G3/G4/G5/G6/G8/G10/G12;阻断 G2/G7/G9/G11/G14;G13 临界。
|
|
|
|
|
+较 R155「有条件通过」**收紧**,唯一动因是 langgraph 红例 3→10(G7 由改善态回落)。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 11. 变化点与推送决策
|
|
|
|
|
+
|
|
|
|
|
+- **测试结果有变化**:langgraph **48 过/3 红 → 41 过/10 红**(恶化 7 例);门禁结论由「有条件通过」转为「不通过」。
|
|
|
|
|
+- **其余全部零漂移**:后端 347/2946/2925/17(第 14 次)、浏览器 28/28、cfc-web 116/116、前端 602/3/12、根级 7/16。
|
|
|
|
|
+- **新增证据**:`nutrition_age_dosage` 34/34 建表失败(B-145-1 未修)+ 实体 `update_time` 缺列 + 死注入(B-156-1 新);后端全量装置损耗量化(B-152-3 延续)。
|
|
|
|
|
+- **决策**:按「测试结果有变化时提交到远程并通知研发」→ **commit + push `origin/cfclub` + 落地研发通知**。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 12. 复评条件
|
|
|
|
|
+
|
|
|
|
|
+1. **G7**:251 LLM key 提额 / 换付费 key → langgraph 连续 2 轮 ≥46/51 且红例为显式 env_skip。
|
|
|
|
|
+2. **G11**:`BACKEND_OBSERVED_CLASSES` 补 3 红类并剔除 26 绿类 → CI 一次跑绿。
|
|
|
|
|
+3. **G2/G13**:后端 17 红清零(先修 CI 漏拦的 3 类)。
|
|
|
|
|
+4. **G9**:授权联网后跑 semgrep + dependency-check,中危 0。
|
|
|
|
|
+5. **G14**:dx-bridge 2 端点上线,2 例转 401/403 断言。
|
|
|
|
|
+6. **G7 覆盖率**:后端接 JaCoCo 出首份报告;cfc-web ≥20%。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 13. 未实测项(如实登记)
|
|
|
|
|
+
|
|
|
|
|
+1. **后端覆盖率 / 变异测试**:`pom.xml` 无 JaCoCo、无 PIT → 未实测,只有执行结果无可信覆盖率。
|
|
|
|
|
+2. **安全测试(SAST/DAST/渗透)、依赖漏洞扫描**:execute 档需联网授权 → **未授权未执行**(G9 ❌)。
|
|
|
|
|
+3. **性能 / 压测 / 可靠性专项**:无脚本、需联网打目标环境 → **未授权未执行**。
|
|
|
|
|
+4. **登录态业务流 E2E**:无 `MACHINE_JSON_PATH` 凭据 → 仅做游客态可用性 + 鉴权契约,登录后业务流**待核实**。
|
|
|
|
|
+5. **兼容性 / 无障碍**:仅 chromium 单引擎、无 axe → **未发现**资产。
|
|
|
|
|
+6. **探索性测试**:无 charter 记录 → **待核实**。
|
|
|
|
|
+7. **langgraph 深度链路**(对话/RAG/whisper 全栈 `app.main`):本机不启、生产在 `ai.etotem.com.cn` → 仅验 251 节点最小服务套件。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 附录:本轮命令与日志
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 后端全量(实跑,61:02)
|
|
|
|
|
+cd d:/cfc/cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test # → _r156_backend.log
|
|
|
|
|
+# 管理端 / 小程序端 Jest
|
|
|
|
|
+cd d:/cfc/cfc-web && npx jest --coverage # → _r156_web.log
|
|
|
|
|
+cd d:/cfc/cfc-frontend && npx jest --coverage # → _r156_fe.log
|
|
|
|
|
+# 增量复验(窗口内功能合入后)
|
|
|
|
|
+cd d:/cfc/cfc-frontend && npx jest __tests__/utils/membershipGate.test.js && npx jest --coverage # → _r156_fe_inc.log
|
|
|
|
|
+# 根级黑盒
|
|
|
|
|
+cd d:/cfc/tests && npx jest -c jest.config.js # → _r156_root.log
|
|
|
|
|
+# 浏览器(189 单任务 / 本机单任务串行)
|
|
|
|
|
+node docs/tdd/tools/dispatch_189_admin.cjs # → _r156_189_admin.log
|
|
|
|
|
+cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile # → _r156_e2e_fe.log
|
|
|
|
|
+cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=shop-api # → _r156_e2e_shop.log
|
|
|
|
|
+cd d:/cfc/tests && npx playwright test -c playwright.config.health.js # → _r156_e2e_health.log
|
|
|
|
|
+cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=dx-bridge # → _r156_e2e_dx.log
|
|
|
|
|
+# langgraph@251
|
|
|
|
|
+node _r156_251.cjs kick && node _r156_251.cjs read # → /tmp/r156_pytest.log
|
|
|
|
|
+```
|