|
|
@@ -0,0 +1,343 @@
|
|
|
+# 测试闭环报告 · 第 123 轮(2026-11-10 12:35 GMT+8)
|
|
|
+
|
|
|
+> 主理人:陆谨(软件测试专家团 · 测试架构师)
|
|
|
+> 执行档:**review 档**(内网 `cfc.iwintrue.com` 已授权;无联网外部请求;未装依赖;未改生产代码)
|
|
|
+> 对象:`d:/cfc`(浠艾福 XAF)
|
|
|
+> 触发:定时自动化「测试负责人闭环(全部用例通过 + 覆盖 SRS/场景含异常流)+ 浏览器走 `/admin` 与 `/frontend`(189/本机每节点单任务)+ langgraph 派 251 + 结果有变提交远程并通知研发」
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 本轮结论速览
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|----|
|
|
|
+| 基线 | `cfclub @ 568cecac6`(跑前 = 跑后;收尾 fetch 远端前进 3 提交,全为 docs + auto bump,零源码变更) |
|
|
|
+| 全量用例 | **3501 例 / 3444 过 = 98.37%**(红 50 / 跳过 7) |
|
|
|
+| 对比上轮权威基线(R118/R120 `98.06% / 3432 过`) | **+1 例、+12 过、+0.31pp** |
|
|
|
+| 后端全量 | **2865 例 / 2828 过 = 98.71%**(新高),30F+3E+4S,14 红类 / 33 红例,48:05,XML 339/339 无沉默 |
|
|
|
+| 浏览器自动化 | **28/28 全绿**(live 15 + health 13) |
|
|
|
+| langgraph @ 251 | **43 例 / 42 过 / 1 红**(首次由 251 节点实派取回,B-55 本轮闭合) |
|
|
|
+| 门禁 | **不通过(有条件)** — 见 §9 |
|
|
|
+
|
|
|
+**三件必须让研发看到的事**
|
|
|
+
|
|
|
+1. **R122 的「本机无 Maven」是第 4 次误判**:`D:\maven\apache-maven-3.6.1` + `D:\jdk1.8.0_25` 一直可用。本轮据此拿到后端全量 98.71%,而 R122 直接跳过整个后端模块(降级为「复用 R120 基线」)。这是**流程缺陷而非环境缺陷**,登记 **B-123**。
|
|
|
+2. **B-121(admin `TC-A-U05` 确定性失败 2/2)本轮未复现**:同机同套件 **5/5 全绿**,U05 用时 58.4s 通过。R122 判「确定性失败」过重,改判「节点偶发(滑块/风控时序)」,转观察态,连续 2 轮绿即销号。
|
|
|
+3. **B-74 由 5 例降到 1 例**:251 实派仅 `test_auto_tag_content_relevance` 一例 `AssertionError`(LLM 语义相关性),其余 4 例随 `eeb147273` 一并转绿;同时 251 实派**独立复核了 B-65/B-82 的销号**(`test_analyze` 2 例、`test_intent` 4 例均不在失败清单)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 历史审查记录
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|----|------|
|
|
|
+| 上次本对象审查 | R122 @ 2026-11-10 12:10~12:33(`568cecac6`,即本轮的同一 HEAD) |
|
|
|
+| 上次结论 | 未单独出完整门禁;以「R120 全量基线 98.06% + 本小时 589/599」形式呈现,未评门禁 |
|
|
|
+| 上次遗留缺口 | ① 后端全量未实测(误判无 Maven)② `B-121` admin U05 新增红 ③ `B-55` 251 派发未达成 ④ 覆盖率/变异/压测/安全 长期未实测 |
|
|
|
+| 本次是否改善 | ①②③ **全部改善**(① 拿到 98.71% ② U05 转绿 ③ 251 实派成功);④ 未变(execute 档未授权) |
|
|
|
+| 是否首次审查 | 否。同对象已连续审查 ≥123 轮 |
|
|
|
+
|
|
|
+> 本节仅作对照。本轮全部结论均以本轮实测取证,未沿用任何历史数字作为通过依据;仅「SRS 台账计数」因窗口零变更而标注沿用。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 项目画像
|
|
|
+
|
|
|
+| 维度 | 结论 |
|
|
|
+|------|------|
|
|
|
+| 业务定位 | 家庭教育 SaaS:家长/孩子(能登录/不能登录用户)双角色、成长规划师、五维能量、健康报告解析、测评订单、商城、AI 管家 |
|
|
|
+| 技术栈 | 后端 Spring Boot 2.7.18 + MyBatis-Plus + Java 8(端口 9082);小程序 uni-app Vue2;管理端 Vue2 + Element UI;AI 侧 Python FastAPI + LangGraph + ChromaDB(9000,生产 `ai.etotem.com.cn`);独立商城 Spring Boot(8888) |
|
|
|
+| 规模(本轮实测) | 后端测试类 **339**、`@Test` **2854**、`@Disabled` **4**、控制器 **363**、`@GetMapping` **8 处**(仍违 AGENTS.md「统一 @PostMapping」);SRS 规格 **200 份**;用例台账 **14 份** |
|
|
|
+| 关键路径 | 登录鉴权(JWT 拦截 + 8 公开路径)→ 家庭成员/关系 → 成长任务与能量 → 健康报告上传-解析-入库 → 测评订单 → 商城下单/分润 → AI 对话/画像 |
|
|
|
+| 质量目标 | 全量用例通过率、SRS/场景锚点覆盖、线上鉴权契约、浏览器双端可用性、跨节点可派发 |
|
|
|
+| 本轮风险点 | 真实 DB 集成测试依赖 `192.168.16.251:3306`;A 类夹具仍 16 红;`platform_fee` 列溢出;189 节点仓库陈旧 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 20 类测试覆盖矩阵
|
|
|
+
|
|
|
+图例:● 已发现(有资产且有本轮/近期实测证据)/○ 未发现(扫描未命中)/◐ 待核实(有资产但本轮未实测或被降级)
|
|
|
+
|
|
|
+| # | 类别 | 状态 | 证据 |
|
|
|
+|---|------|------|------|
|
|
|
+| 1 | 单元测试 | ● | 后端 339 类 2865 例实跑;cfc-web 116、cfc-frontend 426 Jest 实跑 |
|
|
|
+| 2 | 组件测试 | ● | 后端 `*ControllerTest`(MockMvc)批量实跑;前端 Vue 组件 `__tests__` 实跑 |
|
|
|
+| 3 | 接口 API 测试 | ● | 浏览器侧 health 契约 13 例(10 端点未鉴权全 401)+ shop-sort 4 例实跑 |
|
|
|
+| 4 | 系统 / 端到端 | ● | `/admin` 5 例 + `/frontend` 6 例真浏览器实跑(Playwright 1 worker) |
|
|
|
+| 5 | 验收 UAT | ◐ | 有 `tests/user-scenarios` 198 场景映射,但无独立 UAT 执行记录(业务凭据不全) |
|
|
|
+| 6 | 冒烟测试 | ● | 每轮固定 28 例 live/health 冒烟;本轮全绿 |
|
|
|
+| 7 | 回归测试 | ● | 后端全量 2865 例 + 三套 Jest 全量 = 本轮回归基线 |
|
|
|
+| 8 | 探索性测试 | ○ | 无 chartered 探索会话记录 |
|
|
|
+| 9 | 契约测试 | ● | health 13 + shop-sort 4 + 后端 `*ContractTest`(DimensionRegistryMap / TeamProfitCron / WechatLoginContract 等) |
|
|
|
+| 10 | 性能测试 | ○ | 无压测脚本与基线(execute 档,需联网授权) |
|
|
|
+| 11 | 可靠性测试 | ○ | 无故障注入/恢复演练;仅线上 502 抖动被观测(B-72 历史) |
|
|
|
+| 12 | 安全测试 | ◐ | 鉴权契约 23 端点实测(全 401);SAST/DAST/依赖扫描未执行(execute 档) |
|
|
|
+| 13 | 兼容性测试 | ◐ | 仅 Chromium;多浏览器/多机型矩阵未执行 |
|
|
|
+| 14 | 可用性测试 | ○ | 无真实用户可用性证据 |
|
|
|
+| 15 | 无障碍测试 | ○ | 无 WCAG 检查 |
|
|
|
+| 16 | 覆盖率度量 | ◐ | cfc-web 引用历史 10.11/6.12/7.51/9.98%;后端 JaCoCo 离线不可用 |
|
|
|
+| 17 | 变异测试 | ○ | 无 PIT/mutation 配置 |
|
|
|
+| 18 | 质量指标 | ● | 通过率/红例分布/桶分布本轮重算(§8) |
|
|
|
+| 19 | QA 流程 | ● | 自动化闭环 123 轮可追溯;门禁脚本化不足(G11) |
|
|
|
+| 20 | 代码审查 | ● | 本轮抽检红例对应生产代码 6 处(EnergySystem / DimensionRegistry / platform_fee / ArticleAutoTag / CfCommission / WechatLogin) |
|
|
|
+
|
|
|
+**缺口初判**:5 类 ○ 全为「非功能 + 探索性 + 变异」,均属 execute 档或需专项排期;5 类 ◐ 为本轮降级项,已在 §7 转成缺口条目。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 测试方案(本轮实际执行)
|
|
|
+
|
|
|
+| 项 | 内容 |
|
|
|
+|----|------|
|
|
|
+| 目标 | 全量用例重新取证;验证 SRS/场景零变更;验证跨节点派发;验证上轮遗留 3 项(U05 / 251 / 后端全量) |
|
|
|
+| 范围 | 后端全量 339 类、cfc-web 17 套、cfc-frontend 26 套、根级 tests 3 套、langgraph@251 43 例、浏览器 live 15 + health 13 |
|
|
|
+| 覆盖维度 | 功能层次 5 类 + 功能保障 4 类 + 非功能鉴权/兼容(部分) |
|
|
|
+| 执行档 | review(离线白名单);内网 HTTP 探针与内网站点浏览器访问均为已授权范围 |
|
|
|
+| 优先级 | P0:后端全量 + 鉴权契约 + 浏览器双端;P1:251 派发;P2:度量口径 |
|
|
|
+| 排除项 | 压测、DAST/SCA、变异、多浏览器矩阵、UAT 全流量(未授权/无凭据)——报告中标「未实测」,不计通过 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 执行结果明细
|
|
|
+
|
|
|
+### 5.1 后端全量(`mvn -o -B clean test`,JDK1.8.0_25 + Maven 3.6.1)
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|----|
|
|
|
+| 总耗时 | **48:05** |
|
|
|
+| 结果 | **2865 例 / 2828 过 / 30F + 3E + 4S = 98.71%**(剔 skip 98.85%) |
|
|
|
+| 红类 / 红例 | **14 类 / 33 例** |
|
|
|
+| 完整性 | surefire XML **339/339**,与 339 个测试类一一对应,**沉默丢失 0** |
|
|
|
+| testCompile | 345 源 0 错 |
|
|
|
+| 恒等式 | `@Test 2854 − @Disabled 4 + 参数化/早退净增 15 = 2865`,误差 0 |
|
|
|
+| dump | 1 份 `2026-11-10T12-41-35_125-jvmRun1.dump`,内容为 `PpidChecker` 收尾 `IllegalStateException: error [STOPPED] to read process`(构建结束瞬间的 fork 回收竞态),**非测试崩溃** |
|
|
|
+| 对比 R118/R120 | 2864/2826/98.67%/34 红 → **+1 例 +2 过 +0.04pp,红例 −1** |
|
|
|
+
|
|
|
+**33 红三层归因**
|
|
|
+
|
|
|
+| 桶 | 例数 | 明细 |
|
|
|
+|----|------|------|
|
|
|
+| A 装置(测试自身缺陷) | 16 | `CfCommissionServiceSettleTest` 8(`Wanted but not invoked`)· `ArticleAutoTagServiceTest` 4(`threadPoolTaskExecutor.execute` 未命中)· `GrowthRecordSyncFlowTest` 3(1F+2E)· `TaskPlanServiceTest` 1(`expected 100 but was null`) |
|
|
|
+| B 产品 | 13 | `EnergySystemFlowTest` 6(5×`expected 200 but was 500` + 1 断言 false)· `OrchestrationEngineTest` 1 + `OrchestrationIntegrationTest` 1 · `MembershipPaySwitchTest` 1 · `PaymentServiceORDRoutingTest` 1 · `UserServiceWechatLoginTest` 1 + `UserServiceWechatLoginContractTest` 1 · `TeamProfitCronContractTest` 1(`cancelled=0`) |
|
|
|
+| C 数据 | 1 | `GuideModuleIntegrationTest` — `Data truncation: Out of range value for column 'platform_fee'`(第 12 轮) |
|
|
|
+| 契约待裁决 | 3 | `DimensionRegistryMapContractTest`(`expected 400 but was 200`、`$.data` 应为 null 实为 `""`/`unknown_legacy_xyz`) |
|
|
|
+
|
|
|
+**历史红类消失证据(B-69 落码生效)**:`MindFortuneControllerTest` 本轮**不在红类清单**(R118 为 1 红)。线上 `POST /api/mind/fortune` 本轮复证 **401**,与 `/api/energy/overview` 401 对照一致 → 鉴权清单修复在生产与单测两侧同时成立。
|
|
|
+
|
|
|
+### 5.2 前端 / 管理端 / 根级
|
|
|
+
|
|
|
+| 套件 | 套件数 | 例数 | 过 | 红 | 跳过 | 与基线 |
|
|
|
+|------|-------|------|----|----|------|--------|
|
|
|
+| cfc-web Jest | 17 | 116 | 116 | 0 | 0 | 零漂移 |
|
|
|
+| cfc-frontend Jest | 26 | 426 | 423 | 0 | 3 | 零漂移 |
|
|
|
+| tests 根级 Jest | 3 | 23 | 7 | 16 | 0 | 零漂移(B-36,9082 未启动 → ECONNREFUSED) |
|
|
|
+
|
|
|
+### 5.3 浏览器自动化(`workers=1`,单节点单任务)
|
|
|
+
|
|
|
+| 套件 | 例数 | 结果 | 耗时 | 备注 |
|
|
|
+|------|------|------|------|------|
|
|
|
+| `admin-desktop`(`/admin`) | 5 | **5/5** | 5.6/5.3/3.7/10.2/**58.4**s | U04 真实登录通过;**U05 通过(R122 为 2/2 失败)** |
|
|
|
+| `frontend-mobile`(`/frontend`) | 6 | **6/6** | 3.6~9.6s | 游客流 TC-F-U01~U06 |
|
|
|
+| `shop-api` | 4 | **4/4** | 77~115ms | 价格排序契约 TC-S-U01~U04 |
|
|
|
+| `health-api`(契约) | 13 | **13/13** | 7.2s | 华为 5 + 小米 5 + 健康方案 3,**全部 401** |
|
|
|
+
|
|
|
+合计 **28/28 全绿**,与 R118/R120 基线一致;U05 由红转绿是相对 R122 的最大正向变化。
|
|
|
+
|
|
|
+### 5.4 langgraph @ 192.168.16.251(**首次由 251 节点实派取回**)
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|----|
|
|
|
+| 通道 | `POST /api/shell?location[directory]=/sc-data/cfc/cfc-langgraph`(Basic `opencode:***`,port 4096)→ `GET /api/shell/{id}/output` |
|
|
|
+| 节点 HEAD | `568cecac6`(`git reset --hard origin/cfclub` 后) |
|
|
|
+| 命令 | `.venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py -q --tb=line` |
|
|
|
+| 结果 | **1 failed, 42 passed in 344.83s**(43 例,主口径「不含 test_chat」) |
|
|
|
+| 唯一红例 | `tests/test_auto_tag.py::test_auto_tag_content_relevance` — `AssertionError`(内容相关性判定,依赖 LLM 语义输出) |
|
|
|
+| 对比 | R121/R122 pre-fix 43/32/11 → **42/1**,红例 −10 |
|
|
|
+
|
|
|
+**本次实派同时完成三项历史销号的独立复核**:`test_analyze` 2 例(B-65)不在失败清单;`test_intent` 4 例(B-82)不在失败清单;`test_auto_tag` 由 5 例降为 1 例(B-74 收窄)。
|
|
|
+
|
|
|
+### 5.5 节点可达性
|
|
|
+
|
|
|
+| 节点 | 端口 | 结论 |
|
|
|
+|------|------|------|
|
|
|
+| 本机 | — | 浏览器 28/28 全量承担(单任务) |
|
|
|
+| `192.168.16.189` | 4090 **OPEN**(Basic 认证通过,shell 通道可建可读) | **通道已通但不可承载**:仓库为 `C:\worktrees\cfc-user-is-child @ e3e52ca38`(分支 `feature/user-is-child`),`tests/e2e-live` 不存在、`node_modules` 不存在 → 无法执行浏览器套件;不允许装依赖 → 本轮未派发(B-122) |
|
|
|
+| `192.168.16.251` | 9000 OPEN / 4096 OPEN / 22 OPEN | **langgraph 实派成功**;`/health` 200 |
|
|
|
+| `192.168.16.204` | 4090 CLOSED | 延续失联(B-95) |
|
|
|
+
|
|
|
+### 5.6 线上鉴权与可达性(curL 探针)
|
|
|
+
|
|
|
+| 目标 | 结果 |
|
|
|
+|------|------|
|
|
|
+| `GET http://cfc.iwintrue.com/admin` | 302(登录墙,24ms) |
|
|
|
+| `GET http://cfc.iwintrue.com/frontend` | 302(21ms) |
|
|
|
+| `POST /api/mind/fortune`(匿名) | **401** `{"code":401,"message":"请先登录"}` |
|
|
|
+| `POST /api/energy/overview`(匿名,对照) | **401** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 覆盖缺口清单
|
|
|
+
|
|
|
+| 编号 | 缺口类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|
|
|
+|------|---------|------|------|-------------|--------|---------|
|
|
|
+| G-123-1 | 性能测试 | 无脚本无基线 | 健康报告解析、AI 对话为长耗时链路,无容量依据 | 用 k6 对 `POST /api/health/report/upload`、`/api/v1/chat` 做 20/50 并发阶梯,记录 P95 | P2 | 需 execute 档联网授权后执行,产出基线表 |
|
|
|
+| G-123-2 | 可靠性 | 无故障注入 | `EnergySystem` 500 类问题在生产会直接暴露 | 对 MySQL 断连 + LLM 超时各注入 1 次,断言降级而非 5xx | P2 | 与研发约定注入窗口 |
|
|
|
+| G-123-3 | 安全扫描 | 仅鉴权契约 | 仅覆盖 23 个端点的未鉴权路径 | SAST(Semgrep)+ 依赖漏洞(`mvn dependency-check`) | P2 | execute 档授权 |
|
|
|
+| G-123-4 | 兼容性/无障碍 | 仅 Chromium | 小程序多机型、管理端 IE 类浏览器、WCAG 均空 | Playwright projects 加 firefox/webkit;axe-core 扫 `/admin` 5 页 | P3 | 增配置后纳入冒烟 |
|
|
|
+| G-123-5 | 覆盖率 | 后端 JaCoCo 离线不可得 | 98.71% 通过率不等于行覆盖率 | 离线环境预置 jacoco agent jar 后 `mvn test jacoco:report` | P1 | 预置依赖后补测 |
|
|
|
+| G-123-6 | 变异测试 | 无 | 高通过率可能掩盖弱断言 | 对 `EnergySystemService`、`CfCommissionService` 引入 PIT,目标 kill ≥60% | P3 | 专项排期 |
|
|
|
+| G-123-7 | UAT / BDD | 198 场景仅文档映射 | 场景与断言未一一绑定,锚点率低 | 将 §7 的锚点规范落到 `tests/test-cases`,每场景至少 1 可执行断言 | P1 | 见 B-124 |
|
|
|
+| G-123-8 | 探索性测试 | 无 chartered 记录 | 无脚本外缺陷发现能力 | 每轮 30min 时间盒探索,产出 charter + 发现清单 | P3 | 常态化 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 域结论表
|
|
|
+
|
|
|
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
|
|
|
+|---------|---------|------|---------|
|
|
|
+| 单元·组件级 | 苏雅 | **有条件通过** | 后端 2865 例 98.71%,14 红类;cfc-web 116/116、frontend 423/426 |
|
|
|
+| 集成·接口级 | 柯砚 | **不通过(局部)** | 契约 23 端点全 401 ✅;但 `DimensionRegistryMap` 3 例契约口径未裁决、`platform_fee` 溢出 1 例 |
|
|
|
+| 系统·验收级 | 白樾 | **有条件通过** | 浏览器 28/28 ✅;UAT 全流量未执行(无凭据),场景锚点偏低 |
|
|
|
+| 测试保障级 | 闻朔 | **通过** | 冒烟 28/28;回归全量 3501 例可复跑;探索性缺失(登记缺口) |
|
|
|
+| 性能·可靠性 | 骆骋 | **未实测(降级)** | execute 档未授权 → 转 G-123-1/2 测试设计 |
|
|
|
+| 安全 | 关屿 | **有条件通过** | 匿名 23 端点全 401(含 `/api/mind/**` 已修);SAST/SCA 未执行 |
|
|
|
+| 兼容·体验 | 阮清 | **未实测(降级)** | 仅 Chromium;无 axe/WCAG → G-123-4 |
|
|
|
+| 流程·度量·代码 | 何序 | **不通过(局部)** | `@GetMapping` 8 处仍违规范;R122 环境探针缺失致整模块漏测(B-123);锚点口径三种不一致(B-124) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 五要素问题清单
|
|
|
+
|
|
|
+### #1 `admin` U05 登录前置确定性失败(B-121,本轮转绿)
|
|
|
+
|
|
|
+- **① 问题描述**:R122 同一套件 `TC-A-U05` 连续 2 次停在 `/admin/login` 硬断言失败,而步骤一致的 `TC-A-U04` 通过;本轮同机同套件 **U05 通过(58.4s)**,U04 亦通过。
|
|
|
+- **② 测试 bug 点**:`tests/e2e-live/admin-live.spec.js:184`(TC-A-U05 登录前置未做「等 XHR 返回 + 断言状态码」,只依赖元素/URL 终态)。
|
|
|
+- **③ 最优修改方案**:把 U05 前置改为复用 `waitLoginFormReady()` + `fillPhoneAndAwaitRoles()`(等 `/api/admin-auth/login` 返回 200 后再断言菜单),失败时输出「控件属性 + 提示文案 + 几何量」三件套。
|
|
|
+- **④ 修改目的**:把「滑块/风控时序」与「产品登录回归」解耦,避免同类误判反复计入红例。
|
|
|
+- **⑤ 闭环**:隔离复跑 U05 连续 2 轮通过即销号;若重试仍红且 U04 同流程绿,则判产品侧并转研发。
|
|
|
+
|
|
|
+### #2 langgraph `test_auto_tag_content_relevance` 红(B-74 收窄至 1 例)
|
|
|
+
|
|
|
+- **① 问题描述**:251 实派 43 例中唯一失败为 `test_auto_tag_content_relevance`,`AssertionError`;其余 4 例 auto_tag 已随 `eeb147273` 转绿。
|
|
|
+- **② 测试 bug 点**:`cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_content_relevance`(断言依赖 LLM 对「内容相关性」的语义输出,无固定桩)。
|
|
|
+- **③ 最优修改方案**:为该用例注入确定性桩(mock LLM 返回固定标签集)作为主断言,另设 1 例 `@pytest.mark.llm` 真实链路冒烟并允许 skip;同时给 251 `.venv` 装 `pytest-timeout`。
|
|
|
+- **④ 修改目的**:把「LLM 凭据/网络」与「打标逻辑回归」分离,使该维度可稳定门禁。
|
|
|
+- **⑤ 闭环**:251 复跑该文件 5/5 全绿,且 `pytest-timeout` 生效(单例 ≤60s)即销号。
|
|
|
+
|
|
|
+### #3 根级黑盒 16 红(B-36,第 26 轮零漂移)
|
|
|
+
|
|
|
+- **① 问题描述**:`tests/` 根级 3 套 23 例,稳定 7 绿 / 16 红,全部 `ECONNREFUSED`(后端 9082 未启动)。
|
|
|
+- **② 测试 bug 点**:`tests/integration/*.spec.js`(如 `mini-games-api.spec.js:259`)硬编码 `http://127.0.0.1:9082`,无「服务未起则 skip」保护。
|
|
|
+- **③ 最优修改方案**:加 `beforeAll` 探活,未起则 `test.skip` 并打印启动指引;CI 中由 `globalSetup` 拉起后端。
|
|
|
+- **④ 修改目的**:消除「环境未起」被统计为「产品失败」的长期噪声(每轮固定 16 红)。
|
|
|
+- **⑤ 闭环**:连续 1 轮根级 0 红(或 16 例显式 skip 而非 fail)。
|
|
|
+
|
|
|
+### #4 A 类夹具 16 红(装置缺陷,非产品)
|
|
|
+
|
|
|
+- **① 问题描述**:`CfCommissionServiceSettleTest` 8、`ArticleAutoTagServiceTest` 4、`GrowthRecordSyncFlowTest` 3、`TaskPlanServiceTest` 1 红,形态集中于 `Wanted but not invoked` / `execute` 未命中。
|
|
|
+- **② 测试 bug 点**:上述 4 类(`CfCommission...:settle_F03a...`、`ArticleAutoTag...:toggleStatus_...`、`TaskPlan...:applyAndActivate_...`)。
|
|
|
+- **③ 最优修改方案**:`CfCommission` 逐例核对 mock 方法签名与生产 7 参 overload;`ArticleAutoTag` 改为注入同步 `Executor` 替身(避免线程池异步断言);`TaskPlan` 补齐 `@Mock` 返回值;`GrowthRecordSync` 2 例 E 需读 `Caused by` 最内层。
|
|
|
+- **④ 修改目的**:让 16 红退出统计,暴露真实产品缺口。
|
|
|
+- **⑤ 闭环**:定向复跑 4 类全绿(`mvn -Dtest=A,B,C,D` 用逗号,且必须看 `Tests run:` 行)。
|
|
|
+
|
|
|
+### #5 B 产品 13 红
|
|
|
+
|
|
|
+- **① 问题描述**:`EnergySystemFlowTest` 6(5×500)、`Orchestration*` 2、`MembershipPaySwitch` 1、`PaymentORD` 1、`WechatLogin` 2、`TeamProfitCron` 1。
|
|
|
+- **② 测试 bug 点**:`EnergySystemFlowTest:parentGetsEnergyOverview_Success` 等 6 例;`TeamProfitCronContractTest:refundWithinCooling_cancelAllRecordsFundsNotPaid`。
|
|
|
+- **③ 最优修改方案**:EnergySystem 5 例 500 需抓服务端堆栈定位(疑 DB/事务);TeamProfitCron 冷静期退款未置 `cancelled` 需核对 §8.2 实现;WechatLogin 2 例疑 mock 凭据缺失。
|
|
|
+- **④ 修改目的**:把「疑似产品缺陷」转为可派研发的具体缺陷单。
|
|
|
+- **⑤ 闭环**:对应类 0 红 + 线上同路径 200。
|
|
|
+
|
|
|
+### #6 `platform_fee` 列溢出(C 数据,第 12 轮)
|
|
|
+
|
|
|
+- **① 问题描述**:`GuideModuleIntegrationTest` 写库报 `Data truncation: Out of range value for column 'platform_fee'`。
|
|
|
+- **② 测试 bug 点**:`GuideModuleIntegrationTest::testGuidePackageCreationFlow`(造数金额超出列宽)。
|
|
|
+- **③ 最优修改方案**:核对 `guide_order.platform_fee` 列类型与业务上限;若业务值合法则扩列(DDL 走 `DatabaseInitializer` 迁移 + 同步 `schema.sql`),否则修造数。
|
|
|
+- **④ 修改目的**:避免真实大额订单写库失败。
|
|
|
+- **⑤ 闭环**:迁移后该类转绿 + 用边界值(上限 ±1)复测。
|
|
|
+
|
|
|
+### #7 `DimensionRegistryMap` 契约 3 例待裁决
|
|
|
+
|
|
|
+- **① 问题描述**:`unknown_legacy`/`empty` 期望 `data=null` 实为原值/空串;`missing` 期望 400 实为 200。
|
|
|
+- **② 测试 bug 点**:`DimensionRegistryMapContractTest:map_unknownLegacy_returnsNullData`、`map_emptyLegacy_returnsNullData`、`map_missingLegacy_returnsBadRequest`。
|
|
|
+- **③ 最优修改方案**:由产品/研发对「未知 legacy 键」的语义拍板(null vs 原样回传),据此单向修正契约或用例,写入 SRS。
|
|
|
+- **④ 修改目的**:消除长期悬空契约,避免前后端对同一键不同解释。
|
|
|
+- **⑤ 闭环**:契约条款落 SRS 后,3 例按新条款全绿。
|
|
|
+
|
|
|
+### #8 R122 环境能力探针缺失致整模块漏测(B-123,流程)
|
|
|
+
|
|
|
+- **① 问题描述**:R122 以「本机无 Maven」为由跳过后端全量,采信历史基线;实测 `D:\maven\apache-maven-3.6.1` + `D:\jdk1.8.0_25` 完全可用,本分钟即跑通 2865 例。
|
|
|
+- **② 测试 bug 点**:`docs/tdd/test/automation-run-2026-11-10-R122.md`「降级(未实测)」段(未做 `mvn -v` / `java -version` 探针即下结论)。
|
|
|
+- **③ 最优修改方案**:在自动化 prompt/SOP 中固定「环境探针前置」:每轮先执行 `java -version && mvn -v && df -h`,三项任一失败才允许降级,且降级必须贴探针输出。
|
|
|
+- **④ 修改目的**:杜绝「凭记忆判环境」导致整模块漏测(本轮已是第 4 次复发)。
|
|
|
+- **⑤ 闭环**:连续 3 轮报告均含探针输出且无「无 Maven」类降级 → 销号。
|
|
|
+
|
|
|
+### #9 TC 锚点口径不一致(B-124,度量)
|
|
|
+
|
|
|
+- **① 问题描述**:同一台账三种正则得三组数:严格 `57/333=17.1%`、宽松 `165/866=19.1%`、R118 口径 `86/812=10.6%`;无法跨轮比较。
|
|
|
+- **② 测试 bug 点**:`docs/tdd/tools/test_report_metrics.py`(无输出、口径未固化)与各轮报告手写正则。
|
|
|
+- **③ 最优修改方案**:把锚点定义为「测试代码中被引用的唯一 TC 编号 / 台账中定义的唯一 TC 编号」,正则写进脚本并输出 JSON,报告只引用脚本结果。
|
|
|
+- **④ 修改目的**:让 G9 可复算、可跨轮对比。
|
|
|
+- **⑤ 闭环**:连续 2 轮报告 G9 数值由脚本产出且一致。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 门禁结论
|
|
|
+
|
|
|
+| 门禁 | 判据 | 实测 | 结论 |
|
|
|
+|------|------|------|------|
|
|
|
+| G1 全量通过率 | ≥95% | **98.37%**(3444/3501) | ✅ |
|
|
|
+| G2 红例数 | ≤10 | **50**(后端 33 + 根级 16 + langgraph 1) | ❌ |
|
|
|
+| G3 前端 Jest | 0 红 | 423 过 / 0 红 / 3 skip | ✅ |
|
|
|
+| G4 管理端 Jest | 0 红 | 116/116 | ✅ |
|
|
|
+| G5 编译与完整性 | testCompile 0 错 + XML 无沉默 | 345 源 0 错;339/339 | ✅ |
|
|
|
+| G6 浏览器 | 28/28 | **28/28** | ✅ |
|
|
|
+| G7 langgraph | 0 红 | **1 红** | ❌ |
|
|
|
+| G8 鉴权契约 | 全 401 | 23/23(含 `/api/mind/**`) | ✅ |
|
|
|
+| G9 SRS 锚点 | ≥80% | 17.1%(严格)/ 19.1%(宽松) | ❌ |
|
|
|
+| G10 双节点派发 | 251 + 189 均实派 | 251 ✅ / 189 ⚠️(通道通、仓库陈旧不可承载) | ⚠️ 部分 |
|
|
|
+| G11 CI 含后端全量 | 存在 blocking 全量 | 无 | ❌ |
|
|
|
+| G12 用例入库 | 本轮有新增/更新 | 无 SRS 变更 → 不新增(合规) | ✅ |
|
|
|
+
|
|
|
+**总裁决:不通过(有条件)**
|
|
|
+
|
|
|
+- 阻塞放行的三项:**G2 50 红**、**G9 锚点 17.1%**、**G11 无 CI 全量**。
|
|
|
+- 相比 R118/R120:**G1 +0.31pp、G6 维持 28/28、G7 由 11 红降至 1 红、G8 由「mind 缺项」转为全绿、G10 由 0/2 转为 1/2**。
|
|
|
+- 放行建议:后端 98.71% 且鉴权契约全绿,可支撑**内网灰度**;不支撑对外正式发布,除非 G2 中 13 例 B 类产品红有明确结论。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. 窗口内变更登记(SRS 闸门)
|
|
|
+
|
|
|
+| 检查项 | 结果 |
|
|
|
+|--------|------|
|
|
|
+| `docs/superpowers/specs` 200 份 | 窗口内 **零新增 / 零修改**(`find -newermt "2026-11-10 11:28"` 零命中;`git diff 730b7058a..HEAD` 该目录无输出) |
|
|
|
+| `docs/tdd/user-scenarios` 11 份 | 零变更 |
|
|
|
+| `docs/superpowers/api/API_REFERENCE.md` | 零变更 |
|
|
|
+| 代码侧变更 | 窗口内仅 `eeb147273`(langgraph 修复)与 `84239ce22`(`/api/mind/**` 鉴权)——**均为既有规格的实现落地,不产生新用例需求**,已由既有 pytest / 契约用例覆盖 |
|
|
|
+| 结论 | **不新写用例**;SRS→用例映射关系保持,缺口转 §6 G-123-7 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 11. 度量
|
|
|
+
|
|
|
+| 指标 | 值 |
|
|
|
+|------|----|
|
|
|
+| 测试类 / `@Test` / `@Disabled` | 339 / 2854 / 4 |
|
|
|
+| 控制器 / `@GetMapping` | 363 / **8(违 AGENTS.md)** |
|
|
|
+| SRS 规格 / 用例台账 | 200 / 14 |
|
|
|
+| 场景(`^## 场景`) | 198 |
|
|
|
+| TC(严格 `/TC-[A-Z]{1,3}-[A-Z]{1,2}-?\d{1,3}/`) | 333 |
|
|
|
+| TC(宽松,含引用) | 866 |
|
|
|
+| 可执行 TC 锚点(唯一,排 `generated`) | 165 |
|
|
|
+| 锚点率 | 17.1%(严格)/ 19.1%(宽松) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 12. 本轮方法论沉淀
|
|
|
+
|
|
|
+1. **远程 shell 派发失败要分三态查**:`401/000`(凭据/端口)→ `create 404 LocationNotFound`(工作目录不存在,如 189 的 `C:\cfc`)→ `create 200 但 output 空`(对象被回收)。本轮 189 的失败是**第二种**,而非历轮记的「鉴权门控」。
|
|
|
+2. **同节点重复建 shell 会杀掉在跑的进程**:首轮 251 pytest 跑到第 36 例即被后续 `tail` shell 打断(日志无 summary 且有 `DONE_0`)。正确做法是 `setsid nohup` 分离 + **本地 sleep 后一次性读文件**,读文件期间不得再建 shell。
|
|
|
+3. **`-q` 的进度点就是用例数**:`...F................................` 的字符数可用于判断「是否被截断」,比等 summary 更早发现异常终止。
|
|
|
+4. **判「节点能否承载浏览器任务」不能只看端口**:189 `4090` OPEN 且 shell 可建可读,但仓库停在 `feature/user-is-child @ e3e52ca38`、无 `node_modules`、无 `tests/e2e-live` → 能力缺失。必须先 `Test-Path tests\e2e-live; Test-Path node_modules` 再派发。
|
|
|
+5. **环境能力禁止凭记忆判定(第 4 次复发)**:每轮固定 `java -version && mvn -v && df -h` 探针,未跑探针不得写「降级」。
|