|
|
@@ -0,0 +1,376 @@
|
|
|
+# 测试负责人工作汇报(第 141 轮 · 2026-11-11 09:05 GMT+8)
|
|
|
+
|
|
|
+> 角色:cfc-tester(测试负责人)|执行档:**review(内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)**
|
|
|
+> 基线 HEAD:`d4626e5f1`(R140 闭环)→ 跑测期间分支/HEAD 未漂移,收尾 fetch 远端仍为 `d4626e5f1`(**源码零变更**,结果对该 SHA 有效)
|
|
|
+> 节点:`189:4090`=200(admin 实派 5/5)|`251:4096`=200(langgraph pytest 实派 51 例)|`251:9000 /health`=200|`204:4090`=000(B-95 第 12 轮)
|
|
|
+> 分工:**本机**=后端全量 + Jest×3 + 浏览器 fe/shop/health/dx|**189**=admin-desktop|**251**=langgraph pytest
|
|
|
+> 结论:⛔ **不通过(有条件)** —— 无回归;红例 90 全部为「预期 RED 契约 52 + 装置 16 + 环境 5 + 根级环境 16 + 遗留业务 1」,但 G1/G2/G7/G9/G11 仍未达阈值 → 触发提交远程 + 通知研发
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 基本信息(测试负责人模板)
|
|
|
+
|
|
|
+| 项目 | 内容 |
|
|
|
+|------|------|
|
|
|
+| 汇报人 | `cfc-tester`(测试负责人) |
|
|
|
+| 汇报周期 | 2026-11-11(第 141 轮,基线 `d4626e5f1`,跑测窗口 07:40–09:05) |
|
|
|
+| 负责模块/单元 | cfc-backend(全量实跑) · cfc-frontend(Jest) · cfc-web(Jest) · cfc-langgraph(pytest@251) · 浏览器 E2E(admin@189 / frontend / shop / health / dx@本机) · 根级黑盒 |
|
|
|
+| 执行档 | review(离线;未装依赖、未启停服务、未改生产代码) |
|
|
|
+
|
|
|
+### 0.1 测试用例建设与执行
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **本轮新增测试用例数** | `0` 个(测试侧) | 窗口对 `docs/superpowers/`(specs/test-cases/api)**零命中**(`git log abdb2d6de..HEAD -- docs/superpowers/` 空、`find -newermt` 空)→ 无 SRS 触发的用例编写(G12 ✅)。研发侧另有 5 个 RED 契约(S-cfc-132~136)计入被测集,见附录 A |
|
|
|
+| **本轮验证执行测试数** | `3773` 个 | 后端 2937(**全量实跑**)+ 前端 616 + 管理端 116 + 根级 23 + langgraph 51(251 实派)+ 浏览器 30 |
|
|
|
+| **用例通过率** | `99.11%`(后端)/ `97.14%`(全量) | 全量 PASS 3665 / FAIL 90 / SKIP 18 / 总 3773;剔 skip 口径 97.60% |
|
|
|
+| **新增覆盖资产** | `0` 项(测试侧) | 无 SRS 变更 → 不新增台账用例;沿用 15 份 test-cases(366 唯一 TC) |
|
|
|
+
|
|
|
+### 0.2 会话与任务分发
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **分派任务数** | `3` 个 | ① 本机:后端全量(62:00)+ 三套 Jest + 浏览器 4 套;② 189:admin-desktop E2E(1.2m);③ 251:langgraph pytest(137.10s) |
|
|
|
+| **恢复智能体会话数** | `0` 个 | 无中断/重建 |
|
|
|
+| **当前在用会话数** | `3` 个 | 本机 / 189=shell(done)/ 251=shell(done) |
|
|
|
+
|
|
|
+### 0.2b 各会话当前工作状态
|
|
|
+
|
|
|
+| 会话标签 | 会话 ID | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
|
|
|
+|----------|---------|----------|----------|---------------|----------|------|
|
|
|
+| 本机 | localhost | done | 后端全量 + Jest×3 + 浏览器 4 套 | — | `d:\cfc` | 后端 2937;web 116;fe 616;根级 23;浏览器 28+2跳 |
|
|
|
+| 189:4090 | `sh_1c7e2f98c001XE3Nouz5OCO2SA` | exited(0) | admin-desktop E2E | 78s | `...\tests` | **5/5 通过(1.2m)**,HEAD `2f74afb23`@`feature/s-cfc-70-star-digest`(**未 reset,保护他人工作区**) |
|
|
|
+| 251:4096 | shell 直连(kick 分离) | done | langgraph pytest | 137.10s | `/sc-data/cfc/cfc-langgraph` | HEAD `d4626e5f1`,**51 例 / 46 过 / 5 红** |
|
|
|
+| 204:4090 | — | unknown(000) | 失联(B-95 第 12 轮) | — | — | 不可用 |
|
|
|
+
|
|
|
+### 0.3 问题处置
|
|
|
+
|
|
|
+| 指标 | 数量 | 填写说明 |
|
|
|
+|------|------|----------|
|
|
|
+| **新测试发现问题数** | `3` 个 | ① **B-141-1(P1)** langgraph `tests/qna/test_graph.py` `ModuleNotFoundError: No module named 'src.qna'` → **整轮 pytest 收集期中断、0 例执行**(必须 `--ignore=tests/qna` 才能跑);② **B-141-2(P1)** 251 LLM 时延劣化:chat **100.03s**、analyze **46.99s**(R138 为 12.2s / 10.2s);③ **B-141-3(P2)** 站点根 `/` **502** 而 `/admin`、`/frontend` 均 200 |
|
|
|
+| **已解决测试相关问题数** | `0` 个 | 无自处置修复(本轮无测试侧装置缺陷) |
|
|
|
+| **待解决测试相关问题数** | `5` 类 | 后端 22 红(17 存量 + 5 新预期 RED)· 前端 47 预期 RED · langgraph 5 环境红(429/401)· 根级 16 环境红 · dx 2 端点 404 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 历史审查记录(仅作对照,不作为本轮结论依据)
|
|
|
+
|
|
|
+| 轮次 | 时间 | 后端全量 | langgraph | 浏览器 | 前端 Jest | 结论 |
|
|
|
+|---|---|---|---|---|---|---|
|
|
|
+| R138 | 11-11 06:10 | 344 类 / 2928 例 / 99.28%(实跑)/ 17 红 | 41 过 / 2 红(429)/ 43 例 | 28/28 + dx 2 skip | 47 红 / 9 跳 / 557 过 | 不通过(有条件) |
|
|
|
+| R139 | 11-11 06:31 | 采信 R138(零 src 变更) | 41 过 / 2 红 / 43 例 | 28/28 + dx 2 skip | 47 红 / 9 跳 / 551 过 | 不通过(有条件) |
|
|
|
+| R140 | 11-11 07:16 | **采信 R138**(连续第 2 轮采信) | 本地 venv 38 过 / 6 红(251 派发 CLOSED) | 28/28 + dx 2 skip | 47 红 / 12 跳 / 551 过 | 不通过(有条件) |
|
|
|
+| **R141(本轮)** | 11-11 09:05 | **346 类 / 2937 例 / 99.11%(实跑)/ 22 红** | **251 实派 46 过 / 5 红 / 51 例** | **28/28 + dx 2 skip** | 47 红 / 12 跳 / 557 过 | 不通过(有条件) |
|
|
|
+
|
|
|
+**本轮改善/变化(对照 R138 实跑基线)**
|
|
|
+
|
|
|
+| 项 | R138 | R141 | 判定 |
|
|
|
+|---|---|---|---|
|
|
|
+| 后端类/例 | 344 / 2928 | **346 / 2937** | +2 类 +9 例(含研发侧新增 2 个契约类) |
|
|
|
+| 后端红例 | 17(16F+1E) | **22(21F+1E)** | **+5 全为预期 RED**(`LangGraphErrorPropagateContractTest` 3 + `LangGraphExitHangContractTest` 2 = S-cfc-135/136);**存量 17 红逐类逐例一致 → 零回归** |
|
|
|
+| 后端通过率 | 99.28% | **99.11%** | −0.17pp(分母 +9、分子红 +5,纯新增契约稀释,非质量退化) |
|
|
|
+| langgraph | 43 例(251)/ 41 过 2 红 | **51 例(251实派)/ 46 过 5 红** | 用例 +8(`tests_contract/test_growth_report_contract.py` 8 例,S-cfc-135/136 落地);红 5 全为 **C 环境 429/401** |
|
|
|
+| 251 派发通道 | 可用 | **可用(B-55/B-139 撤销延续判定)** | 本轮 4096 直连 + kick 分离成功取回 stdout |
|
|
|
+| 前端 | 616 / 557 过 / 47 红 / 12 跳 | 同 | **零漂移**(47 红全为 S-cfc-132/133/134 预期 RED) |
|
|
|
+| 管理端 / 根级 | 116/116;7/16 | 116/116;7/16 | 零漂移(B-36 第 37 轮) |
|
|
|
+| 浏览器 | 28/28 + 2 skip | 28/28 + 2 skip | 零漂移,**G10 双节点连续通过** |
|
|
|
+
|
|
|
+> **R140「采信上轮」已纠正**:R139/R140 连续 2 轮未实跑后端,本轮按「采信不可连续超过 2 轮」纪律强制实跑,取得 346/2937/22 红,证明期间新增的 5 条契约红已被识别、存量 17 红无回归。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 项目画像(简版,SRS 口径)
|
|
|
+
|
|
|
+| 维度 | 本轮事实 |
|
|
|
+|---|---|
|
|
|
+| 业务定位 | 家庭教育成长平台(五维能量 · 健康报告 · 测评订单 · 家庭邀请 · 商城 · AI 管家) |
|
|
|
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus(Java 8,`9082`)· uni-app 小程序 Vue2 · Vue2+Element UI 管理端 · FastAPI+LangGraph+ChromaDB(`9000`) |
|
|
|
+| 模块结构 | `cfc-backend`(346 测试类/365 控制器) · `cfc-frontend`(40 套件/616 例) · `cfc-web`(17 套件/116 例) · `cfc-langgraph`(51 例) · `tests/`(浏览器 30 + 根级黑盒 23) |
|
|
|
+| 关键路径 | 登录鉴权(JWT+`/api/**` 拦截) → 家庭/成员 → 五维能量 → 健康报告上传解析 → 健康方案 → 商城订单/支付 → AI 对话/分析 |
|
|
|
+| 质量目标 | 全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
|
|
|
+| 风险点 | ① LLM 依赖型用例(429/401)不可控;② 预期 RED 契约占红例 58%;③ 后端全量耗时 62 分钟(无 CI 承载);④ 8 处 `@GetMapping` 违 AGENTS.md |
|
|
|
+| 待核实 | 覆盖率/JaCoCo、变异测试、压测、DAST/SCA、UAT/BDD、无障碍/多浏览器(均未授权或未安装) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
|
|
|
+
|
|
|
+| # | 测试类型 | 状态 | 证据(本轮) |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | ✅ 已实测 | 后端 2937 例(346 类,**62:00**);web 116;fe 616 |
|
|
|
+| 2 | 组件测试 | ✅ 已实测 | fe 40 套件 / web 17 套件(shallowMount 组件用例) |
|
|
|
+| 3 | 接口 API 测试 | ✅ 已实测 | 后端 MockMvc/直调覆盖 365 控制器面;langgraph 51 例(251 实派) |
|
|
|
+| 4 | 集成测试 | ✅ 已实测 | `integration.*` 实跑(EnergySystem 6 红、DimensionRegistryMap 3 红、GuideModule 1E) |
|
|
|
+| 5 | 系统/端到端 E2E | ✅ 已实测 | 浏览器 30 例:189 admin 5/5 + 本机 fe 6/6、shop 4/4、health 13/13、dx 2 skip |
|
|
|
+| 6 | 冒烟测试 | ✅ 已实测 | 浏览器 28 通过 + Jest 616 + 后端 2937 构成冒烟面 |
|
|
|
+| 7 | 回归测试 | ✅ 已实测 | 后端存量 17 红逐类逐例一致;web 116、fe 616、根级 23 零漂移 |
|
|
|
+| 8 | 探索性测试 | ⚠️ 待核实 | 无 charter 记录(沿用历轮结论) |
|
|
|
+| 9 | 验收 UAT / BDD | ⚠️ 待核实 | 无 cucumber/gherkin 执行证据 |
|
|
|
+| 10 | 性能测试 | ⛔ 未授权未执行 | 压测属 execute 档,需联网显式授权(本轮只记录真实时延,见 B-141-2) |
|
|
|
+| 11 | 可靠性测试 | ✅ 已实测(有缺陷) | 后端 62:00 无中断、346/346 XML 无沉默;**langgraph `tests/qna` 收集期中断整轮(B-141-1)** |
|
|
|
+| 12 | 安全测试(SAST/DAST/SCA/渗透) | ⛔ 未授权未执行 | 仅鉴权契约面:线上 **5/5 匿名 POST → 401**(G8 ✅);`@GetMapping` 违规 8 处 |
|
|
|
+| 13 | 兼容性测试 | ⚠️ 待核实 | 仅 Chromium 单引擎(1440×900 / 375×812) |
|
|
|
+| 14 | 可用性测试 | ⚠️ 待核实 | 无真实用户可用性证据 |
|
|
|
+| 15 | 无障碍测试 | ⚠️ 待核实 | 无 axe/WCAG 扫描 |
|
|
|
+| 16 | 覆盖率度量 | ⚠️ 已实测(低) | web 语句 ≈10%(17 套件);后端 JaCoCo 未接入 → 无行覆盖 |
|
|
|
+| 17 | 变异测试 | ⛔ 未发现 | 无 PIT / mutation 资产 |
|
|
|
+| 18 | 契约测试 | ✅ 已实测 | health 13/13、shop 4/4、dx 2(skip=404);后端契约 16 类(5 新预期 RED) |
|
|
|
+| 19 | QA 流程 | ⚠️ 待核实 | 141 轮闭环可追溯;门禁未脚本化 |
|
|
|
+| 20 | 覆盖率门禁/CI | ⛔ 未发现 | 仓库无 `.github/workflows/`,无 CI 全量 job(G11 ❌) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 本轮实测明细
|
|
|
+
|
|
|
+### 4.1 后端全量(本机实跑,62 分 00 秒)
|
|
|
+
|
|
|
+```
|
|
|
+JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B -f cfc-backend/pom.xml clean test
|
|
|
+→ Tests run: 2937, Failures: 21, Errors: 1, Skipped: 4 (BUILD FAILURE:仅测试红)
|
|
|
+```
|
|
|
+
|
|
|
+| 指标 | 值 |
|
|
|
+|---|---|
|
|
|
+| 测试类 / 用例 | **346 类 / 2937 例** |
|
|
|
+| 通过 / 红 / 跳过 | **2911 / 22 / 4** |
|
|
|
+| 通过率 | **99.11%**(剔 skip 99.25%) |
|
|
|
+| 产物完整性 | `target/classes` **2326 class**;surefire XML **346/346**,无静默丢失 |
|
|
|
+| 编译 | testCompile **352 源 0 错** |
|
|
|
+| 恒等式 | `@Test 2926 + 参数化/早退净增 11 = 2937`(误差 0);`@Disabled 4` = 本轮 4 skip |
|
|
|
+| 一致性 | 346 个 `Tests run` 行 − 1 条总结行 = 346 类 ✅ |
|
|
|
+| **基线纯度提示** | 346 类中有 **1 类 2 例**来自工作区**未跟踪**文件 `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleTagsContractTest.java`(声明包 `com.etotem.cfc.controller`,mtime 11-10 23:43,非 HEAD 内容,2 例全绿)。**对 HEAD 的纯度口径为 345 类 / 2935 例 / 99.11%**;该文件按「他人 WIP 零触碰」纪律**未提交**。 |
|
|
|
+
|
|
|
+**22 红三层归因**
|
|
|
+
|
|
|
+| 桶 | 例数 | 明细 | 定性 |
|
|
|
+|---|---|---|---|
|
|
|
+| 预期 RED(研发侧新增契约) | **5** | `LangGraphErrorPropagateContractTest` 3(429/401 静默 null 未传播)、`LangGraphExitHangContractTest` 2(`cfc-async-1`/`cfc-scheduler-4` 非 daemon) | S-cfc-135/136,**待研发 GREEN** |
|
|
|
+| 装置(A 类) | **16** | EnergySystem 6(Mock 链路 500)、DimensionRegistryMap 3(契约待裁决 P-9)、Orchestration 2、MembershipPay 1、PaymentORD 1、WechatLogin 2(`UserServiceWechatLoginTest` + `...ContractTest`)、TeamProfitCron 1 | 测试侧/契约裁决 |
|
|
|
+| 数据(C 类) | **1** | `GuideModuleIntegrationTest`:`platform_fee` Out of range(真库列定义) | 研发(DBA) |
|
|
|
+
|
|
|
+### 4.2 其余套件
|
|
|
+
|
|
|
+| 套件 | 命令/节点 | 结果 | 耗时 |
|
|
|
+|---|---|---|---|
|
|
|
+| cfc-web | `npx jest --ci`(本机) | **17 套件 / 116 通过 / 0 红** | 22.0s |
|
|
|
+| cfc-frontend | `npx jest --ci`(本机) | 40 套件 / **616 例:557 过 / 47 红 / 12 跳**;6 套件红 | 32.2s |
|
|
|
+| 根级黑盒 | `npx jest -c tests/jest.config.js --ci` | 3 套件 / **23 例:7 过 / 16 红**(全 `ECONNREFUSED 9082`) | 5.9s |
|
|
|
+| langgraph | **251 实派** `pytest -q --ignore=tests/test_chat.py --ignore=tests/qna` | **51 例:46 过 / 5 红** | 137.10s |
|
|
|
+| 浏览器 admin | **189 实派** `--project=admin-desktop` | **5/5**(含滑块 + 真实登录 + 核心菜单) | 1.2m |
|
|
|
+| 浏览器 frontend | 本机 `--project=frontend-mobile` | **6/6** | 54.4s |
|
|
|
+| 浏览器 shop | 本机 `--project=shop-api` | **4/4** | 10.6s |
|
|
|
+| 浏览器 health | 本机 `-c playwright.config.health.js` | **13/13** | 5.5s |
|
|
|
+| 浏览器 dx | 本机 `--project=dx-bridge` | **2 skipped**(端点 404) | — |
|
|
|
+
|
|
|
+**前端 47 红分布(全部为 S-cfc-132/133/134 预期 RED)**:`health-plan-summary`(组件未落地,8)、`consignee-edit`(13)、`growthHistory.dayGroupView`(10)等 6 套件。
|
|
|
+
|
|
|
+**langgraph 5 红(全 C 环境,非代码回归)**
|
|
|
+
|
|
|
+| 用例 | 断言 | 根因 |
|
|
|
+|---|---|---|
|
|
|
+| `test_auto_tag::content_relevance / short_content / empty_content` | `500 == 200` | `RateLimitError 429 (AgnesAI_error: free-tier rate limit)` |
|
|
|
+| `test_intent::classify_analysis / classify_recommend` | `CHAT == ANALYSIS/RECOMMEND` | 429 后 `intent_classifier.py:62` **静默兜底 chat**(掩盖配额错误,B-134-4 同源) |
|
|
|
+
|
|
|
+附:`chat_graph.py:148 召回记忆失败: 401 api key ****ab12 invalid`(记忆召回凭据失效,非阻塞主链路)。
|
|
|
+
|
|
|
+### 4.3 线上可达性与鉴权(POST 口径)
|
|
|
+
|
|
|
+| 目标 | 结果 | 判定 |
|
|
|
+|---|---|---|
|
|
|
+| `https://cfc.iwintrue.com/admin` | **200**(52ms,跟随后 200) | ✅ |
|
|
|
+| `https://cfc.iwintrue.com/frontend` | **200**(246ms) | ✅ |
|
|
|
+| `https://cfc.iwintrue.com/`(站点根) | **502**(62ms) | ⚠️ **B-141-3 新增** |
|
|
|
+| `/api/mind/fortune`、`/api/energy/overview`、`/api/health/plan/list`、`/api/huawei-health/status`、`/api/xiaomi-health/status` | **5/5 → 401** | ✅ G8(B-69 维持销号第 6 轮) |
|
|
|
+| `/api/health/data-sources/bridge/{list,sync-status}` | 首探 **502** → 复探 **404 / 404** | 502 为网关瞬抖;404 = 部署滞后(B-DX-1 第 4 轮) |
|
|
|
+| `192.168.16.251:9000/health` | **200**(10.6ms) | ✅ |
|
|
|
+| `251 /api/v1/chat`(`user_id:1`) | **200 / 728B / 100.03s** | ⚠️ 时延劣化(B-141-2) |
|
|
|
+| `251 /api/v1/analyze`(`report_id:1,user_id:1`) | **200 / 923B / 46.99s** | ⚠️ 同 |
|
|
|
+| `251` 传 `user_id:"r141"`(字符串) | **422**(int_parsing) | 契约口径:`user_id` 必须为整数 |
|
|
|
+
|
|
|
+### 4.4 节点与派发
|
|
|
+
|
|
|
+| 节点 | 端口/通道 | 结果 |
|
|
|
+|---|---|---|
|
|
|
+| 189 | `:4090` OPEN,Basic 认证通过 | **admin-desktop 5/5(1.2m,78s 取回 stdout)**;HEAD `2f74afb23@feature/s-cfc-70-star-digest`,**未执行 `git reset`**(保护 175 处他人未提交改动) |
|
|
|
+| 251 | `:4096` OPEN、`:9000` OPEN | **pytest 51 例(137.10s)**;HEAD `d4626e5f1` = 本地 HEAD |
|
|
|
+| 204 | `:4090` | CLOSED(B-95 第 12 轮) |
|
|
|
+| 本机 | — | 后端全量 + Jest×3 + 浏览器 4 套 |
|
|
|
+
|
|
|
+**G10 判定:✅ 双节点派发通过**(189 承载 admin、251 承载 langgraph,符合「每节点单浏览器任务」与「langgraph 派 251」要求)。派发方式:`POST /api/shell?location[directory]=<dir>` → `setsid nohup ... > LOG` **kick 分离** → 本地等待后**单次读日志**(避免 B-125「轮询建 shell 杀进程」复发)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 覆盖缺口清单
|
|
|
+
|
|
|
+| # | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|---|---|---|---|---|---|
|
|
|
+| G-141-1 | 前端契约 RED 未 GREEN | 47 红(3 组件未落地) | 组件级回归盲区 | 3 组件实现后由 jest 自动转绿 | P0 | 研发 GREEN 后跑 `cfc-frontend` 全量,0 红即闭环 |
|
|
|
+| G-141-2 | langgraph 错误传播 | 5 红:429/401 静默兜底 | 配额错误伪装成业务失败 | ① `intent_classifier.py:62` 抛错而非默认 chat;② 记忆召回 401 显式告警 | P0 | 修后复跑 `test_intent`/`test_auto_tag`,要求 5/5 绿 |
|
|
|
+| G-141-3 | langgraph 测试套件不可收集 | `tests/qna/test_graph.py` 缺 `src.qna` → **0 例执行** | CI 直接红、覆盖率假象 | 补 `src/qna/` 或给该文件 `pytest.importorskip`/`collect_ignore` | **P0** | 去除 `--ignore=tests/qna` 后能收集到 51+N 例 |
|
|
|
+| G-141-4 | LLM 链路时延 | chat 100s / analyze 47s | 用户端超时、AI 功能不可用感 | 为 chat/analyze 设 P95 时延断言(如 ≤30s)+ 429 重试上限 | P1 | 连续 3 轮 P95 达标 |
|
|
|
+| G-141-5 | dx 桥接端点未部署 | 404/404(TR-24 `47d203981` pending) | D/X 域桥接能力无法验证 | 部署后 dx 2 例自动由 skip 转 401 断言 | P1 | 部署批次落地后复跑 `--project=dx-bridge` |
|
|
|
+| G-141-6 | 根级黑盒全环境红 | 16/23 `ECONNREFUSED 9082` | 长期占用 G2 名额、噪声 | 改 `webServer` 自启或 `test.skip` 化 | P2 | 该项 0 红或全 skip 并注明 |
|
|
|
+| G-141-7 | SRS 场景锚点 | 严格锚点 64/366 = **17.5%**(宽口径 325/366=88.8%,含生成物 `tests/e2e/api/generated`) | 需求→用例不可追溯 | 在用例标题内嵌 TC-ID,禁用生成物计数 | P1 | 锚点率 ≥60%(严格口径) |
|
|
|
+| G-141-8 | CI 全量门禁 | 无 `.github/workflows/` | 回归只能靠人工轮次 | 建 CI:后端全量 + fe/web Jest + pytest(含 qna 修复后) | P1 | CI 上出现 blocking 全量 job |
|
|
|
+| G-141-9 | 覆盖率/变异 | 后端无 JaCoCo、无 PIT | 无法量化测试有效性 | 接 JaCoCo(行/分支)+ PIT 抽样 1 模块 | P2 | 报告可复算行覆盖 ≥60% |
|
|
|
+| G-141-10 | 无障碍/多浏览器/UAT | 单 Chromium、无 axe、无 UAT 记录 | 体验与合规风险 | axe-core 扫描 + Firefox/WebKit project + UAT 脚本 | P2 | 三引擎 0 阻断 + WCAG A 0 violation |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 域结论表
|
|
|
+
|
|
|
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
|
|
|
+|---|---|---|---|
|
|
|
+| 单元·组件级 | 苏雅 | ⚠️ 有条件通过 | 后端 2937 例 99.11%、346/346 XML;fe 616(47 预期 RED);web 116/116 |
|
|
|
+| 集成·接口级 | 柯砚 | ⚠️ 有条件通过 | 集成红 8(EnergySystem 6 / DimensionRegistryMap 3 / GuideModule 1E 跨桶);dx 端点 404 |
|
|
|
+| 系统·验收级 | 白樾 | ✅ 通过(可达面) | admin 5/5、frontend 6/6、shop 4/4、health 13/13;UAT/BDD 无资产(待核实) |
|
|
|
+| 测试保障级 | 闻朔 | ✅ 通过 | 冒烟面 3773 例可执行;回归零漂移(后端存量 17 红逐例一致);探索性无 charter |
|
|
|
+| 性能·可靠性 | 骆骋 | ❌ 不通过(可靠性缺陷) | langgraph 收集期中断整轮(B-141-1);chat 100s/analyze 47s(B-141-2);后端 62:00 无中断 |
|
|
|
+| 安全 | 关屿 | ⚠️ 有条件通过 | 线上 5/5 匿名 POST → 401;SAST/DAST/SCA 未授权未执行;`@GetMapping` 8 处 |
|
|
|
+| 兼容·体验 | 阮清 | ⚠️ 待核实 | 单 Chromium(1440×900 / 375×812);无 axe/WCAG |
|
|
|
+| 流程·度量·代码 | 何序 | ❌ 不通过 | 无 CI 全量(G11);锚点严格 17.5%(G9);SRS 窗口零变更(G12 ✅) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 五要素问题清单
|
|
|
+
|
|
|
+### 问题 1|langgraph 测试套件在收集期整体中断(P0)
|
|
|
+
|
|
|
+1. **问题描述**:251 上执行 `pytest -q --ignore=tests/test_chat.py`,输出仅 55 行即 `Interrupted: 1 error during collection`,**一个用例都没跑**(用时 0.53s)。
|
|
|
+2. **测试 bug 点**:`tests/qna/test_graph.py:7` → `from src.qna import schemas, graph, prompts`,而仓库无 `src/qna` 包(`ModuleNotFoundError: No module named 'src.qna'`)。
|
|
|
+3. **最优修改方案**:二选一并落码——① 补 `cfc-langgraph/src/qna/`(含 schemas/graph/prompts)使用例可执行;② 若 qna 图尚未实现,则在 `conftest.py` 增 `collect_ignore = ["tests/qna/test_graph.py"]` 或该文件首行 `pytest.importorskip("src.qna")`,并登记为已知缺口。
|
|
|
+4. **修改目的**:恢复「langgraph 全量可一键执行」,消除 CI 必然红。
|
|
|
+5. **闭环**:去除 `--ignore=tests/qna` 后命令能收集到 ≥51 例且无 `Interrupted`;连续 2 轮通过即闭环。
|
|
|
+
|
|
|
+### 问题 2|上游 429/401 被静默兜底,错误不可观测(P0)
|
|
|
+
|
|
|
+1. **问题描述**:`test_intent` 2 例、`test_auto_tag` 3 例红;日志 6 次 `RateLimitError 429 (AgnesAI_error)`,但接口返回 `500`(auto_tag)或「分类为 chat」(intent)。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/app/agents/intent_classifier.py:62`(`意图分类失败 → 默认 chat`);后端 `LangGraphErrorPropagateContractTest` 3 例断言 `AiGateway.chat()/chatForAnalysis()` 不得返回 `null`。
|
|
|
+3. **最优修改方案**:① `intent_classifier` 捕获 429/401 后向上抛出 `ExternalServiceError`(保留 HTTP 状态码);② `AiGateway` 不再 `catch → null`,改为返回带 `error` 标记的结构并在编排层降级;③ 配额类错误统一映射为 `503 + Retry-After`。
|
|
|
+4. **修改目的**:让「配额耗尽」与「业务失败」在监控与告警上可区分,避免 AI 能力静默降级(B-134-4/B-82 同源)。
|
|
|
+5. **闭环**:`test_intent` 5/5、`test_auto_tag` 5/5、`LangGraphErrorPropagateContractTest` 3/3 全绿,且在 429 注入下仍能断言错误被传播。
|
|
|
+
|
|
|
+### 问题 3|LangGraph 调用链线程非 daemon,进程无法退出(P0)
|
|
|
+
|
|
|
+1. **问题描述**:`LangGraphExitHangContractTest` 2 例红——`cfc-async-1 isDaemon=false`、`cfc-scheduler-4 isDaemon=false`;历史 B-126 曾出现 `43 passed but PYTEST_EXIT=124`。
|
|
|
+2. **测试 bug 点**:`cfc-backend` 线程池 bean 定义(`taskExecutor` / `taskScheduler`)未注入守护线程工厂。
|
|
|
+3. **最优修改方案**:为 `taskExecutor`、`taskScheduler` 显式设置 `setThreadFactory(new CustomThreadFactory(true))`(daemon=true),并保留优雅停机 `setWaitForTasksToCompleteOnShutdown(false)`。
|
|
|
+4. **修改目的**:保证 JVM 在 LLM 长调用挂起时仍可正常退出,CI 不被挂死。
|
|
|
+5. **闭环**:该契约 2/2 绿;`mvn test` 与 `pytest` 均以 `EXIT=0` 收尾,连续 3 轮无 124。
|
|
|
+
|
|
|
+### 问题 4|LLM 接口时延劣化(P1)
|
|
|
+
|
|
|
+1. **问题描述**:251 线上 `chat` 200 但耗时 **100.03s**(728B),`analyze` **46.99s**(923B);R138 同接口为 12.2s / 10.2s。
|
|
|
+2. **测试 bug 点**:无超时断言——测试只校验 `status_code == 200`,不校验时延(`tests/test_auto_tag.py`、`test_intent.py` 同)。
|
|
|
+3. **最优修改方案**:① 服务侧设 LLM 调用超时(如 30s)+ 429 指数退避上限 2 次;② 测试侧新增 `assert resp.elapsed < 30` 的 P95 守卫用例(3 次采样取中位数)。
|
|
|
+4. **修改目的**:把「能返回」升级为「可接受时延内返回」,防止用户端超时。
|
|
|
+5. **闭环**:连续 3 轮 251 线上 chat/analyze P95 ≤30s,且时延断言用例绿。
|
|
|
+
|
|
|
+### 问题 5|dx 桥接端点未部署(P1,第 4 轮)
|
|
|
+
|
|
|
+1. **问题描述**:匿名 `POST /api/health/data-sources/bridge/list`、`/sync-status` → **404/404**(首探曾 502,复探 404)。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/dx-health-bridge-auth.spec.js` TC-DX-U01/U02 因 404 判 skip(设计正确,未假绿)。
|
|
|
+3. **最优修改方案**:将 TR-24 `47d203981` 部署至 `cfc.iwintrue.com` 对应后端实例,随后 dx 用例自动转 401 断言。
|
|
|
+4. **修改目的**:D/X 域桥接(S-cfc-130 契约 16/16 已绿)在线上可被验证,避免「契约绿、线上缺」。
|
|
|
+5. **闭环**:dx 2 例由 `skipped` 转 `passed`(断言 401/403)。
|
|
|
+
|
|
|
+### 问题 6|站点根路由 502(P2,新增)
|
|
|
+
|
|
|
+1. **问题描述**:`https://cfc.iwintrue.com/` 返回 502,而同域 `/admin`、`/frontend` 均 200。
|
|
|
+2. **测试 bug 点**:无——本轮 curl 巡检发现,不属既有用例覆盖(建议补 TC-R-U01 站点根可达)。
|
|
|
+3. **最优修改方案**:openresty 侧为 `/` 配置明确落地(302 → `/frontend` 或静态页),或移除该 location 的上游代理。
|
|
|
+4. **修改目的**:对外可达性巡检不被单点 502 误判为「全站故障」。
|
|
|
+5. **闭环**:`/` 返回 2xx/3xx,新增 TC-R-U01 纳入 health 契约套件。
|
|
|
+
|
|
|
+### 问题 7|根级黑盒 16 红长期占位(P2,第 37 轮)
|
|
|
+
|
|
|
+1. **问题描述**:`tests/jest.config.js` 23 例中 16 红,全部 `ECONNREFUSED 127.0.0.1:9082`。
|
|
|
+2. **测试 bug 点**:`tests/integration/*.spec.js` 依赖本机常驻后端,无 `webServer` 自启。
|
|
|
+3. **最优修改方案**:jest 配置增 `globalSetup` 启停后端,或改用 `test.skip(!process.env.CFC_LIVE)` 条件跳过。
|
|
|
+4. **修改目的**:消除环境型红对 G2 的长期污染,使红例数真实反映产品缺陷。
|
|
|
+5. **闭环**:该项 0 红;或全 skip 且在报告中显式标注「未实测」。
|
|
|
+
|
|
|
+### 问题 8|SRS 场景锚点不足(P1,度量)
|
|
|
+
|
|
|
+1. **问题描述**:15 份用例台账含 366 唯一 TC,仅 **64 个**在测试源码中被引用(严格口径 17.5%);宽口径 88.8% 系 `tests/e2e/api/generated/cases.json` 生成物虚高。
|
|
|
+2. **测试 bug 点**:用例标题未内嵌 TC-ID,代码与台账无稳定锚点。
|
|
|
+3. **最优修改方案**:在 jest/pytest/MockMvc 用例标题(`it('TC-XX-YY ...')`)内嵌 TC-ID;度量脚本排除 `generated/` 目录。
|
|
|
+4. **修改目的**:实现「需求条款 → 用例 → 执行结果」可追溯,支撑变更影响分析。
|
|
|
+5. **闭环**:严格口径锚点率 ≥60%,且 `test_report_metrics.py` 输出可复算。
|
|
|
+
|
|
|
+### 问题 9|无 CI 全量门禁(P1)
|
|
|
+
|
|
|
+1. **问题描述**:仓库无 `.github/workflows/`,141 轮全靠人工轮次执行;后端全量 62 分钟无法在提交粒度承载。
|
|
|
+2. **测试 bug 点**:不存在 CI 配置(缺失即缺陷)。
|
|
|
+3. **最优修改方案**:建两档 job——① PR:`mvn -o -B test -Dtest=*Contract*` + fe/web Jest(≤10min);② 夜间:后端全量 + pytest + 浏览器(allow_failure=false 逐步收紧)。
|
|
|
+4. **修改目的**:把「轮次发现」提前到「提交发现」。
|
|
|
+5. **闭环**:CI 出现 blocking job 且连续 3 次全绿。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 门禁结论
|
|
|
+
|
|
|
+| 门禁 | 阈值 | 本轮实测 | 判定 |
|
|
|
+|---|---|---|---|
|
|
|
+| G1 全量通过率 | ≥98% | **97.14%**(剔 skip 97.60%) | ❌ |
|
|
|
+| G2 红例数 | ≤5 | **90**(预期 RED 52 + 装置 16 + 环境 5 + 根级 16 + 业务 1) | ❌ |
|
|
|
+| G3 前端 | 0 红 | 47 红(**全部预期 RED**) | ⚠️ |
|
|
|
+| G4 管理端 | 0 红 | **116/116** | ✅ |
|
|
|
+| G5 编译/产物完整性 | 0 错、无沉默 | testCompile 352 源 0 错;346/346 XML | ✅ |
|
|
|
+| G6 浏览器 E2E | 28/28 | **28/28**(+2 skip) | ✅ |
|
|
|
+| G7 langgraph | 0 红 | 5 红(429/401 环境) | ❌ |
|
|
|
+| G8 鉴权 | 全部 401 | **5/5 → 401** | ✅ |
|
|
|
+| G9 SRS 锚点 | ≥60% | **17.5%**(严格)/ 88.8%(含生成物) | ❌ |
|
|
|
+| G10 节点派发 | 双节点 | **189 ✅ + 251 ✅** | ✅ |
|
|
|
+| G11 CI 全量门禁 | 存在 blocking job | 无 `.github/workflows/` | ❌ |
|
|
|
+| G12 SRS 变更→用例同步 | 变更即更新 | 窗口零变更 → 零新增(合规) | ✅ |
|
|
|
+
|
|
|
+### 结论:**不通过(有条件)**
|
|
|
+
|
|
|
+**理由**:G1/G2/G7/G9/G11 未达阈值。但**无回归**——后端存量 17 红与 R138 逐类逐例一致,新增 5 红全部为研发侧新契约(S-cfc-135/136)的预期 RED;langgraph 5 红全为 LLM 配额/凭据环境问题;前端 47 红全为未落地组件的预期 RED。
|
|
|
+
|
|
|
+**转「通过」的最小条件**:① 3 个前端组件 GREEN(47→0);② langgraph 5 例随 429/401 治理与错误传播修复转绿;③ S-141-1 `tests/qna` 收集期缺陷修复(恢复一键执行);④ G9 严格锚点 ≥60%。后端 17 存量红与根级 16 环境红可另立专项,不阻塞本轮结论升级。
|
|
|
+
|
|
|
+**「全部用例覆盖并通过」目标达成度**:本轮 3773 例中 3665 通过(97.14%),**未达「全部通过」**;失败 90 例已完成 100% 归因,其中 **52 例为研发侧预期 RED(待 GREEN)**、37 例为装置/环境、1 例为真库数据缺陷。SRS 覆盖:201 份规格 / 15 份用例台账 / 366 唯一 TC,严格锚点 17.5% → 覆盖不完整,缺口见 §5。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录 A · SRS 与研发侧变更登记(窗口 `abdb2d6de..d4626e5f1`)
|
|
|
+
|
|
|
+| 类型 | 对象 | 变更 | 测试侧动作 |
|
|
|
+|---|---|---|---|
|
|
|
+| 规格 | `docs/superpowers/specs`(201 份)、`test-cases`(15 份)、`api/API_REFERENCE.md` | **零变更**(`git log`/`find -newermt` 双空) | 不新增用例;G12 ✅ |
|
|
|
+| 契约(研发侧) | S-cfc-132 `family.signature.healthPlanSummary` | 前端 8 红(组件未落地) | 已纳入执行集,转绿即闭环 |
|
|
|
+| 契约(研发侧) | S-cfc-133 `family.signature.consigneeEditor` | 前端 13 红 | 同上 |
|
|
|
+| 契约(研发侧) | S-cfc-134 `growth.history.dayGroupView` | 前端 10 红 | 同上 |
|
|
|
+| 契约(研发侧) | S-cfc-135 langgraph `intent.errorPropagate` | 后端 3 红 + langgraph 5 例(`tests_contract/test_growth_report_contract.py` 8 例) | 已实跑 |
|
|
|
+| 契约(研发侧) | S-cfc-136 langgraph `pytest.exitHang` | 后端 2 红 | 已实跑 |
|
|
|
+
|
|
|
+> 前端另有 16 红(R139/R140 已登记)与本轮 47 红同源,未新增。
|
|
|
+
|
|
|
+## 附录 B · 本轮命令清单(可复算)
|
|
|
+
|
|
|
+```bash
|
|
|
+# 1) 环境探针
|
|
|
+JAVA_HOME=/d/jdk1.8.0_25; /d/maven/apache-maven-3.6.1/bin/mvn -v; df -h /d
|
|
|
+
|
|
|
+# 2) 后端全量
|
|
|
+JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B -f cfc-backend/pom.xml clean test
|
|
|
+
|
|
|
+# 3) Jest
|
|
|
+(cd cfc-web && npx jest --ci)
|
|
|
+(cd cfc-frontend && npx jest --ci)
|
|
|
+npx jest -c tests/jest.config.js --ci
|
|
|
+
|
|
|
+# 4) 浏览器(必须在 tests/ 内执行,避免 @playwright/test 双版本)
|
|
|
+(cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --reporter=list)
|
|
|
+(cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge --reporter=list)
|
|
|
+(cd tests && npx playwright test -c playwright.config.health.js --reporter=list)
|
|
|
+
|
|
|
+# 5) 189 admin(opencode shell 通道,不 reset)
|
|
|
+node _r141_189.cjs
|
|
|
+
|
|
|
+# 6) 251 langgraph(kick 分离 + 单次读日志)
|
|
|
+MSYS_NO_PATHCONV=1 ./_r141_sh250.sh http://192.168.16.251:4096 /sc-data/cfc/cfc-langgraph \
|
|
|
+ "cd /sc-data/cfc/cfc-langgraph && rm -f /tmp/r141_pytest2.log && setsid nohup timeout 1500 .venv/bin/python -m pytest -q --ignore=tests/test_chat.py --ignore=tests/qna > /tmp/r141_pytest2.log 2>&1 < /dev/null & echo KICKED2"
|
|
|
+```
|