|
@@ -0,0 +1,148 @@
|
|
|
|
|
+# XAF(浠艾福)测试闭环执行报告 · 2026-11-07 16:46
|
|
|
|
|
+
|
|
|
|
|
+- **对照基线**:16:36 轮(`3b1e761b4`)浏览器 13/15(admin 3/5 + frontend 6/6 + shop-api 4/4)、cfc-frontend 313/313、cfc-web 90/90、cfc-langgraph 51/0/12、后端采信 14:46 基线 286 类 / 2375 例 / 95.16%
|
|
|
|
|
+- **历史审查记录**:本对象为长周期多轮闭环对象,记忆库已沉淀 70 轮结论;本次非首次审查,结论**全部重新取证**,不沿用历史判定。上次遗留缺口:B-46(admin 登录 E2E 三度红)、B-42(远程派发通道)、B-39/B-40(skipTests 假绿 / CI 软门禁)。
|
|
|
|
|
+- **本轮定位**:**不再只复述红例**——对连续 3 轮同因失败的 B-46 做只读取证并**推翻前 3 轮定性**(测试脚本缺陷,非部署回归),修复用例后浏览器全套件转全绿;另在打通 Maven 工具链后**首次实测出主干编译阻断**(B-47)。
|
|
|
|
|
+
|
|
|
|
|
+## 一、执行范围与节点分派
|
|
|
|
|
+
|
|
|
|
|
+| 目标 | 类型 | 命令 | 节点分派 |
|
|
|
|
|
+|------|------|------|----------|
|
|
|
|
|
+| `http://cfc.iwintrue.com/admin` | 浏览器 E2E(Playwright/chromium,桌面视口) | `playwright.config.live.js --project=admin-desktop` | **本机**(192.168.16.189 不可达,见 §1.1) |
|
|
|
|
|
+| `http://cfc.iwintrue.com/frontend` | 浏览器 E2E(移动视口) | `--project=frontend-mobile` | 本机(同上,串行) |
|
|
|
|
|
+| 商城价格排序契约(需求变更 S1) | 接口契约 E2E | `--project=shop-api` | 本机 |
|
|
|
|
|
+| cfc-frontend | 单元/组件 Jest | `npx jest --ci` | 本机 |
|
|
|
|
|
+| cfc-web | 单元/组件 Jest | `npx jest --ci` | 本机 |
|
|
|
|
|
+| cfc-langgraph | pytest | `.venv/Scripts/python -m pytest tests -q --ignore=tests/qna` | **本机兜底**(251 未在听,见 §1.1) |
|
|
|
|
|
+| cfc-backend | JUnit(surefire) | `mvn -o -B -DskipTests=false test`(JDK1.8.0_25 + Maven 3.9.9) | 本机(`D:\_wt_b47` 隔离预览树) |
|
|
|
|
|
+
|
|
|
|
|
+**档位**:review(离线)。未联网、未装依赖、未启停被审服务、**未修改主干任何生产代码**。
|
|
|
|
|
+
|
|
|
|
|
+### 1.1 节点可用性(本轮探活实测)
|
|
|
|
|
+
|
|
|
|
|
+| 节点 | 端口 | 结果 | 影响 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| 192.168.16.189 | 22 / 80 / 4090 | TCP 连接拒绝 / HTTP 000 | 浏览器任务**无法分派**,本机单节点串行执行(符合「每节点仅一个浏览器任务」) |
|
|
|
|
|
+| 192.168.16.251 | 9000(LangGraph) | TCP 000(超时) | langgraph 测试**无法按指令分派该节点**,改本机 pytest 兜底(B-42 持续) |
|
|
|
|
|
+| 本机 127.0.0.1 | 9000 | 未在听 | 同上 |
|
|
|
|
|
+| `cfc.iwintrue.com` | 80 | admin 200 / frontend 200 | 可测 |
|
|
|
|
|
+
|
|
|
|
|
+## 二、用例总数 · 通过 · 失败
|
|
|
|
|
+
|
|
|
|
|
+### 2.1 本轮新鲜实跑
|
|
|
|
|
+
|
|
|
|
|
+| 套件 | 类/规格 | 用例数 | 通过 | 失败 | 跳过 | 耗时 |
|
|
|
|
|
+|------|---------|--------|------|------|------|------|
|
|
|
|
|
+| 浏览器 E2E · `/admin`(修复后) | 1 规格 | 5 | **5** | 0 | 0 | 76 s |
|
|
|
|
|
+| 浏览器 E2E · `/frontend` | 1 规格 | 6 | **6** | 0 | 0 | 39 s |
|
|
|
|
|
+| 浏览器 E2E · 商城排序契约 `/api` | 1 规格 | 4 | **4** | 0 | 0 | 0.3 s |
|
|
|
|
|
+| cfc-frontend Jest | 16 套件 | 313 | **313** | 0 | 0 | 9.5 s |
|
|
|
|
|
+| cfc-web Jest | 12 套件 | 90 | **90** | 0 | 0 | 11.9 s |
|
|
|
|
|
+| cfc-langgraph pytest | — | 63 | **51** | 0 | 12 | 103 s |
|
|
|
|
|
+| **小计** | — | **481** | **469** | **0** | **12** | — |
|
|
|
|
|
+| cfc-backend JUnit(隔离预览树) | 288 类 | 2389 | **2270** | **65F+50E** | 4 | 25:38 |
|
|
|
|
|
+| **合计** | — | **2870** | **2739** | **115** | **16** | — |
|
|
|
|
|
+
|
|
|
|
|
+- **合计通过率 95.44%**(含 skip 分母);剔除 skip 后 **95.97%**。
|
|
|
|
|
+- 前端三端(小程序/管理端/商城契约)+ langgraph **零失败**;**唯一红区仍在后端**。
|
|
|
|
|
+
|
|
|
|
|
+### 2.2 后端评测口径声明(重要)
|
|
|
|
|
+
|
|
|
|
|
+- **主干 HEAD 本身编译不通过**(B-47):`HuaweiAuthService.java:246` 使用 JDK10+ 的 `URLEncoder.encode(String, Charset)`,而 pom 声明 `java.version=1.8`、本机 JDK 1.8.0_25 → `mvn` 在 `default-compile` 即报 `Charset 无法转换为 String`,`_r1646_targeted.log` 为证。**即:按主干原样,后端 0 例可执行**。
|
|
|
|
|
+- 为取得可比的通过率,在**仓库外隔离预览树** `D:\_wt_b47`(`git worktree` @ `3b1e761b4`)内做了**唯一 1 处、共 4 行**的编译修补(`try/catch UnsupportedEncodingException`,不改语义),随后全量跑通。该修补**未提交、未进入主干**,仅用于测量。
|
|
|
|
|
+- 因此 §2.1 的后端数字口径为「**HEAD 代码 + 1 处编译修补**」,不等于主干可构建;主干可构建性判定见 B-47。
|
|
|
|
|
+
|
|
|
|
|
+### 2.3 与历史基线对账
|
|
|
|
|
+
|
|
|
|
|
+| 口径 | 类 | 用例 | 通过率 | 红类 | 红例 |
|
|
|
|
|
+|------|----|------|--------|------|------|
|
|
|
|
|
+| 14:46 采信基线(含研发 WIP 测试修复) | 286 | 2375 | 95.16% | 26 | 69 |
|
|
|
|
|
+| **本轮(干净 HEAD + 编译修补)** | **288** | **2389** | **95.02%** | **35** | **115** |
|
|
|
|
|
+| 差值归因 | +2 类 +14 例 | — | −0.14pt | +9 | +46 |
|
|
|
|
|
+
|
|
|
|
|
+- **+2 类 / +13 例**:`LegacyDimensionCallFilterTest`(6) + `LegacyDimensionCallLogServiceTest`(7),P2-T3 新增,**本轮实测 13/13 绿**(§3.3 同时纠正「188 例」误记)。
|
|
|
|
|
+- **+46 红例**:差值全部来自「干净树不含研发主工作区 68 项 WIP 测试修复」这一唯一变量(B-29 同族),非新增回归;本轮已逐类对账,无「历史绿类转红」的新增类。
|
|
|
|
|
+- 红例类型分布:`AssertionFailed` 49 + `AssertionError` 5 = **54**(断言基线漂移)、`NPE` **26**(夹具)、Mockito 误用族(`InvalidUseOfMatchers` 6 + `MockitoException` 5 + `WantedButNotInvoked` 8 + `ArgumentsAreDifferent` 3)= **22**、`IllegalStateException` 8、`NoSuchElement` 4、`DataIntegrityViolation` 1(`platform_fee` 截断,真实问题候选)。**本轮无环境型 DB 红**(上轮 8 例环境红未复现)。
|
|
|
|
|
+
|
|
|
|
|
+## 三、关键结论
|
|
|
|
|
+
|
|
|
|
|
+### 3.1 B-46 关闭:根因是测试脚本,**不是部署回归**(本轮最高价值)
|
|
|
|
|
+
|
|
|
|
|
+- **推翻前 3 轮定性**。15:38/16:13/16:36 三轮判「admin 登录按钮启用链路随部署变更失效(P0 候选)」。本轮只读取证给出反证:
|
|
|
|
|
+ 1. 失败截图(`_artifacts_live/...TC-A-U04/test-failed-1.png`)显示滑块提示仍是「**请按住滑块拖动到最右侧完成验证**」、`.slider-fill` 宽度 **0%** → 滑块**根本没有位移**,而按钮 `:disabled="!captchaPassed"`(`cfc-web/src/views/login.vue:246`)只认滑块 `success` 事件 → 按钮置灰是**正确行为**,不是服务端/部署拒绝。
|
|
|
|
|
+ 2. 诊断脚本 `_diag_admin_u04seq_1646.cjs` 复刻 U04 时序取证:输入手机号后「登录身份」由 500ms 防抖 API `/api/admin-auth/account-roles` 异步带回;用例在该值为空时 `click()` 展开 el-select,**popper 浮层正压在下方滑块之上**,随后 `mouse.down` 命中浮层而非 `.slider-track` → `onDragStart` 不触发 → `offset` 恒 0。取证输出:`ROLE_VALUE ""` → `OPT_VISIBLE false` → `ROLE_AFTER_CLICK 超级管理员` → `DROPDOWN_OPEN true` → `U04SEQ_RESULT {hint:"请按住滑块…", fillW:"0%", btnDisabled:true}`。
|
|
|
|
|
+ 3. 反向验证(`_diag_admin_fix_1646.cjs`):**等待身份自动带出、不点开下拉**后拖动 → `hint:"验证通过"`、`btnDisabled:false`、真实登录落到 `/admin/dashboard`、菜单项 **102**。
|
|
|
|
|
+ 4. 另一条**假绿哨兵**:TC-A-U02 原断言「不含『拖动到最右侧』」会被**失败态文案「验证失败,请重试」满足** → 「滑块机制是否可用」这一关键前提长期未设防,是三轮误判的放大器。
|
|
|
|
|
+- **修复**(仅测试资产,未动生产代码):新增 `waitIdentityAutoFilled()`(等身份带出,禁止点开下拉)、`dismissPoppers()`(拖动前 Escape + 保底点空白清浮层)、`dragSliderToEnd()` 增加强断言「验证通过」;TC-A-U02 改为断言「验证通过」+ 登录按钮 `toBeEnabled()`;U04/U05 增身份带出前置断言。
|
|
|
|
|
+- **实测**:admin **5/5**、浏览器全套件 **15/15**(此前 13/15),连续两轮复跑稳定。
|
|
|
|
|
+
|
|
|
|
|
+### 3.2 B-47(新增 · P0 构建阻断):主干在 JDK8 下无法编译
|
|
|
|
|
+
|
|
|
|
|
+- `978d1bc95 feat(huawei-health)`(今日 14:36 入主干)在 `HuaweiAuthService.java:246` 写入 `URLEncoder.encode(s, StandardCharsets.UTF_8)`;该 `(String, Charset)` 重载**JDK10 才引入**,项目声明并运行于 JDK8。
|
|
|
|
|
+- 影响:后端 2375+ 例**一行都跑不了**(本轮后端零实测的直接原因);JDK8 构建/部署链路被打断;若改用 JDK11+ 编译却部署到 JDK8,则运行期 `NoSuchMethodError`(华为健康授权首次 `encode` 即 500)。
|
|
|
|
|
+- 可精确定位:同文件与同仓其余 5 处(`ReportCollectService:972`、`ReportScriptGeneratorService:283`、`XiaomiAuthService:87-89`)**均正确用 `.name()`**,本处是唯一例外;隔离树验证「补 try/catch 后 BUILD SUCCESS」,属单点缺陷。
|
|
|
|
|
+
|
|
|
|
|
+### 3.3 B-49(新增 · 数据质量):台账「188 例」实为 13 例
|
|
|
|
|
+
|
|
|
|
|
+- 16:36 轮记「P2-T3 新增 2 测试类 188 例(72+116)」。本轮复算:`git show --name-only --diff-filter=A df8af9a2b` 仅这两个类,`grep -c @Test` = **6 + 7 = 13**;实跑 `Tests run: 13, Failures: 0, Errors: 0`,与该提交自身说明「6+7=13/13」一致。**虚增 175 例**,会使通过率分母与待核实工作量双向失真。
|
|
|
|
|
+
|
|
|
|
|
+### 3.4 其余套件零漂移
|
|
|
|
|
+
|
|
|
|
|
+- cfc-frontend 313/313(连续多轮 100%)、cfc-web 90/90、langgraph 51/0/12、frontend H5 6/6、商城排序契约 4/4(需求变更 S1 回归通过)。
|
|
|
|
|
+
|
|
|
|
|
+## 四、问题清单(五要素)
|
|
|
|
|
+
|
|
|
|
|
+### P1 · 主干 JDK8 编译失败(🔴 P0 构建阻断 · B-47)
|
|
|
|
|
+
|
|
|
|
|
+① **问题描述**:`cfc-backend` 在项目声明工具链(JDK 1.8)下 `mvn compile` 失败,全部 2375+ JUnit 用例无法执行;主干当前不可构建。
|
|
|
|
|
+② **测试 bug 点/用例**:`cfc-backend/src/main/java/com/etotem/cfc/service/huawei/HuaweiAuthService.java:246`(`encode()`);复现命令 `mvn -o -B -DskipTests=false -Dtest=LegacyDimension* test`,证据 `_r1646_targeted.log`(`Charset 无法转换为 String`)。
|
|
|
|
|
+③ **最优修改方案**:改为 `try { return URLEncoder.encode(s, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { throw new IllegalStateException(e); }`(与同仓 5 处写法对齐);或经评审把 `maven.compiler.release` 抬到 11 并同步部署 JDK 与 CI 镜像。**建议当日修**。
|
|
|
|
|
+④ **修改目的**:恢复「任意 JDK8 环境下后端可构建、可跑测、可部署」,解除目标①的全量阻断。
|
|
|
|
|
+⑤ **闭环**:JDK8 下 `mvn -o -B -DskipTests=false test` BUILD 成功且 surefire 出 XML(>0);`HuaweiHealth*` 相关用例跑通。隔离树已预验证可行。
|
|
|
|
|
+
|
|
|
|
|
+### P2 · 后端 115 红例(🟠 主体为测试资产漂移)
|
|
|
|
|
+
|
|
|
|
|
+① **问题描述**:干净 HEAD(+编译修补)后端 288 类 2389 例中 35 类 115 例红,通过率 95.02%,未达 G1。
|
|
|
|
|
+② **测试 bug 点/用例**:断言基线 54(如 `AuthControllerTest` 4F、`GuideOrderControllerTest` 6F+2E、`CfCommissionServiceSettleTest` 8F);NPE 26(夹具);Mockito 误用 22(`ArticleControllerTest` 4F+5E、`PaymentControllerTest` 4F 等,B-18 同族)。
|
|
|
|
|
+③ **最优修改方案**:把研发主工作区 68 项 WIP 测试修复按类提交入库(B-29 已验证可一次回收约 46 例);断言类按「实现现状或需求」逐条裁决,Mockito 类统一改为 `when(mock.method(...))` 形式;`platform_fee` 截断 1 例由研发核 schema。
|
|
|
|
|
+④ **修改目的**:把 95.02% 抬至 ≥96%(G1),使「全部用例通过」具备可推进路径。
|
|
|
|
|
+⑤ **闭环**:修复提交后重跑全量,红类集合差集∑恰为修复目标类、其余类逐字段零漂移。
|
|
|
|
|
+
|
|
|
|
|
+### P3 · 远程派发通道仍不可用(🟡 持续 · B-42)
|
|
|
|
|
+
|
|
|
|
|
+① 189 节点 TCP 22/80/4090 全部拒绝,251 节点 9000 超时 → 浏览器任务无法分派 189、langgraph 测试无法按指令分派 251,本轮全部在本机单节点串行完成。
|
|
|
|
|
+② 环境/运维问题,非代码。
|
|
|
|
|
+③ 运维确认两节点服务与网络策略(189 的 4090 opencode、251 的 9000),并在可达后再执行一次分派验证。
|
|
|
|
|
+④ 落实用户「浏览器任务分节点、langgraph 派 251」的编排约束。
|
|
|
|
|
+⑤ 189 节点成功执行 1 个浏览器任务 + 251 节点成功执行 langgraph pytest 且结果可回收。
|
|
|
|
|
+
|
|
|
|
|
+### P4 · langgraph 部署态落后(🟡 未复测 · B-43)
|
|
|
|
|
+
|
|
|
|
|
+① 上轮线上实测 `POST https://ai.etotem.com.cn/api/v1/questionnaire/generate` → 500(`prompt_template` 缺字段),部署包落后于仓库。
|
|
|
|
|
+② 属发布侧问题;本轮未连外网复测(review 档不联网)。
|
|
|
|
|
+③ 重新构建并发布 LangGraph 服务后按同一 curl 回归。
|
|
|
|
|
+④ 消除 `/api/family/questionnaire` 的 100% 静默降级。
|
|
|
|
|
+⑤ 接口 200 且问卷 JSON 非空,线上 `/openapi.json` 出现 `prompt_template`。
|
|
|
|
|
+
|
|
|
|
|
+## 五、门禁结论
|
|
|
|
|
+
|
|
|
|
|
+| 门槛 | 标准 | 实测 | 判定 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| G1 后端用例通过率 | ≥96% | **95.02%**(288 类/2389 例) | ❌ |
|
|
|
|
|
+| G2 红例数 | ≤40 | **115** | ❌ |
|
|
|
|
|
+| G3 前端三端 | 全绿 | 313 + 90 + 4 + 6 = 413/413 | ✅ |
|
|
|
|
|
+| G4 编译(JDK8 声明工具链) | BUILD 成功 | **失败**(B-47) | ❌ |
|
|
|
|
|
+| G5 testCompile / 完整性 | 全类产出 XML | 288 类有 XML,沉默 0 | ✅ |
|
|
|
|
|
+| G6 浏览器 E2E | 全绿 | **15/15** | ✅ |
|
|
|
|
|
+| G7 langgraph pytest | 0 失败 | 51 passed / 12 skipped | ✅ |
|
|
|
|
|
+| G8 CI 门禁 | blocking 全量 | 仍为软门禁 + integration 排除(B-40) | ❌ |
|
|
|
|
|
+| G9 SRS/场景覆盖 | 可量化 | 台账 TC 锚点仍为 0(B-30) | ❌ |
|
|
|
|
|
+| G10 节点分派 | 按指令分派 | 189/251 均不可达 | ❌ |
|
|
|
|
|
+
|
|
|
|
|
+**结论:不通过**。较上轮的变化是**方向性反转**:浏览器验收从 13/15 转 **15/15 全绿**(B-46 关闭,且证明为测试缺陷而非产品回归),但同时在打通 Maven 后**首次暴露主干 JDK8 编译阻断(B-47, P0)**——即「可测的绿了,可构建的断了」。目标①仍受 P1/P2 阻断,目标②(SRS 全量覆盖可量化)无实质推进。
|
|
|
|
|
+
|
|
|
|
|
+## 六、变更触发动作
|
|
|
|
|
+
|
|
|
|
|
+- **结果有变化** → 已提交并 push `origin/cfclub`(报告 + `blockers.md`:B-46 关闭 / 新增 B-47、B-48、B-49 / 用例修复 `tests/e2e-live/admin-live.spec.js`)。
|
|
|
|
|
+- **研发通知载体**:仓库主干报告(研发拉取即见)+ blockers 表 B-47 行(P0 需当日修)。本环境无已配置的研发邮箱收件人,未发外部邮件。
|
|
|
|
|
+- 未触碰研发主工作区 68 项 WIP;隔离预览树 `D:\_wt_b47` 与本轮临时诊断脚本在收尾时清理。
|