|
|
@@ -0,0 +1,221 @@
|
|
|
+# XAF(浠艾福)测试闭环执行报告 · 2026-11-07 13:25
|
|
|
+
|
|
|
+- **执行人**:陆谨(软件测试专家团主理人 / 测试架构师)· 定时自动化,全程无人工干预
|
|
|
+- **执行档**:review(内网目标 + 已部署站点只读访问;未安装依赖、未改生产源码、未重置任何数据库)
|
|
|
+- **仓库/分支/HEAD**:`d:/cfc` · `cfclub` · `dab532903`(跑测前后一致)
|
|
|
+- **工作区口径**:主工作区含 57 项 WIP(其中 11 个后端测试文件 `M`),本轮后端结果为**「WIP 代入」口径**,非干净基线
|
|
|
+- **权威干净基线(对照)**:`7c3bdae58` 全量 clean = **286 类 / 2375 例 / 95.16%**;`7c3bdae58..HEAD` 的 `cfc-backend/src`、`cfc-web/src`、`cfc-frontend`、`cfc-langgraph/src` **源码零变更**(仅 docs/tools 提交)
|
|
|
+- **SRS 闸门基线**:`9daeaa660`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、环境与执行通道(本轮实测,非沿用结论)
|
|
|
+
|
|
|
+| 目标 | 探测结果 | 判定 |
|
|
|
+|---|---|---|
|
|
|
+| `http://cfc.iwintrue.com/admin` | 302 → `/admin/` 200,`text/html`,`<title>浠艾福管理后台</title>` | ✅ 浏览器自动化可用 |
|
|
|
+| `http://cfc.iwintrue.com/frontend` | 302 → `/frontend/` 200,uni-app H5,落地 `#/pages/index-home/index` | ✅ 浏览器自动化可用 |
|
|
|
+| 后端 API | `POST /api/admin-auth/login-by-password` → 200 `{code:200,...token}` | ✅ 存活 |
|
|
|
+| 本机节点(浏览器自动化) | Chromium 1243 已装;4091(opencode web)、9082(backend)在听 | ✅ 已执行 2 个任务(串行) |
|
|
|
+| `192.168.16.189:4090`(浏览器自动化节点) | TCP **OPEN**,opencode `v2.0.31` 可连;但 `/openapi.json` → 401,`opencode run --server` 报 `Location not found: D:\cfc` | ⚠️ 节点在线、**派发通道不可用**(客户端 2.2.5 与服务端 2.0.31 协议/路径不匹配) |
|
|
|
+| `192.168.16.251`(langgraph 主机) | 22/80/443/3306/6379/8080 OPEN;**9000 CLOSED**、4090 CLOSED | ⚠️ 主机在线、**opencode 派发未暴露** |
|
|
|
+| LangGraph 服务(部署态) | `https://ai.etotem.com.cn/health` → `{"status":"ok"}`,`cfc-langgraph v0.3.0` | ✅ 线上服务可达,已做 API 级实测 |
|
|
|
+
|
|
|
+> 结论:**「每个节点只能跑一个浏览器自动化任务」已遵守**——两个浏览器任务在本机严格串行执行;189 节点因派发协议不可用未能承接,已如实标注,不记为通过。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、用例总数 · 通过 · 失败
|
|
|
+
|
|
|
+| 层 | 套件 | 用例 | 通过 | 失败 | 错误 | 跳过 | 耗时 |
|
|
|
+|---|---|---|---|---|---|---|---|
|
|
|
+| 浏览器 E2E · 管理端(本机,/admin) | 1 | 5 | **5** | 0 | 0 | 0 | 2.7 min |
|
|
|
+| 浏览器 E2E · 小程序 H5(本机,/frontend) | 1 | 6 | **6** | 0 | 0 | 0 | 1.4 min |
|
|
|
+| cfc-frontend Jest(单元/组件) | 16 | 313 | **313** | 0 | 0 | 0 | 71 s |
|
|
|
+| cfc-web Jest(单元/组件) | 12 | 90 | **90** | 0 | 0 | 0 | 303 s |
|
|
|
+| 根级 tests Jest(接口/集成) | 2 | 23 | 0 | 0 | 0 | **23(全 skip)** | 30 s |
|
|
|
+| cfc-langgraph pytest(本地脚本级) | — | 63 | **51** | 0 | 0 | 12 | 352 s |
|
|
|
+| LangGraph 线上 API(部署态 vs 251) | — | 3 | 2 | **1** | 0 | 0 | — |
|
|
|
+| cfc-backend surefire(主工作区 WIP 口径) | 见 §三 | 见 §三 | 见 §三 | 见 §三 | 见 §三 | 见 §三 | 进行中 |
|
|
|
+
|
|
|
+**本轮已实测合计(不含后端与 skip)**:**467 例 / 466 通过 / 1 失败**(通过率 99.79%);另 23 例根级套件全 skip(0 执行,不计入通过)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、后端全量(进行中,如实标注)
|
|
|
+
|
|
|
+- 命令:`mvn -o -B clean test -DskipTests=false -Dmaven.test.failure.ignore=true`(JDK1.8 + Maven 3.6.1,全量不排除)
|
|
|
+- 状态:**尚未跑完**(本机同时承载其他自动化会话,单类耗时显著劣化,`ActivityControllerTest` 461.7s、`AIChatControllerTest` 407.9s)
|
|
|
+- 截至报告时刻进度:**50 类 / 461 例 / 456 通过 / 3F / 2E(98.92%)**,红类 2 个:
|
|
|
+ - `GuideFamilyTaskControllerTest` 20 例 **2F 1E**
|
|
|
+ - `GuideRolePermissionTest` 21 例 **1F 1E**
|
|
|
+ - 两者均为**主工作区 WIP 中被修改的测试文件**,且与 B-29 遗留清单(GuideFamilyTask 3 + GuideRolePermission 2)逐例吻合 → 属已知遗留,非本轮新增回归
|
|
|
+- 对照口径:源码零变更 → 预期收敛于干净基线 **286 类 / 2375 例 / 95.16%**(WIP 代入理论值 96.93%,B-29 已验证过一次)
|
|
|
+- 节流说明:本机同时承载其他自动化会话,单类耗时为常态的 3–4 倍(`ActivityControllerTest` 461.7s、`AIChatControllerTest` 407.9s),全量预计需数小时,故本节按「进度快照」呈现
|
|
|
+- **本轮不以后端数字作为门禁达标依据**,仅作进度与红类观测;下一轮以跑完的全量结果替换本节
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、浏览器自动化明细(本轮核心增量)
|
|
|
+
|
|
|
+### 4.1 管理端 `/admin`(5/5)
|
|
|
+
|
|
|
+| 用例 | 断言要点 | 证据 |
|
|
|
+|---|---|---|
|
|
|
+| TC-A-U01 登录页可渲染 | 标题「浠艾福管理后台」、`用户名/手机号`+`密码` 输入框、`登 录` 按钮 | `_artifacts_live/admin-01-login.png` |
|
|
|
+| TC-A-U02 滑块人机验证 | `.slider-captcha` 存在,真实鼠标分步拖动到轨道末端后提示文案改变(验证通过) | `admin-02-captcha-passed.png` |
|
|
|
+| TC-A-U03 未登录拦截 | 未登录访问 `/admin/` 落到登录页 | — |
|
|
|
+| TC-A-U04 管理员真实登录 | 填账号+密码+拖滑块+点登录 → **离开登录页**、渲染后台主框架菜单 >3 项 | `admin-04-logged-in.png`(运营驾驶舱,14 组侧边菜单) |
|
|
|
+| TC-A-U05 菜单可访问 | 遍历一级菜单 ≥6 个,视图切换成功,**0 个未捕获 JS 异常** | `admin-05-menu-walk.png` |
|
|
|
+
|
|
|
+> **重要:本轮推翻了历史「管理端真实登录无法自动化」的判断**——登录页滑块是自研 `.slider-thumb` 组件,Playwright 鼠标轨迹分步拖动可通过;`cfc-web` 登录链路端到端可用(此前 12:25 轮记为「仅探针 302 可达」)。
|
|
|
+
|
|
|
+### 4.2 小程序 H5 `/frontend`(6/6)
|
|
|
+
|
|
|
+| 用例 | 断言要点 | 证据 |
|
|
|
+|---|---|---|
|
|
|
+| TC-F-U01 首页渲染 | hash 路由 `#/pages/*`、`uni-page` 根节点、TabBar 四入口(首页/健康/成长/我的)、0 未捕获异常 | `frontend-01-index.png` |
|
|
|
+| TC-F-U02 核心内容 | 五维(身/心/智/富/行)+ 能量沙盘 + 正文 >200 字 | `frontend-02-index-content.png` |
|
|
|
+| TC-F-U03 切「健康」 | 路由变化且仍渲染页面、0 异常 | `frontend-03-health.png` |
|
|
|
+| TC-F-U04 切「成长」 | 路由变化、0 异常 | `frontend-04-growth.png` |
|
|
|
+| TC-F-U05 未登录「我的」 | 出现登录/注册入口(鉴权引导) | `frontend-05-mine.png` |
|
|
|
+| TC-F-U06 首屏资源 | js/css 关键资源 0 加载失败 | — |
|
|
|
+
|
|
|
+### 4.3 新增用例与 SRS/场景映射(B-30 的锚点缺口部分闭环)
|
|
|
+
|
|
|
+新增自动化用例 **11 条**,全部带 `TC-` 编号锚点(此前全仓 348 个测试资产中 TC 编号出现 **0 次**):
|
|
|
+
|
|
|
+| TC 编号 | 场景/SRS 域 | 载体 |
|
|
|
+|---|---|---|
|
|
|
+| TC-A-U01~U05 | 管理员登录 → 后台主框架 → 核心菜单(`docs/flows/admin-overview-flow.md`) | `tests/e2e-live/admin-live.spec.js` |
|
|
|
+| TC-F-U01~U06 | 游客浏览首页 → 五维沙盘 → TabBar 导航 → 未登录「我的」鉴权引导 | `tests/e2e-live/frontend-live.spec.js` |
|
|
|
+
|
|
|
+配置 `tests/playwright.config.live.js` **刻意不带 globalSetup**——默认配置的 `globalSetup` 会执行 `reset-db.sh` 重置共享测试库,打已部署站点的 UI 套件绝不能触发。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、LangGraph(251 部署态)实测
|
|
|
+
|
|
|
+| 探测 | 结果 |
|
|
|
+|---|---|
|
|
|
+| `GET /health` | 200 `{"status":"ok"}` |
|
|
|
+| `PUT /api/v1/chat`(POST,真实用户问题) | **200**,返回完整中文答复(74.8s)、`conversation_id`、`trace_id` 齐全 → 对话主链路可用 |
|
|
|
+| `POST /api/v1/questionnaire/generate` | **500** `{"error":"graph 执行失败: 'GenerateRequest' object has no attribute 'prompt_template'"}` |
|
|
|
+| 本地 `pytest tests --ignore=tests/qna` | **51 passed / 12 skipped / 0 failed**(352s,B-41 flaky 连续第 2 次满跑未复现) |
|
|
|
+
|
|
|
+> **本轮最高优先级发现(P0)**:线上 LangGraph **问卷生成 100% 失败**,且报错与 B-34 完全同源。台账在 67 轮以「本地 pytest 2 例转绿」把 B-34 判为「已解除」——**实测证明该结论只对仓库代码成立,对部署实例不成立**(线上 `GenerateRequest` schema 仍只有 `member_name/respondent_name/...`,无 `prompt_template` 字段,说明修复未发布)。已重开 B-34 为「未发布/未部署」,新增 B-43。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、五要素问题清单
|
|
|
+
|
|
|
+### P0-1 · 线上 LangGraph 问卷生成 500(B-34 复发:修复未部署)
|
|
|
+1. **问题描述**:`POST https://ai.etotem.com.cn/api/v1/questionnaire/generate` 返回 500,错误 `'GenerateRequest' object has no attribute 'prompt_template'`;线上 `/openapi.json` 的 `GenerateRequest` 仍无该字段。
|
|
|
+2. **测试 bug 点**:`cfc-langgraph/src/schemas/questionnaire.py`(`GenerateRequest` 缺 `prompt_template`)与 `src/graphs/questionnaire.py:39 build_prompt` 直读该字段;**部署包为修复前版本**(线上 v0.3.0 schema 可证)。
|
|
|
+3. **最优修改方案**:① `GenerateRequest` 增 `prompt_template: Optional[str] = None`(与 `TongueRequest` 对齐);② `build_prompt` 用 `getattr(req, 'prompt_template', None)` 防御;③ **重新构建并发布 251 上的 LangGraph 镜像/进程**,发布后用同一条 curl 回归。
|
|
|
+4. **修改目的**:恢复 `/api/family/questionnaire` 的 AI 问卷生成(当前 100% 静默降级),使核心 AI 链路可用。
|
|
|
+5. **闭环方式**:同一 curl 返回 200 且问卷 JSON 非空;`pytest tests/test_graph.py` 2 例仍绿;线上 `/openapi.json` 的 `GenerateRequest` 出现 `prompt_template`。
|
|
|
+
|
|
|
+### P0-2 · 浏览器自动化节点 189 无法承接任务(B-42 根因收敛)
|
|
|
+1. **问题描述**:`192.168.16.189:4090` 网络与 opencode 服务均在线(v2.0.31),但 API 需鉴权(`/openapi.json` 401),`opencode run --server` 报 `Location not found: D:\cfc`——客户端把本地 cwd 当作远端目录下发,远端实际为 `c:/code/cfc`。
|
|
|
+2. **测试 bug 点**:`.tdd/config.json` 的 `opencode_sessions.production` 只声明 id/label,**未提供鉴权方式与远端目录映射**;本机 opencode CLI 2.2.5 与该服务端 2.0.31 版本不匹配。
|
|
|
+3. **最优修改方案**:① 在 189 上把 opencode 升级到 2.2.x 或锁本机 CLI 到 2.0.x;② 配置项补充 `auth`(token 环境变量)与 `remote_dir`;③ 修好前,浏览器任务统一由本机串行承接(本轮即如此)。
|
|
|
+4. **修改目的**:恢复「双节点并行」设计意图,让 /admin 与 /frontend 可真正并行而非串行。
|
|
|
+5. **闭环方式**:`opencode run --server http://192.168.16.189:4090 "echo ok" c:/code/cfc` 返回 OK;两节点同时各跑 1 个 Playwright 任务成功。
|
|
|
+
|
|
|
+### P1-1 · 根级接口套件 23 例全 skip(B-36 仍未闭环)
|
|
|
+1. **问题描述**:`tests/` 根级 jest 本轮 2 套件 23 例**全部 skipped,0 例执行**——接口层验收从「假红」变「真空」。
|
|
|
+2. **测试 bug 点**:`tests/integration/mini-games-api.spec.js:6-11`、`plan-chain.spec.js:21-22` 门控 `CFC_API_E2E==='1' && CFC_API_TOKEN`,且 `ADMIN_PHONE/ADMIN_PASSWORD` 为空。
|
|
|
+3. **最优修改方案**:新增 `tests/.env.test` + `globalSetup` 自动登录取 token 写入 `CFC_API_TOKEN`,`API_BASE_URL` 指向 `http://cfc.iwintrue.com`。
|
|
|
+4. **修改目的**:让 23 例在每轮默认执行,恢复接口层信号。
|
|
|
+5. **闭环方式**:`CFC_API_E2E=1 npm test` 实跑 23 例且失败均有归因;纳入 CI。
|
|
|
+
|
|
|
+### P1-2 · `pom.xml` 默认 `skipTests=true`(B-39 未修)
|
|
|
+1. **问题描述**:`cfc-backend/pom.xml:28` 默认跳过测试,`mvn test` 会 `BUILD SUCCESS` 但 0 用例执行(假绿)。
|
|
|
+2. **测试 bug 点**:`cfc-backend/pom.xml:28` + `:232` surefire 引用 `${skipTests}`。
|
|
|
+3. **最优修改方案**:改为 `false`,跳过由命令行 `-DskipTests` 显式控制;CI 增加「surefire-reports XML 数 > 0」守卫。
|
|
|
+4. **修改目的**:消除本地/CI「假绿」风险。
|
|
|
+5. **闭环方式**:默认 `mvn test` 产出 >0 XML;CI 守卫在 0 XML 时报红。
|
|
|
+
|
|
|
+### P2-1 · 管理端驾驶舱文案与统一用户模型不一致(新发现)
|
|
|
+1. **问题描述**:登录后「运营驾驶舱」统计卡显示「**孩子总数 4256**」,而 AGENTS.md 已明确「新功能禁止再引入『孩子』概念,统一用能登录用户/不能登录用户」。
|
|
|
+2. **测试 bug 点**:`cfc-web` 运营驾驶舱统计卡文案(`admin-04-logged-in.png` 可见)。
|
|
|
+3. **最优修改方案**:文案改为「未开通登录的子成员」或按口径拆为「能登录用户 / 不能登录用户」两卡。
|
|
|
+4. **修改目的**:产品口径统一,避免运营侧误读。
|
|
|
+5. **闭环方式**:TC-A-U04 增断言:驾驶舱不出现「孩子总数」字样(当前为红灯基线,改文案后转绿)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、20 类测试覆盖矩阵(三态)
|
|
|
+
|
|
|
+| # | 类型 | 状态 | 证据 |
|
|
|
+|---|---|---|---|
|
|
|
+| 1 | 单元测试 | 已发现 | 后端 290 测试文件 / 2366 `@Test`;前端 Jest 16 套 313 例 |
|
|
|
+| 2 | 测试覆盖率 | 未发现 | 无 JaCoCo(pom 无插件、离线不可得)→ 仅 surefire 口径 |
|
|
|
+| 3 | 变异测试 | 未发现 | 无 PIT |
|
|
|
+| 4 | 集成测试 | 已发现 | `@SpringBootTest` 类 + 根级 23 例(**全 skip**) |
|
|
|
+| 5 | 契约测试 | 已发现 | 多契约类(历史红类含 MapContract 等) |
|
|
|
+| 6 | 接口 API 测试 | 已发现 | 根级 API 套件 + 本轮 admin 登录接口实测 |
|
|
|
+| 7 | 系统/端到端 | **已发现(本轮新增)** | `tests/e2e-live/` 11 例真实浏览器 |
|
|
|
+| 8 | 验收 UAT | 待核实 | 无 UAT 记录 |
|
|
|
+| 9 | BDD 规格 | 待核实 | 未发现 feature 文件 |
|
|
|
+| 10 | 冒烟测试 | 已发现 | `ci-smoke.spec.js` + 本轮两站点冒烟 |
|
|
|
+| 11 | 回归测试 | 已发现 | 每轮全量复跑 + 零漂移对账 |
|
|
|
+| 12 | 探索性测试 | 未发现 | 无 charter 记录 |
|
|
|
+| 13 | 性能测试 | 未发现 | 无 k6/JMeter 资产 |
|
|
|
+| 14 | 可靠性测试 | 未发现 | 无故障注入/恢复演练 |
|
|
|
+| 15 | 安全测试 | 待核实 | 历史 `docs/SECURITY_REVIEW_2026-11.md` 静态结论;本轮未跑 SAST/DAST |
|
|
|
+| 16 | 兼容性测试 | **已发现(本轮)** | 桌面 1440×900 + 移动 375×812 双视口真实渲染 |
|
|
|
+| 17 | 可用性测试 | 待核实 | 无真实用户测试 |
|
|
|
+| 18 | 无障碍测试 | 未发现 | 无 axe/WCAG 用例 |
|
|
|
+| 19 | QA 流程 | 待核实 | CI 存在但 4 个测试 job 为软门禁(B-40) |
|
|
|
+| 20 | 质量指标 | 已发现 | 本轮报告 + `docs/tdd/tools/test_report_metrics.py` |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、门禁结论
|
|
|
+
|
|
|
+**⛔ 不通过(有条件通过路径已明确)。**
|
|
|
+
|
|
|
+| 门禁 | 阈值 | 本轮实测 | 判定 |
|
|
|
+|---|---|---|---|
|
|
|
+| G1 后端用例通过率 | ≥95% | 未跑完(进度 48 类 98.88%);干净基线 95.16% | ⚠️ 待全量 |
|
|
|
+| G2 红例数 | 0 | 未跑完;基线 74 例(含环境红 8) | ❌ |
|
|
|
+| G3 前端 Jest | 100% | 313/313 + 90/90 | ✅ |
|
|
|
+| G4 测试可编译 | 0 错 | 全量 clean 已进入测试阶段(编译通过) | ✅ |
|
|
|
+| G5 用例集完整性 | 无沉默 | 48 类 48 报告,沉默 0(进行中) | ⚠️ 待全量 |
|
|
|
+| G6 CI 阻断门禁 | 4 个测试 job 必须阻断 | 4 个仍 `allow_failure`(B-40) | ❌ |
|
|
|
+| G7 状态机 RED 键 | 0 RED | 历史 3 伪 RED 键(本轮未变更) | ❌ |
|
|
|
+| G8 契约红类 | 0 | 未跑完;历史 3–4 类 | ⚠️ 待全量 |
|
|
|
+| G9 langgraph pytest | ≥95% | 51 pass / 0 fail(执行口径 100%) | ✅ |
|
|
|
+| **G10 线上 LangGraph 功能可用** | 关键接口 200 | **问卷生成 500**(P0-1) | ❌ |
|
|
|
+| **G11 浏览器 E2E** | 100% | 11/11(admin 5 + frontend 6) | ✅(首次达标) |
|
|
|
+| **G12 接口层零执行** | 23 例必须实跑 | 23/23 skip | ❌ |
|
|
|
+| **G13 测试资产入库** | 新增资产全部入库 | 本轮 11 例 + 配置待提交(见 §九) | ⚠️ 提交后转 ✅ |
|
|
|
+
|
|
|
+**转「通过」的必要条件**:① 发布 LangGraph 修复并复验问卷生成 200;② 后端全量跑完且红例=0(或环境红显式豁免);③ 4 个 CI job 转 blocking;④ 根级 23 例恢复执行;⑤ 189 派发通道修复后可双节点并行。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、产出与提交
|
|
|
+
|
|
|
+| 产出 | 路径 | 状态 |
|
|
|
+|---|---|---|
|
|
|
+| 本报告 | `docs/tdd/test/automation-run-2026-11-07-1325.md` | 待提交 |
|
|
|
+| 管理端 UI 套件(5 例) | `tests/e2e-live/admin-live.spec.js` | 待提交 |
|
|
|
+| 小程序 H5 UI 套件(6 例) | `tests/e2e-live/frontend-live.spec.js` | 待提交 |
|
|
|
+| 线上 UI 配置(无 globalSetup) | `tests/playwright.config.live.js` | 待提交 |
|
|
|
+| 阻断台账 | `docs/tdd/test/blockers.md`(B-34 重开、B-42 根因收敛、新增 B-43) | 待提交 |
|
|
|
+| 截图证据 | `_artifacts_live/*.png`(9 张) | 本地留存,不入库 |
|
|
|
+| 日志 | `_r1125_backend.log`、`_r1125_agg.py`、`_r1125_partial.json`、`_lg_openapi.json`、`_lg_q.json` | 本地留存 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十、未实测 / 待核实
|
|
|
+
|
|
|
+- 后端**其余 238 类未跑完**(本机负载导致,预计需更长时间),本轮不据此下达标结论
|
|
|
+- JaCoCo 行/分支覆盖率、PIT 变异:离线不可得
|
|
|
+- 性能/可靠性/无障碍/探索性:无工具、无资产(已给测试设计)
|
|
|
+- SAST/DAST/依赖漏洞深扫:需联网授权
|
|
|
+- `192.168.16.251` 上的 pytest **未在 251 本机执行**(opencode 派发未暴露、SSH 无凭据);本轮为「本机 pytest + 线上 API 级」替代口径,已在 §五 标注
|
|
|
+- 管理端其余 60+ UI spec 未在本轮执行(仅新增 5 例线上冒烟),历史 spec 依赖 `globalSetup` 重置库,需独立环境
|