Преглед на файлове

docs(tdd): 测试负责人第122轮闭环汇报(langgraph fix闭环 B-65/B-82 + B-69线上销号 + admin U05新增失败 B-121)

E2E Test Bot преди 3 дни
родител
ревизия
568cecac6b
променени са 2 файла, в които са добавени 202 реда и са изтрити 0 реда
  1. 192 0
      docs/tdd/orchestration/report-test-2026-11-10T1210.md
  2. 10 0
      docs/tdd/test/blockers.md

+ 192 - 0
docs/tdd/orchestration/report-test-2026-11-10T1210.md

@@ -0,0 +1,192 @@
+# 测试闭环报告 · 每小时(2026-11-10 12:10 GMT+8)
+
+> 主理人:陆谨(软件测试专家团 · 测试架构师)
+> 执行档:**review 档(内网 cfc.iwintrue.com 已授权 + 测试用例编写)**
+> 对象:d:/cfc(浠艾福 XAF 项目)
+> 轮次:第 122 轮(本自动化定时巡检)
+
+## 元信息
+
+| 项 | 值 |
+|----|----|
+| 当前 HEAD | `d68306fff`("R121轮收尾补正");`eeb147273 fix(langgraph)` 已合入但未在上轮实测 |
+| 上次本对象轮 | R121 @ 2026-11-10 11:28(`730b7058a`) |
+| 两轮间关键 commit | `eeb147273 fix(langgraph)`(修复分析图 checkpointer 配置缺失、chat LLM 空响应兜底、pytest loop scope,并更新 LLM 网关配置)—— **本轮回跑点** |
+| 网络约束 | 不访问外部公网;已授权内网 `cfc.iwintrue.com`,langgraph 服务 251:9000 **OPEN** |
+| 节点拓扑 | 浏览器节点:本机 + `192.168.16.189`(每节点单任务,本轮回退本机串行);langgraph 部署于 `192.168.16.251`(按用户要求应派发该节点,但 251:4090 opencode 鉴权门控 → 本地 venv 兜底) |
+
+---
+
+## 1. 执行范围
+
+**离线实测(本地可用命令,已执行)**
+- cfc-web Jest 单元/组件测试(axios-mock-adapter mock API)
+- cfc-frontend Jest 单元/组件测试
+- cfc-langgraph pytest(本地 venv 兜底;251 派发通道不可达)
+- 浏览器自动化(本机 Chromium 1.61.1 / 1228):`cfc.iwintrue.com/frontend`(frontend-mobile 游客流)、`/admin`(admin-desktop 登录流)
+- 内网无登录 E2E 探针:`curl` 探活 `cfc.iwintrue.com/admin`、`/frontend`
+
+**降级(未实测,如实登记)**
+- cfc-backend 全量 `mvn test` / `test-compile`(本机无 Maven,MySQL 3306 不可达 → 复用 R120 全量基线 98.06%)
+- JaCoCo 覆盖率门禁(离线缺失)
+- 登录态 E2E 多业务流(仅 admin 登录 + frontend 游客流实跑;其余业务流依赖更多凭据)
+- 安全测试 / 性能压测 / 依赖漏洞扫描(execute 档,公网未授权)
+- LangGraph `251` 派发(251:4090 opencode `UnauthorizedError` 鉴权门控、251:4096 `UnauthorizedError` → 无法派发 pytest 到 251 节点,B-55 复发;251:9000 服务 OPEN 但非 pytest runner)
+
+**测试用例编写**:SRS 闸门闭合 → 跳过编写(零抖动,详见 §5)。
+
+---
+
+## 2. 用例总数 · 通过 · 失败(本小时实测)
+
+| 套件 | 套件数 | 总数 | 通过 | 失败 | 跳过 | 说明 |
+|------|-------|------|------|------|------|------|
+| cfc-web Jest | 17 | 116 | **116** | 0 | 0 | mock API,断言前端逻辑(EXIT 0) |
+| cfc-frontend Jest | 26 | 426 | **423** | 0 | 3 | EXIT 0;3 跳为既有设计跳过 |
+| cfc-langgraph pytest(本地 venv,post-fix) | — | 44 | **38** | 6 | 0 | 257s;6 失败全为 LLM 凭据依赖(5 auto_tag + 1 chat) |
+| frontend-mobile E2E(/frontend 游客流) | 1 | 6 | **6** | 0 | 0 | EXIT 0;TC-F-U01~U06 |
+| admin-desktop E2E(/admin 登录流) | 1 | 5 | 4 | **1** | 0 | TC-A-U05 登录前置确定性失败(U04 同流程通过) |
+| 内网 E2E 探针(无登录) | 2 | 2 | 2 | 0 | 0 | /admin、/frontend 均 302 可达(登录墙) |
+| **合计(本小时可执行)** | 47 | 599 | **589** | **7** | 3 | |
+
+**全量基线引用(R120 @ HEAD `8da3f0aa0`,零漂移)**:后端全量 3500 例 / 3432 通过 = **98.06%**(34 红、15 类差集空);其中后端 2864 例 / 2826 = 98.67%(34 红);根级 jest 7/23(16 红,B-36 装置红);浏览器 E2E 28 全绿(admin5+frontend6+shop4+health13);langgraph@251 43/32/11(pre-fix 基线,本轮回跑已变)。
+
+---
+
+## 3. 覆盖率
+
+| 模块 | 语句 | 分支 | 函数 | 行 | 备注 |
+|------|------|------|------|----|------|
+| cfc-web Jest | 10.11% | 6.12% | 7.51% | 9.98% | 引用 R117/R118 基线(本小时未重跑 `--coverage`,持平) |
+| cfc-frontend Jest | — | — | — | — | 仅 Jest 通过率,无 JaCoCo 等价物 |
+| cfc-backend 全量 | — | — | — | — | JaCoCo 离线缺失(N/A),引用全量基线 98.06% |
+| cfc-langgraph pytest | — | — | — | — | pytest 通过率口径,非行覆盖 |
+
+> 覆盖率度量缺口持续存在(C-1):前端/管理端 Jest 仅验证逻辑分支;后端 JaCoCo 因离线缺依赖无法产出,门禁阈值(≥80%)目前为 N/A。
+
+---
+
+## 4. 回归与闭环判定
+
+- **本轮回跑点(eeb147273 fix(langgraph) 复验)**:本地 venv 重跑 44 例 / 38 过 / 6 败(vs pre-fix 251 基线 43/32/11)。**净变化:失败 11 → 6(-5),通过 32 → 38(+6)**。失败清单仅剩 `test_auto_tag.py` 5 例 + `test_chat.py::test_chat_endpoint` 1 例——**全部为 LLM 凭据依赖**(251 无有效 LLM key / 本地无 key → 401/500)。据此判定:`B-65`(analyze checkpointer 缺 thread_id,连续 25 轮 P0)**本轮由 fix 闭环**;`B-82`(intent 4 例静默降级,连续 21 轮)**不再出现在失败清单 → 视为闭环**(pytest loop scope 修复 + 空响应兜底生效);`B-74`(auto_tag 5 例,连续 21 轮 P1)**持续**(纯 LLM 凭据缺口,非代码缺陷)。**这是本轮最关键的积极进展:研发 langgraph 修复经实测确认有效。**
+- **admin-desktop 回归(新问题)**:TC-A-U05(后台核心菜单)登录前置确定性失败 2/2(全量跑 + 隔离复跑均失败),而 TC-A-U04(管理员真实登录,同流程)通过 → 指向滑块/验证码时序或产品登录链路竞态(B-46/B-120 同类)。相对 R120 继承的「admin 5/5」基线为**新增失败**,登记 **B-121** 交研发确认。
+- **B-69(O-21 鉴权)线上闭环(重大积极进展)**:研发 `63cf7455a` / `84239ce22` 将 `/api/mind/**` 4 端点移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` 强制登录;本轮线上实测 `POST /api/mind/fortune` → **401**(`{"code":401,"message":"请先登录"}`),对照 `/api/energy/overview` 维持 401 → **连续 22 轮 P0 终闭环销号**。安全门禁缺口收窄一项。
+- **与 R121 逐项比对**:cfc-web 116/116 持平;cfc-frontend 423/0/3 持平;frontend-mobile 6/6 持平;langgraph 由 43/32/11(pre-fix)变为 44/38/6(post-fix,改善);admin 由继承 5/5 变为实测 4/5(新增 1 失败)。
+
+---
+
+## 5. 测试用例编写产出
+
+- **触发判定(SRS 闸门)**:`find docs/tdd/SRS.md docs/需求分析 docs/superpowers/specs docs/superpowers/api/API_REFERENCE.md -newermt "2026-11-10 11:28"` → **零命中**;HEAD 相对 R121 无需求/spec/接口文档新增或修改(仅 `eeb147273` 为 langgraph 代码修复,已由既有 pytest 覆盖,无需新增用例)。
+- **执行结果**:**本次无需求变更,跳过测试用例编写**。既有 E2E 资产存在但未改动。
+- **eeb147273 复验归属**:该修复由既有 `tests/test_analyze.py` / `tests/test_intent.py` / `tests/test_chat.py` / `tests/test_auto_tag.py` 覆盖,无需新增用例,符合「SRS 变更才更新用例」约束。
+
+---
+
+## 6. 五要素问题清单
+
+### 问题 B-121(新增·P1|admin 登录前置确定性失败)
+① **问题描述**:本机 `admin-desktop` 套件 TC-A-U05(后台核心菜单可访问)登录前置**确定性失败**(全量跑 + 隔离复跑 2/2 均停在 `/admin/login`),报错「前置登录未通过」;同套件 TC-A-U04(管理员真实登录,步骤完全一致)通过。
+② **测试 bug 点**:`tests/e2e-live/admin-live.spec.js:198-201`(U05 硬断言 `page.url().includes('/login')` 为 falsy);U04/U05 共用 `fillPhoneAndAwaitRoles` + `dragSliderToEnd` + 点击「登录」+ 5s 等待。
+③ **最优修改方案**:研发确认 `/api/account-roles` 与登录链路在滑块拖过后是否偶发拒绝(风控/时序);同时测试侧在 U05 登录前置加重试(P-5 思路:滑块拖过 + 等待 + 失败重试一次),区分「产品回归」与「滑块时序偶发」。
+④ **修改目的**:闭环 admin 登录 E2E 稳定性,区分 B-46/B-120 类滑块时序问题与真实产品登录回归,使门禁可信。
+⑤ **问题闭环方式与通过标准**:研发确认登录链路无回归 + 测试侧 U05 前置加一次重试后,隔离复跑 U05 连续 2 轮通过 → 销号;若重试仍失败且 U04 同流程通过,则指向产品侧,研发修复登录链路。
+
+### 问题 B-74(持续·P1|langgraph auto_tag 5 例红,纯 LLM 凭据缺口)
+① 251 / 本地 venv 均 `test_auto_tag.py` 5 例 `AssertionError`(LLM 401),本轮本地复跑确认与上轮 251 实派一致。
+② `cfc-langgraph/tests/test_auto_tag.py`(5 例)。
+③ 给 251 `.venv` 注入有效 LLM 凭据 + 装 `pytest-timeout` 防网络重试挂起。
+④ 解除 LLM 依赖测试对凭据的环境阻塞,使 langgraph 全量可复验。
+⑤ 复测:251 注入凭据后 auto_tag 5 例转绿;闭环判据不变。
+
+### 问题 B-65(**本轮闭环**·原 P0|analyze checkpointer 缺 thread_id)
+① 原 `tests/test_analyze.py` 2 例 `assert 500 == 200`(checkpointer 配置缺失)。
+② `cfc-langgraph/tests/test_analyze.py`。
+③ 研发 `eeb147273` 修复分析图 checkpointer 配置缺失 + pytest loop scope。
+④ 消除 analyze 端点 500,使非 LLM 子集全绿。
+⑤ **复测(本轮)**:本地重跑 test_analyze.py 2 例**不在失败清单 → 已转绿**,B-65 销号。
+
+### 问题 B-82(**本轮闭环**·原 P1|intent 4 例静默降级)
+① 原 `tests/test_intent.py` 4 例 `assert <Intent.CHAT>`(LLM 401 后静默降级)。
+② `cfc-langgraph/tests/test_intent.py`。
+③ 研发 `eeb147273` chat LLM 空响应兜底修复。
+④ 消除 LLM 401 静默降级。
+⑤ **复测(本轮)**:本地重跑 intent 4 例**不在失败清单 → 已转绿**,B-82 销号。
+
+### 问题 P-9(持续·P2|离线约束缺口)
+① cfc-frontend Jest 运行期向公网 `https://cfc.etotem.com.cn/api/ai/chat/send` 发真实 POST(线上返回 `code=46004`)。
+② `cfc-frontend/__tests__/api/api.test.js`(`utils/api.js:323`)。
+③ jest `setupFiles` 全局 spy `uni.request` 永不触网 + 测试期网络护栏。
+④ 满足「离线审查不访问外部公网」约束,避免线上副作用。
+⑤ 复测:重跑 Jest 日志不再出现 `POST https://cfc.etotem.com.cn`。
+
+### 问题 B-69(**本轮闭环**·原 P0|鉴权 O-21)
+① 原线上匿名 `POST /api/mind/fortune` → HTTP 200(应为 401),连续 22 轮未修。
+② `/api/mind/**`(O-21 相关路径)。
+③ 研发 `63cf7455a` / `84239ce22`(merge)将 4 端点移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` 强制登录(401)。
+④ 关闭未授权匿名访问面,满足安全门禁。
+⑤ **复测(本轮线上实测)**:`POST https://cfc.iwintrue.com/api/mind/fortune` → **401** + `{"code":401,"message":"请先登录"}`;对照 `/api/energy/overview` 维持 401(机制正常)→ **B-69 线上闭环销号(连续 22 轮 P0 终落地)**。
+
+### 问题 C-1(持续·P1|覆盖率度量缺失)
+① 后端 JaCoCo、前端渲染覆盖率缺失,门禁阈值(≥80%)为 N/A。
+② 构建配置无 JaCoCo 离线包。
+③ 引入 JaCoCo(离线缓存或授权联网)+ 前端 `@vue/test-utils` coverage。
+④ 使覆盖率可度量、可门禁。
+⑤ 复测:后端 JaCoCo ≥80% 报告可产出。
+
+### 问题 B-36(持续·P1|根级装置红)
+① 根级 jest 7/23(16 红),装置(setup)未就绪预期红。
+② 根级 jest 套件(16 例红)。
+③ 修复全局 setup/teardown 与 mock 注入。
+④ 区分真红/装置红,避免掩盖真实回归。
+⑤ 复测:16 红归零或明确标注为预期 RED。
+
+---
+
+## 7. 待核实项
+
+- 登录态 E2E 完整业务流凭据(仅 admin 登录 + frontend 游客流实跑)。
+- 后端全量真实红类明细(MySQL 3306 本地不可达,引用 R120 基线 98.06%)。
+- JaCoCo 覆盖率门禁(离线缺依赖,N/A)。
+- LangGraph 251 派发(251:4090/4096 opencode 鉴权门控,B-55 复发;251:9000 服务 OPEN);本地 venv 重跑已验证 fix,但「派发到 251 节点」用户要求未满足。
+- `growth_records` 重复列 / 37 红类 / `blank-key` S-cfc-31 历史债(待源码级复核)。
+
+---
+
+## 8. 需用户单独授权才能继续的项(未授权未执行 · 附测试设计)
+
+| 维度 | 未执行原因 | 测试设计(降级产出) |
+|------|-----------|----------------------|
+| 安全测试(SAST/DAST/依赖漏洞) | execute 档,公网未授权 | 接入 Snyk/OWASP Dependency-Check + ZAP;范围 cfc-backend/cf-web/cfc-frontend;门禁 0 高危。 |
+| 性能压测 | execute 档,公网/远端未授权 | 对 `/api/**` 关键路径做 k6 基准(RPS、P95、错误率)。 |
+| 后端连库全量 `mvn test` | 本机无 Maven / MySQL DOWN | 恢复 Maven + MySQL 后实跑 3500 例基线,核对 34 红归属。 |
+| LangGraph 251 派发 pytest | 251:4090/4096 opencode 鉴权门控(B-55) | 本地 venv 兜底重跑(已执行,验证 fix);251 注入 opencode 凭据后实派复验。 |
+| JaCoCo 下载/配置 | 离线缺依赖 | 授权联网或本地缓存后引入,设定 ≥80% 门禁。 |
+
+---
+
+## 9. 门禁结论
+
+**结论:⛔ 不通过(有条件)—— langgraph fix 经实测闭环(B-65/B-82 销号)+ B-69 鉴权线上闭环(连续 22 轮 P0 落地),剩余失败全为 LLM 凭据缺口;但 admin U05 新增登录失败 + 后端全量未重测 + 覆盖率/安全未授权仍阻塞。**
+
+- **绿区(本小时实测通过)**:cfc-web 116/116;cfc-frontend 423/0/3;frontend-mobile 6/6;admin-desktop 4/5(U04 通过);langgraph 非 LLM 子集 38/38 全绿(含 analyze/intent 修复);**线上 B-69 鉴权 401 闭环**;内网探针 2/2。
+- **未放行原因(硬缺口)**:① admin TC-A-U05 登录前置确定性失败(B-121 新增);② langgraph 6 例 LLM 凭据依赖失败(B-74 持续);③ 后端全量 34 红未重测(MySQL DOWN);④ 覆盖率门禁 N/A(JaCoCo 缺);⑤ 安全/性能/依赖漏洞未授权未执行;⑥ P-9 离线外联仍实证。
+
+**复评条件(满足即转通过)**:
+1. 后端连库全量 `mvn test` 0 真红(装置红除外)且 JaCoCo ≥80%;
+2. 修 B-121:admin U05 登录前置稳定通过(研发确认登录链路 + 测试侧重试);
+3. 251 注入 LLM 凭据使 langgraph 6 例转绿(B-74 闭环);
+4. 授权并实跑安全/性能/依赖漏洞扫描,0 高危;
+5. 修 P-9:前端 Jest 不再触公网。
+
+---
+
+## 历史审查记录(对照,不作本次结论依据)
+
+- 本对象历史:R117→R118→R119→R120→R121(连续零漂移稳态,B-61/B-120 销号)→ **本回合 R122(12:10)**。
+- 本轮相对 R121 的实质变化:① langgraph 由 pre-fix 43/32/11 实测为 post-fix 44/38/6(B-65/B-82 销号,研发 fix 经实测确认);② admin-desktop 由继承 5/5 实测为 4/5(B-121 新增 U05 登录前置失败)。
+- 持续遗留缺口:JaCoCo 覆盖率、登录态 E2E 完整业务流凭据、安全/性能/依赖(公网未授权)、P-9 离线外联、B-69 鉴权、251 opencode 派发(B-55)、189 opencode 凭据(B-56)。
+
+---
+
+*产物:docs/tdd/orchestration/report-test-2026-11-10T1210.md(本回合,待 commit+push);blockers.md 同步追加 B-121 + B-65/B-82 销号记录(待 push)。*

+ 10 - 0
docs/tdd/test/blockers.md

@@ -349,3 +349,13 @@
 | B-82-Update(第 121 轮 · 连续第 21 轮) | langgraph `test_intent.py` 4 例红(静默降级) | 研发 | **连续第 21 轮未修**。251 实派:4 例承袭 R120(LLM 401 后静默降级)。闭环判据不变 | 测试负责人(第 121 轮复现) | 2026-11-10 12:0x | 待处理(P1) |
 | B-36-Update(第 121 轮 · 第 24 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例:7 绿 / 16 红(与 R120 逐项一致;9082 未启动 → ECONNREFUSED) | 测试负责人(第 121 轮实测) | 2026-11-10 12:0x | 待处理(P1) |
 | B-95-Update(第 121 轮 · 失联延续) | `192.168.16.204` 节点失联 | 运维 | **延续失联**。`204:4090` → 000(2.03s)。本轮浏览器任务由本机 + 189 承担(每节点单任务合规),不受影响 | 测试负责人(第 121 轮探活) | 2026-11-10 12:0x | 待处理(P2) |
+
+<!-- ===== 第 122 轮(2026-11-10 12:10,本自动化)追加 ===== -->
+
+| B-121(第 122 轮 · 新增) | 本机 `admin-desktop` TC-A-U05 登录前置确定性失败 | 研发 | **新增(P1)**。`cfc.iwintrue.com/admin` 实跑:`TC-A-U05`(后台核心菜单)登录前置**确定性失败 2/2**(全量跑 + 隔离复跑均停在 `/admin/login`,硬断言失败);同套件 `TC-A-U04`(管理员真实登录,步骤完全一致)通过 → 指向滑块/验证码时序或产品登录链路竞态(B-46/B-120 同类,但本次确定性非偶发)。相对 R120 继承的「admin 5/5」基线为**新增失败**。闭环判据:研发确认登录链路无回归 + 测试侧 U05 前置加重试后隔离复跑连续 2 轮通过 → 销号;若重试仍失败且 U04 同流程通过则指向产品侧,研发修复登录链路 | 测试负责人(第 122 轮实跑+隔离复跑) | 2026-11-10 12:10 | 待处理(P1,新增) |
+| B-65-Close(第 122 轮 · **销号**) | langgraph analyze checkpointer 缺 thread_id | 研发 | **销号(第 122 轮,fix 闭环)**。研发 `eeb147273` 修复分析图 checkpointer 配置缺失 + pytest loop scope;本轮本地 venv 重跑 `test_analyze.py` 2 例**不在失败清单 → 已转绿**(连续 25 轮 P0 终闭环)。剩余 langgraph 失败仅为 LLM 凭据依赖(B-74 持续) | 测试负责人(第 122 轮复验) | 2026-11-10 12:10 | **已闭环(销号)** |
+| B-82-Close(第 122 轮 · **销号**) | langgraph `test_intent.py` 4 例静默降级 | 研发 | **销号(第 122 轮,fix 闭环)**。`eeb147273` chat LLM 空响应兜底修复;本轮本地重跑 intent 4 例**不在失败清单 → 已转绿**(连续 21 轮 P1 终闭环)。闭环判据满足 | 测试负责人(第 122 轮复验) | 2026-11-10 12:10 | **已闭环(销号)** |
+| B-74-Update(第 122 轮 · 连续第 22 轮) | langgraph `test_auto_tag.py` 5 例红 | 研发/运维 | **连续第 22 轮**。本轮本地 venv 重跑确认 5 例 `AssertionError`(LLM 401),与历轮 251 实派一致——属**纯凭据缺口非代码缺陷**。闭环判据不变:251 注入有效 LLM 凭据 + 装 `pytest-timeout` 防挂起 | 测试负责人(第 122 轮本地复验) | 2026-11-10 12:10 | 待处理(P1) |
+| B-55-Update(第 122 轮 · 派发受阻延续) | `192.168.16.251` opencode 派发 langgraph 不可达 | 运维 | **延续(用户要求 langgraph 测试派发 251 未满足)**。`251:4090` → 000(CLOSED);`251:4096` → `UnauthorizedError`(鉴权门控);`251:9000` langgraph 服务 → 200 OPEN 但非 pytest runner。本轮 langgraph 测试以**本地 venv 兜底**重跑(验证 fix 有效),251 派发通道待运维注入 opencode 凭据后开通 | 测试负责人(第 122 轮探活) | 2026-11-10 12:10 | 待处理(P2) |
+| B-69-Close(第 122 轮 · **线上闭环销号**) | `/api/mind/**` 匿名可达(鉴权清单缺项) | 研发 | **销号(第 122 轮,连续 22 轮 P0 终落地)**。研发 `63cf7455a`/`84239ce22`(merge)将 4 端点移入 `JwtInterceptor.LOGIN_REQUIRED_PATHS` 强制登录;**本轮线上实测 `POST /api/mind/fortune` → 401** + `{"code":401,"message":"请先登录"}`,对照 `/api/energy/overview` 维持 401(机制正常)→ O-21 落码闭环 | 测试负责人(第 122 轮线上复验) | 2026-11-10 12:10 | **已闭环(销号)** |
+| B-36-Update(第 122 轮 · 第 25 轮零漂移) | 根级黑盒 23 例 16 红 | 测试 | **零漂移**。本轮实跑 23 例:7 绿 / 16 红(与 R121 逐项一致) | 测试负责人(第 122 轮实测) | 2026-11-10 12:10 | 待处理(P1) |