|
|
@@ -0,0 +1,182 @@
|
|
|
+# 闭环自动化测试 · TDD 测试负责人汇报(2026-11-09 00:30,第 94 轮,本自动化)
|
|
|
+
|
|
|
+> 触发:定时自动化「测试负责人执行自动化测试闭环(全部用例通过 + 覆盖全部 SRS/场景 + 浏览器走 cfc.iwintrue.com/admin 与 /frontend + langgraph 派 251 + 结果有变化提交远程并通知研发)」。
|
|
|
+> 执行档:`review`(离线 + 内网已授权)——未联网装依赖、未启停生产服务、未改生产代码;浏览器套件本机单节点串行(`workers:1`,遵守「每节点单任务」)。
|
|
|
+> 基线:`cfclub` @ `76f29bc65`(= `origin/cfclub`);**跑测窗口内研发入库 `adb032a61`(签名横屏 S1/S2/S3 实现)**,故本轮同时是「SRS 实现落地首验轮」。
|
|
|
+> 节点拓扑实测:`192.168.16.189:4090` OPEN · `192.168.16.204:4091` OPEN · `192.168.16.251` `:9000` OPEN(`/health` ok)/`:4096` OPEN/`:3306` OPEN。
|
|
|
+> 汇报人:测试负责人(cfc-tester)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、结论摘要
|
|
|
+
|
|
|
+| 项 | 结果 |
|
|
|
+|---|---|
|
|
|
+| **门禁结论** | **不通过(有条件)** —— 12 项门禁 G1/G4/G5/G6/G8/G12 达标;G2/G3/G7/G9/G10/G11 未达标 |
|
|
|
+| 后端单测(本轮首次全量实测) | **2664 例 / 2611 过 = 98.01%**(历史新高,上轮采信 97.34%) |
|
|
|
+| 全量合计 | **3271 例 / 3163 过 = 96.70%**(剔 skip 96.91%),101 红 / 7 skip |
|
|
|
+| 浏览器线上 E2E | **28/28 全绿**(admin 5/5、frontend 6/6、shop-api 4/4、health-contract 13/13) |
|
|
|
+| 最大变化 | ①后端 98.01% 首次实测(推翻「本节点无 Maven」误判)②签名横屏 SRS 实现落地并补 7 例可执行用例 ③251 langgraph `chat` 挂起(新 P1) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、实跑结果总表
|
|
|
+
|
|
|
+| 套件 | 总数 | 通过 | 失败 | 跳过 | 通过率 | 与上轮(R93/R92)对比 |
|
|
|
+|---|---|---|---|---|---|---|
|
|
|
+| cfc-backend(Maven surefire,全量 clean) | 2664 | 2611 | 38F+11E | 4 | **98.01%** | R93 记「不可执行」→ 本轮首次实测(+98.01pp 数据可得性) |
|
|
|
+| cfc-frontend(Jest) | 394 | 369 | 24 | 1 | 93.65% | 383→394(**+11 例全绿**:成长页布局 4 + 签名横屏 7) |
|
|
|
+| cfc-web(Jest) | 116 | 116 | 0 | 0 | 100% | 零漂移 |
|
|
|
+| cfc-langgraph(pytest,本机 venv) | 44 | 32 | 12 | 0 | 72.73% | 与 R93 **逐例零漂移**(B-65 2 + B-74 6 + B-54 4) |
|
|
|
+| 浏览器 live(admin/frontend/shop) | 15 | 15 | 0 | 0 | 100% | R93 4/5 → **5/5**(B-76 未复现) |
|
|
|
+| 浏览器 health-contract | 13 | 13 | 0 | 0 | 100% | 零漂移(B-61 连续第 14 轮) |
|
|
|
+| 浏览器 D/X 桥接鉴权 | 2 | 0 | 0 | **2** | — | R93「2 passed」→ 本轮纠正为 **2 skipped(端点 404 未部署)** |
|
|
|
+| tests/ 根级黑盒(Jest) | 23 | 7 | 16 | 0 | 30.43% | R90 11/12 → **7/16**(环境依赖型,B-36 继续恶化) |
|
|
|
+| **合计** | **3271** | **3163** | **101** | **7** | **96.70%** | — |
|
|
|
+
|
|
|
+后端执行耗时 **51:45**(R90 1:06h、R88 46:18);本机 CPU 负载实测 95%(多 WorkBuddy + opencode 常驻),归因环境而非代码劣化(B-24 延续)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、后端明细(本轮核心增量)
|
|
|
+
|
|
|
+- **规模**:316 个测试类 XML(=316 类,**无沉默丢失**)、2664 例、38 F + 11 E + 4 S、**20 个红类 / 49 个红例**、**环境型红 0 例**(B-70 指向 `192.168.16.251:3306` 后首次零环境红)。
|
|
|
+- **testCompile**:322 源文件 0 错(B-10 连续第 15 轮)。
|
|
|
+- **恒等式**:`@Test 2654 + 参数化展开 26 − @Disabled 4 − 早退截断 12 = 2664`,误差 **0**。
|
|
|
+- **与 R90 基线(2628 例 / 97.34% / 24 红类 / 66 红例)对比**:+36 例、+53 过、**+0.67pp**、红类 24→20、红例 66→49、环境红 8→0。
|
|
|
+
|
|
|
+### 3.1 三层归因(49 红例逐例)
|
|
|
+
|
|
|
+| 归因层 | 例数 | 类数 | 代表 |
|
|
|
+|---|---|---|---|
|
|
|
+| **A 测试侧缺陷/装置**(Mockito 误用、夹具无值、断言文案过期) | **23** | 11 | `CfCommissionServiceSettleTest` 8(桩缺档位查询)、`DimensionScoreServiceImplTest` 4(`NoSuchElement` 无值)、`ArticleWorkflowTest` 3(文案已含「已撤回」)、`DailyCheckinStreakFlowTest`/`PlannerBindInviteFlowTest` 2(`doNothing()` 用于非 void) |
|
|
|
+| **B 产品缺陷(已定性)** | **1** | 1 | `MindFortuneControllerTest` 401→**400**(B-69 第 4 轮:`/api/mind/` 未入 `LOGIN_REQUIRED_PATHS`) |
|
|
|
+| **C 环境/数据** | **1** | 1 | `GuideModuleIntegrationTest`:`Data truncation: Out of range`(真库字段溢出) |
|
|
|
+| **D 待裁决(产品 vs 契约)** | **24** | 7 | `EnergySystemFlowTest` 6(接口 500 无生产帧)、`PlannerBindInviteFlowTest` 4(403 守卫)、`ArticleAutoTagServiceTest` 4(`execute` 被调 2 次,疑重复调度)、`DimensionRegistryMapContractTest` 3(P-2 契约)、`OrchestrationEngine/Integration` 2、`MembershipPaySwitch`/`PaymentServiceORD`/`TaskPlanService`/`TeamProfitCron`/`GrowthRecordSync` 各 1 |
|
|
|
+
|
|
|
+> 量化:**修完 A 类 23 例 → 后端 98.87%、全量 97.40%**;再裁决 D 类 24 例 → 后端 99.77%。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、节点分派(用户指令落地情况)
|
|
|
+
|
|
|
+| 目标 | 实测 | 结论 |
|
|
|
+|---|---|---|
|
|
|
+| `192.168.16.189:4090`(admin 派发目标) | TCP OPEN,但缺 LLM 凭证(B-56) | 不可派发 → 本机串行兜底 |
|
|
|
+| `192.168.16.204:4091`(frontend 派发目标) | TCP OPEN | 可用;本轮仍本机串行(单节点单任务纪律) |
|
|
|
+| `192.168.16.251:9000`(langgraph 部署) | `/health` **200 `{"status":"ok"}`**(6ms) | **服务在线** |
|
|
|
+| `192.168.16.251:9000/api/v1/chat` | **2 次探测均无响应**(75s / 200s,0 字节,`status=000`) | **新增 B-77:chat 图挂起** |
|
|
|
+| `192.168.16.251:4096`(opencode 派发) | OPEN,Basic 鉴权通过,**成功建会话并派发 2 次** | 派发通道可用 |
|
|
|
+| `192.168.16.251:3306` | OPEN | B-70 修复后无环境红 |
|
|
|
+| 251 上 langgraph 源码 | `/home/iwt/.cfc/langgraph` 仅 `memory/` 数据目录,**无 tests/**;`find / -maxdepth 6 -name cfc-langgraph` 仅命中 `/tmp/opencode/*` 历史克隆 | **新增 B-78:节点侧无 repo → pytest 无法在 251 执行** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、SRS / 场景变更感知与用例更新(用户硬要求)
|
|
|
+
|
|
|
+### 5.1 窗口内变更
|
|
|
+
|
|
|
+| 提交 | 内容 | 测试侧动作 |
|
|
|
+|---|---|---|
|
|
|
+| `adb032a61`(22:51,窗口内) | 签名横屏适配 **S1/S2/S3 实现落地**(`signature.vue` +69、`hand-signature.vue` +27) | **新增 `cfc-frontend/__tests__/pages/signature/signature.landscape.test.js` 7 例全绿**;`tests/test-cases/signature.md` 状态由「待开发 RED」→「已实现·已可执行化」 |
|
|
|
+| `3e93a9372`(22:34) | 成长页六宫格三列容差修复(`calc(33.333%-8rpx)`→`-12rpx`,余量 0→1.73%) | **新增 `growthGrid.layout.test.js` 4 例全绿**(守护 slack≥4rpx,禁止回归「刚好 100%」) |
|
|
|
+| `a13bb8192` | attribution G-1 低侧红线合规闸门 | 既有 `AttributionComplianceGateTest` 纳入本轮全量(绿) |
|
|
|
+| `2026-11-08-diet-recommendation-polish.md` | 推荐食材页 7 条改版(REQ1-7) | 既有 24 例 RED 保持不变(实现未落地),**本轮确认 `recommendation.vue` 对 `currentTab/pagedFoods/loadMore` 命中数 = 0** → 属 TDD RED,非测试缺陷 |
|
|
|
+| `2026-11-08-dx-health-bridge.md` | D/X 桥接 B-1/B-2 | 端点线上 **404(未部署)**;用例由「404 也算过」改为 **skip + 200 红线断言**(B-79) |
|
|
|
+
|
|
|
+### 5.2 场景/用例覆盖度量(`docs/tdd/tools/test_report_metrics.py --scene`)
|
|
|
+
|
|
|
+场景 **215**、映射到 TC **155(72.1%)**、被 spec 字面引用 **32(14.9%)**、TC 总数 **800**(异常流 480 = 60.0%)、TC 在测试资产中有锚点 **86**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、覆盖缺口清单
|
|
|
+
|
|
|
+| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|---|---|---|---|---|---|
|
|
|
+| S-cfc-79 前端 24 RED | `diet.recommendation.uiRework` 未实现 | 目标①不达成 | 研发实现 REQ1-7 → 24 例转绿 | P1 | 研发实现 + 全量复跑 |
|
|
|
+| 后端 D 类 24 例待裁决 | 500/403/调用次数/契约口径 | 真实缺陷可能被误当噪声 | 逐类补「服务端异常日志 + 生产帧」取证 | P1 | 研发确认后二分 A/B |
|
|
|
+| 251 `chat` 挂起(B-77) | health ok / chat 无响应 | AI 管家线上不可用 | 加 LLM 调用超时 + 熔断;部署后 smoke 用例 | **P0** | 运维/研发修复 + 3 次探测复验 |
|
|
|
+| 251 无源码(B-78) | 节点无 repo | G10 派发永不达成 | 251 建 repo checkout + venv,或提供 CI job | P1 | 运维落盘 + 派发复验 |
|
|
|
+| 根级黑盒 16 红 | 环境依赖型(凭据/库) | 接口层覆盖虚化 | 改为 live 契约(API 直探)替代 | P2 | 测试侧改造 |
|
|
|
+| SRS 锚点 86/800(10.75%) | 大量 TC 无自动化资产 | 目标②不达成 | 按优先级把 P0 TC 落到 Jest/Playwright | P0 | 持续补资产 |
|
|
|
+| G11 CI 未接后端 | 仅 test-compile | 回归靠人工 | CI 加 `mvn -o test` | P1 | 研发/运维 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、五要素问题清单(本轮新增/升级)
|
|
|
+
|
|
|
+### B-77 · 251 langgraph `/api/v1/chat` 挂起无响应(P0,新增)
|
|
|
+1. **问题描述**:`192.168.16.251:9000/api/v1/chat` 两次探测(`{"query":"你好","user_id":251}`)分别 75s、200s 超时且 **0 字节返回**(curl `status=000`);同节点 `/health` 200(6ms)、`/docs` 200(8ms)。R93(22:27)同接口曾返回有效答案 → 22:46~22:50 节点存在一次部署(`.cfc-deploy.lock` + `cfc-deploy.log` 时间戳)后能力退化。
|
|
|
+2. **测试 bug 点**:无既有自动化用例覆盖「251 chat 可用性」;本轮以 curl 直探取证(`_r94_lg_chat.json` 空、`_r94_chat2.json` 未落)。
|
|
|
+3. **最优修改方案**:研发定位 chat graph 中 LLM/检索调用未设超时导致挂起(对齐 `cfc-langgraph/app/...` 的 ainvoke 调用链,加 `timeout` + 熔断 + 失败降级文案);运维复核部署后 LLM 凭证与网关连通。
|
|
|
+4. **修改目的**:AI 管家 `/api/v1/chat` 是线上核心链路,挂起等同不可用,且会让客户端长时间转圈。
|
|
|
+5. **闭环**:修复后新增 `tests/e2e-live/langgraph-chat-smoke.spec.js`(POST chat 断言 200 + answer 非空 + 耗时 < 30s),连跑 3 次全绿。
|
|
|
+
|
|
|
+### B-78 · 251 部署节点无 `cfc-langgraph` 源码,pytest 无法派发(P1,新增)
|
|
|
+1. **问题描述**:在 251 上 `ls /home/iwt/.cfc/langgraph` 仅见 `memory/`(Chroma 数据),**无 `tests/`**;`find / -maxdepth 6 -type d -name cfc-langgraph` 仅命中 `/tmp/opencode/*` 历史会话克隆(代码陈旧不可作权威)。故「langgraph 测试分派 251」在节点侧**不具备执行条件**(此前 G10 一直记为「端口不通」,本轮首次取到真因)。
|
|
|
+2. **测试 bug 点**:派发脚本仅能建会话,无 repo 时 agent 只能报告「未找到目录」(本轮两次派发均如此,见 `_r94_langgraph_251.log` / `_r94_langgraph_251b.log`)。
|
|
|
+3. **最优修改方案**:运维在 251 落一个与 `origin/cfclub` 同步的 repo checkout + `.venv`(或提供 `langgraph-pytest` CI job / 容器),派发 prompt 直接给绝对路径。
|
|
|
+4. **修改目的**:让 langgraph 单测在**持有有效 LLM key 的节点**上运行,消除本机 4 例 env 假红,使 G10 可达。
|
|
|
+5. **闭环**:251 上 `pytest tests -q` 跑出与仓库一致的 44 例,派人复跑 2 轮零漂移。
|
|
|
+
|
|
|
+### B-79 · D/X 桥接鉴权用例「404 也算过」形成假绿(P1,测试侧自处置已完成)
|
|
|
+1. **问题描述**:`dx-health-bridge-auth.spec.js` 断言集合为 `[401,403,404]`,端点未部署时返回 404 也判 **passed** → 报告里呈现「2 passed」,实际是「无端点可测」。
|
|
|
+2. **测试 bug 点**:`tests/e2e-live/dx-health-bridge-auth.spec.js:47`(断言允许 404 通过)。
|
|
|
+3. **最优修改方案**:已改为「200 一律失败(鉴权红线)+ 404 记 `test.skip` 并注明待上线」,上线后自动转为 401/403 断言。
|
|
|
+4. **修改目的**:避免未部署端点被统计为「鉴权已通过」,纠正门禁口径。
|
|
|
+5. **闭环**:本轮复跑输出 **2 skipped**(`_r94_browser_dxbridge.log`),门禁计数已纠正。
|
|
|
+
|
|
|
+### B-80 · `tests/e2e/reset-db.sh` 默认凭据对 204 节点鉴权失败(P2,环境+装置)
|
|
|
+1. **问题描述**:`playwright.config.js` 的 globalSetup 执行 `reset-db.sh` 报 `ERROR 1045 Access denied for user 'cfc'@'192.168.16.204'`;`cfc@123`/`zxyj@123`/`IwinTrue@123` 三候选均被拒(`mysql` 客户端实测)→ **主配置 E2E 在 204 节点必然中断**,只能用 `playwright.config.live.js`(无 globalSetup)。
|
|
|
+2. **测试 bug 点**:`tests/e2e/reset-db.sh:8`(`MYSQL_PASS` 默认值)+ `playwright.config.js:18`(globalSetup 无跳过开关)。
|
|
|
+3. **最优修改方案**:DB 侧为 `cfc@192.168.16.204` 授 `cfc` 库权限(或提供只读种子库账号);同时给 `db.js` 加 `SKIP_DB_RESET=1` 开关。
|
|
|
+4. **修改目的**:让默认 E2E 配置可用,降低「跑不起来靠换配置」的隐性依赖。
|
|
|
+5. **闭环**:`MYSQL_HOST/MYSQL_PASS` 正确后 `reset-db.sh` 返回 0,`playwright.config.js` 跑通 1 个 smoke spec。
|
|
|
+
|
|
|
+### B-69(第 4 轮)· `/api/mind/` 匿名返回 400 而非 401
|
|
|
+1. **问题描述**:`MindFortuneControllerTest.testGetTodayFortuneWithoutAuth` 期望 `$.code=401` 实得 `400`(`@RequestAttribute("userId")` 绑定层先于拦截器失败)。
|
|
|
+2. **测试 bug 点**:`cfc-backend/src/test/.../mind/MindFortuneControllerTest.java:23`。
|
|
|
+3. **最优修改方案**:`JwtInterceptor.java:87` 的 `LOGIN_REQUIRED_PATHS` 增加 `/api/mind/`。
|
|
|
+4. **修改目的**:私有端点匿名访问口径统一为 401,便于前端「未登录跳登录」判断。
|
|
|
+5. **闭环**:该例转绿 + `JwtInterceptorLoginRequiredPathTest` 参数化补 `/api/mind/` 路径断言。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、门禁表
|
|
|
+
|
|
|
+| 门禁 | 阈值 | 本轮 | 判定 |
|
|
|
+|---|---|---|---|
|
|
|
+| G1 后端用例通过率 | ≥95% | **98.01%** | ✅(首次) |
|
|
|
+| G2 红例数 | 0 | 101(后端 49 / 前端 24 / lg 12 / 根级 16) | ❌ |
|
|
|
+| G3 前端全量 | 全绿 | 369/394(24 RED=未实现) | ❌ |
|
|
|
+| G4 编译/tc | 0 错 | 322 源 0 错 | ✅ |
|
|
|
+| G5 报告完整性 | 无沉默丢失 | 316/316 XML,1 dump 为 PpidChecker 噪声 | ✅ |
|
|
|
+| G6 线上浏览器 | 全绿 | **28/28**(+2 skipped 未部署端点) | ✅ |
|
|
|
+| G7 langgraph | 0 红 | 12 红(B-65 2 / B-74 6 / B-54 4)+ chat 挂起 | ❌ |
|
|
|
+| G8 健康契约 | 全绿 | 13/13(B-61 连 14 轮) | ✅ |
|
|
|
+| G9 SRS/场景锚点 | ≥80% | 场景映射 72.1%、TC 锚点 86/800=10.75% | ❌ |
|
|
|
+| G10 节点派发 | 2/2 | 0/2(189 缺凭证、251 无 repo) | ❌ |
|
|
|
+| G11 CI | 后端接入 | 仅 test-compile | ❌ |
|
|
|
+| G12 资产入库 | 新用例已提交 | 本轮 11 例(4+7)+ 1 处用例修复随本报告提交 | ✅ |
|
|
|
+
|
|
|
+**结论:不通过(有条件)**。使绿顺序:**P-1 修 A 类 23 例(→98.87%)→ P-2 判 24 例 D 类 → P-3 修 B-77 chat 挂起 → P-4 落 251 repo(G10)→ P-5 实现 S-cfc-79 24 例 → P-6 CI 接后端 → P-7 根级黑盒改造**。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、未实测项(不得视为通过)
|
|
|
+
|
|
|
+- langgraph pytest **在 251 上执行**(B-78:节点无源码);本轮为**本机 venv 结果**,含 4 例 env 假红。
|
|
|
+- `192.168.16.189` 派发的浏览器任务(B-56 缺 LLM 凭证)。
|
|
|
+- 覆盖率/jacoco、变异测试、性能压测、SAST/DAST/SCA(本机无工具,未安装)。
|
|
|
+- 无障碍、多浏览器矩阵(仅 chromium)、UAT/BDD/探索性测试。
|
|
|
+- `dan/danshop`(方案外)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 十、产出与留痕
|
|
|
+
|
|
|
+- 本轮报告:`docs/tdd/orchestration/report-test-2026-11-09-0030.md`(本文件)、技术明细 `docs/tdd/test/automation-run-2026-11-08-R94.md`、研发通知 `docs/tdd/test/notice-r94-round.md`。
|
|
|
+- 新增用例:`cfc-frontend/__tests__/pages/growth-main/growthGrid.layout.test.js`(4 例)、`cfc-frontend/__tests__/pages/signature/signature.landscape.test.js`(7 例)。
|
|
|
+- 用例修复:`tests/e2e-live/dx-health-bridge-auth.spec.js`(404 假绿 → skip + 200 红线)。
|
|
|
+- 本地证据:`_r94_backend.log`、`_r94_agg.json`、`_r94_frontend2.log`、`_r94_cfcweb.log`、`_r94_pytest.log`、`_r94_browser_live.log`、`_r94_browser_health.log`、`_r94_browser_dxbridge.log`、`_r94_langgraph_251*.log`、`_r94_lg_msg.json`、`_r94_aggregate.py`(均未入库)。
|