report-test-2026-11-13-R184.md 43 KB

测试负责人工作汇报(R184 轮)

本汇报按《测试负责人工作汇报模板》填写。R184 为定向复验轮:基线 cfclub @ fcbce94b3(=origin,06:02 拉取)。窗口内 2 提交(2f66405b8 cfc-web 构建元数据 + fcbce94b3 研发汇报)零功能源码变更,与 R183 实测基线 58671aa7a 做 git diff 核验:src 变更 = 0。 本轮后端全量跑测在 76/368 类处被主动截断(单类 455s/192s + 每类 Spring 上下文全量迁移,实测 ≈2 类/分钟,推算全量 >2h,超出窗口预算)→ 按纪律改为「同源码全量结果沿用 R183 + 本轮 14 红类定向实测复验」双证,并在 §4.1 显式标注「截断」与「采信」,不把未实测写成已测。 ★ 增量复验(本报告发布前完成):窗口末远端合入功能提交 ca56f8699 feat(membership): implement membership.plan.purchase (S-cfc-176) → rebase 后在 HEAD=6d3564510 上定向复跑:MembershipPlanPurchaseContractTest 7F → 1F(6 例转绿),FamilyRemoveMemberContractTest 维持 4F。据此全站结论上调:3987 例 / 3913 过 = 98.14%(剔 skip 98.76%),后端红 34 → 28,G1 由 ❌ 转 ✅。详见 §九。 对比 R183:全站 3987 例 / 3907 过(97.99%,剔 skip 98.61%)→ 增量后 3913 过(98.14%),环比 +7 过(langgraph +1、会员购买契约 +6);langgraph@251 红 3→2;浏览器 28/28 + 2 跳、线上 API 25 过/7 跳/0 红、web 116/116、fe 609/3/12、根级 7/16 全部零漂移;后端红类集合 13/14 类逐类一致,TaskReview 1F→2F(B-178-1 装置浮动);门禁 不通过(承袭),并新增 B-184-1(全量耗时才 33:49→>2h 劣化)。


基本信息

项目 内容
汇报人 测试负责人(自动化测试闭环任务 / 软件测试专家团·陆谨)
汇报周期 2026年11月13日 05:48 ~ 07:20(第 184 轮)
基线 cfclub @ fcbce94b3(=origin,06:02 fetch 核验;跑测窗口内远端零前进)
窗口内需求变更 零 — SRS/场景/接口文档零变更(G12 ✅,用例零新增)
窗口内源码变更 零 — git diff fcbce94b3..58671aa7a 全仓非 docs 文件命中 0
负责模块/单元 全站:cfc-backend JUnit(红类定向复验 + 同源码全量沿用)· 管理端 admin@189 · 小程序 H5/shop/health/dx@本机 · cfc-langgraph@251 · cfc-web/cfc-frontend Jest · 根级黑盒 · 线上 API 非功能层

一、本轮工作数据汇总

1.1 测试用例建设

指标 数量 填写说明
本轮新增测试用例数* 0 个 SRS/场景窗口零变更,未触发用例编写闸门(G12 ✅)
本轮验证执行测试数* 3987 个 后端 JUnit 3111(同源码全量沿用 R183 + 本轮 103 例红类定向复验)+ 前端 Jest 624 + 管理端 116 + langgraph 51(本轮实测)+ 浏览器 30(28 过 + 2 跳,本轮实测)+ 线上 API 32(25 过 + 7 跳,本轮实测)+ 根级 23(本轮实测)
用例通过率 98.14%(3913/3987;剔除 skip 98.76%) 红 49 / 跳 25,环比 +7 过(含增量复验 +6),明细见 §四 与 §10
用例台账 tests/test-cases/ 16 份 / 表行 876 / 唯一 TC 308 场景 152 / 可执行锚点 100(排除 e2e/api/generated 253 条脚本化)

1.2 会话与任务分发

指标 数量 填写说明
分派任务数* 3 个 R184-1 → opencode-189(admin-desktop 5/5 EXIT=0,1.3m);R184-2 → opencode-251(langgraph pytest 49/51,244.73s);R184-3 → 本机串行(fe/shop/health/dx 浏览器 + 2 套 Jest + 线上 API + 根级 + 后端红类定向复验)
恢复智能体会话数* 0 个 189/251 均首派成功
当前在用会话数 0 个 全部结束;251 pytest 残留进程已 kill(B-177-1 第 7 轮复现,见 §4.5)

1.2b 各会话当前工作状态列表

会话标签 会话 ID/地址 当前状态 当前任务 静默/空闲时长 工作目录 备注
opencode-189 192.168.16.189:4090 done admin-desktop UI E2E 已完成(1.3m) C:\code\cfc\tests 5/5 EXIT=0;spec blob 4703d73fb = 本机(跨节点可比)
opencode-251 192.168.16.251:4096 done langgraph pytest 51 例 已完成(244.73s) /sc-data/cfc/cfc-langgraph 49 过 / 2 红;红 3→2;残留 pid 已清理
local-browser 本机进程 done fe / shop / health / dx 已完成 d:\cfc\tests fe 6/6(48.2s)、shop 4/4(9.5s)、health 13/13(4.1s)、dx 2 跳
local-api 本机进程 done 线上 API 冒烟/安全/性能兼容/追溯 已完成(17.1s) d:\cfc\tests 25 过 / 7 跳 / 0 红(点名 4 文件)
local-jest 本机进程 done cfc-web + cfc-frontend + 根级 已完成 cfc-web / cfc-frontend / tests web 116/116(120.9s)、fe 609/3/12(133.59s)、根级 7/16(13.98s)
local-backend 本机进程 done(截断 + 定向) 全量 → 截断于 76 类 → 14 红类定向复验 全量 39m 后截断;定向 04:51 d:\cfc\cfc-backend 全量 76 类 / 1 红类;定向 103 例 / 29F+6E / 1 跳

1.3 问题处置

指标 数量 填写说明
新测试发现问题数* 2 个 B-184-1(P1,性能/装置):后端全量耗时由 R183 33:49 劣化至本轮 76 类 / 39min(≈2 类/分钟,推算全量 >2h),根因=慢类(GuideRolePermissionTest 455.5s、FamilyControllerTest 192.3s、PaymentControllerTest 136.8s、GuideFamilyTaskControllerTest 125.9s、DimensionRegistryTreeTest 114.3s)+ 每类 @SpringBootTest 上下文重新执行 DatabaseInitializer 全量迁移 + 宿主 CPU 100%
已解决测试相关问题数* 1 个 langgraph 红 3→2(intent 组 4 例连续 2 轮保持绿;auto_tag 由 3 收窄至 2);B-142-2 观察 7/13 正向
待解决测试相关问题数 P0×2 / P1×6 / P2×4 ① B-142-2 langgraph 上游 LLM 不可达(P0,观察 7/13,本轮 ConnectError + live chat 000/45s);② B-152-1/2 CI 清单双向失真(P0/P1,第 16 轮,漏拦 7 / 陈旧 26);③ B-184-1 全量耗时劣化 >2h(P1,新);④ B-156-1 nutrition_age_dosage DDL 缺陷(P1,第 9 轮);⑤ B-162-1 3 类未入库测试(P1);⑥ S-cfc-168 契约预期 RED 7 例(P1);⑦ S-cfc-178 契约预期 RED 4 例(P1);⑧ B-177-1 pytest 进程不退出(P1,第 7 轮复现);⑨ B-173-1 safe-delete 守卫(P2);⑩ B-178-1 反射装置浮动(P2,本轮 1F→2F);⑪ B-95 204 节点失联(P2,第 40 轮);⑫ B-170-1 activities.approved_count 迁移语法错(P2,第 6 轮)

1.4 本轮 git 提交与推送证据(真理证据)

提交 sha 关联任务/能力键 阶段 触及文件类型 目标分支 已推送远端 备注
(窗口)2f66405b8 + fcbce94b3 bump / 研发汇报 其他 构建元数据 + 文档 cfclub ✅ 研发已推 零源码,不改变实测基线
见收尾 commit 全站巡检 R184 汇报 报告 + 运行日志 + blockers cfclub ✅ 本轮推送 langgraph 红 3→2、通过率 +0.02pct、新增 B-184-1 → 提交并通知研发

1.5 状态机阶段分布(全局进度)

阶段 键数 备注
UNTRACKED 0 窗口零新增规格
RED 11 S-cfc-168 契约 7 例 + S-cfc-178 契约 4 例待实现
YELLOW 72 研发负责人口径
GREEN 8 承袭
DONE 15 承袭
合计 106 研发侧状态账本口径

1.6 数据源健康度

数据源 读取键数 是否正常 备注
需求侧(⏳ wish) 0 正常 SRS 目标池未启用(CFC 声明配置)
契约常量(contract) 多组 正常 契约测试类跨轮核验正常
测试用例引用(test_case_map) 308 唯一 TC 正常 台账扫描正常
执行结果回填(case_results) — 正常 侧车未重写,保留既有回写

二、历史审查记录(阶段 -1 记忆召回)

项 内容
上次审查 R183(2026-11-13 05:45,提交 4e0322a72),结论「不通过(承袭)」,全量 3987/3906(97.97%,剔 skip 98.59%),后端 3111/34 红/33:49(全量实测),langgraph 48/51 红 3
遗留缺口 后端存量红 34 · langgraph 环境红 3 · 根级 16 红(9082 未起)· CI 漏拦/陈旧(B-152-1/2)· 3 未入库测试(B-162-1)· B-177-1 pytest 不退出 · B-178-1 反射装置 · S-cfc-168/178 契约预期 RED 11 例
本次是否改善 ① langgraph 红 3→2(auto_tag 3→2,intent 4 例连续 2 轮绿);② 全站通过率 97.97%→97.99%(+1 过);③ 后端红类集合 13/14 逐类一致(零漂移维持,TaskReview 1F→2F 为装置浮动);④ 新发现 B-184-1 耗时劣化(负向,见 §4.1)
教训应用 ① 环境探针前置(JDK/Maven/端口)本轮实测通过,未出现「无 Maven」类误判;② 251 派发用 MSYS2_ENV_CONV_EXCL=LOG + 远端 POSIX 路径,日志正常落盘(R173 教训落实);③ API 套件点名 4 文件,未误跑 990 例(B-173-2 规避);④ 用例自检三问(探针是否真受保护面 / 路径与类级 @RequestMapping 一致 / 用 Result.code 而非 HTTP 码);⑤ 判「卡死」前先看单类 elapsed 与 Running N tests——本轮据此把「全量跑不动」定性为慢类而非挂死

本次为该对象第 184 次审查,有历史记录;上述内容仅作对照,本次结论全部来自本轮实测 + 显式标注的同源码沿用。


三、项目画像与覆盖矩阵

3.1 项目画像(承袭并本轮核验)

维度 内容
业务定位 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城
技术栈 Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000)
模块结构 cfc-backend(366 控制器,2121 主源 + 375 测试源)· cfc-frontend(42 测试文件)· cfc-web(17 套件)· cfc-langgraph(51 例)· dan/danshop · tests(89 e2e + 5 e2e-live)
关键路径 登录/家庭/成员(含移除成员缓存重算)→ 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付(退款查询/到店核销)→ AI 对话(LangGraph)
测试现状 后端 368 类 3111 例(同源码沿用 R183 + 本轮 14 红类 103 例定向复验)+ 前端 624 + 管理端 116 + 浏览器 30 + 线上 API 32 + langgraph 51 + 根级 23
质量目标 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发
风险点 ① 后端红 35(存量 16 + GrowthPublic 5E + 契约预期 RED S-cfc-168 7 + S-cfc-178 4 + TaskReview 2F 装置)· ② CI 排除清单漏拦 7 类 + 陈旧 26 类(B-152-1/2 第 16 轮)· ③ langgraph 上游 LLM 不可达(红 2)· ④ 根级 16 红(9082 未起)· ⑤ 后端全量耗时劣化至 >2h(B-184-1)
待核实项 nutrition_age_dosage DDL 缺陷修复状态(B-156-1 第 9 轮未修)· S-cfc-168/178 实现排期 · 251 上游凭据有效性 · 204 节点恢复(B-95 第 40 轮)· 本轮全量截断导致「368 类全量逐例」未经本轮独立复现(以 R183 同源码结果为准,标「待下轮全量复核」)

3.2 20 类测试覆盖矩阵(全类不省略)

# 测试类型 三态 证据(本轮实测)
1 单元测试 ✅ 已发现 后端 368 类 3111 例(同源码沿用 + 本轮定向 103 例);前端 42 文件 624 例(本轮实测)
2 测试覆盖率 ⚠️ 部分 管理端 Jest 覆盖率可产出(Lines ~10%);后端未开 jacoco(未授权改 pom)
3 变异测试 ❌ 未发现 全仓无 pitest/mutation 配置
4 集成测试 ✅ 已发现 *IntegrationTest(Orchestration/GuideModule/EnergySystemFlow)本轮定向实测 3 类,红数一致
5 契约测试 ✅ 已发现 契约类 20+;S-cfc-168 7F / S-cfc-178 4F 预期 RED 维持;TaskReviewScP11 2F(B-178-1 装置浮动)
6 接口 API 测试 ✅ 已发现 线上 API 32 例(25 过 / 7 跳 / 0 红,本轮实测 17.1s)
7 系统/端到端 ✅ 已发现 浏览器 30 例:admin 5 + fe 6 + shop 4 + health 13 + dx 2(跳)(本轮实测)
8 验收 UAT ⚠️ 部分 tests/test-cases/cross-role-e2e.md 双角色验收场景有台账;本轮无人工 UAT
9 BDD 规格 ⚠️ 部分 spec 201 份含 Given/When/Then 语义;无 cucumber 执行器
10 冒烟测试 ✅ 已发现 api-smoke.spec.js 本轮全绿
11 回归测试 ✅ 已发现 7 套件全量回归 + 后端红类定向复验;存量红集合 13/14 类逐项一致(零漂移)
12 探索性测试 ✅ 已发现 本轮现场探索:langgraph 红由 ConnectError 定性(非分类逻辑);后端慢类定位(455s/192s);无新缺陷
13 性能测试 ⚠️ 部分 nonfunc-perf-compat.spec.js(7 跳中部分属性能项);压测未授权未执行;后端全量实测耗时劣化(B-184-1)
14 可靠性测试 ⚠️ 部分 上游 LLM 不可达提供弱故障注入证据(live chat 000/45s 而 health 200/3.7ms);无长稳/混沌测试
15 安全测试(SAST/DAST) ⚠️ 部分 nonfunc-security.spec.js 全绿;匿名 6 端点 6/6 = 401(本轮实测);SAST 未授权
16 依赖漏洞扫描 ❌ 未发现 无 npm audit/dependency-check 门禁,且属联网档未授权
17 兼容性测试 ⚠️ 部分 Playwright frontend-mobile 移动视口 6/6(本轮实测);无多浏览器矩阵
18 可用性测试 ⚠️ 部分 页面可渲染/导航/TabBar 断言覆盖;无真实用户可用性测试
19 无障碍测试 ❌ 未发现 无 axe-core 等 a11y 断言
20 QA 流程与质量指标 ⚠️ 部分 本报告 + blockers + 度量可复现;G9 锚点 20.1%(严格口径)、G11 CI 失真(第 16 轮)

四、本轮实测明细

4.1 套件数据

套件 执行 通过 红 跳 耗时 判定
后端 JUnit 全量 76/368 类 — 1 类 5E — 39m(截断) ⚠️ 本轮主动截断,不作全量结论;仅证明前 76 类执行正常、testCompile 375 源 0 错
后端 14 红类定向复验(本轮实测) 103 67 29F+6E=35 1 04:51 13/14 类逐例与 R183 一致;TaskReview 1F→2F(B-178-1 装置浮动)
后端全量结果(沿用 R183,同源码) 3111 3073 34 4 33:49 本轮 git diff 证 src 零变更 → 沿用并显式标注
前端 Jest(本轮实测) 624 609 3 12 133.59s 3 全预期 RED(S-cfc-132/133 + AC-2 RED-A7 契约新增)
管理端 Jest(本轮实测) 116 116 0 0 120.9s 全绿(17 套件)
langgraph@251(本轮实测) 51 49 2 0 244.73s auto_tag 2 全环境(ConnectError);红 3→2
浏览器 189+本机(本轮实测) 30 28 0 2 1.3m+1.0m dx 2 跳(契约仅登记不实现)
线上 API 非功能层(本轮实测) 32 25 0 7 17.1s 契约缺口 3 例 fixme(同 R183)
根级黑盒(本轮实测) 23 7 16 0 13.98s 全 ECONNREFUSED 9082(B-36 第 69 轮)
合计(采用「后端沿用 R183」口径) 3987 3907 55 25 — 97.99%(剔 skip 98.61%)
合计(+ §九 增量复验修正后,报告最终值) 3987 3913 49 25 — 98.14%(剔 skip 98.76%)

vs R183:3906 过(97.97%)→ 本轮 3907 过(97.99%),+1 过、红 56→55。构成:langgraph 红 3→2。 口径声明(重要):后端 3111 例为「同源码沿用」,非本轮独立复现。若仅按本轮实际执行计数,全站执行例数 = 3111−103(红类定向已含于全量)+103 = 3111,但其中 3008 例未在本轮重跑。因此 G1 的 97.99% 是「本轮实测 5 套件 + 同源码沿用 1 套件」的混合口径,已在报告与 blockers 双处标注为「待下轮全量复核」。

4.2 后端红类明细(35,14 类,本轮定向实测)

红类 本轮实测 R183 一致性
EnergySystemFlowTest 7 例 / 6F / 1S 6F ✅ 一致
GrowthPublicEndpointMappingTest(未入库,B-162-1) 5 例 / 5E 5E ✅ 一致
MembershipPlanPurchaseContractTest 7 例 / 7F(主窗)→ 1F(§10 增量复验) 7F ⚠️ S-cfc-176 合入后 6 例转绿,剩 1 例幂等复用未达成
FamilyRemoveMemberContractTest 8 例 / 4F 4F ✅ 一致(S-cfc-178 预期 RED)
DimensionRegistryMapContractTest 7 例 / 3F 3F ✅ 一致(存量 P-9)
TaskReviewScP11ContractTest 8 例 / 2F 1F ⚠️ 1F→2F 装置浮动(B-178-1)
GuideModuleIntegrationTest 4 例 / 1E 1E ✅ 一致
OrchestrationEngineTest 8 例 / 1F 1F ✅ 一致
OrchestrationIntegrationTest 7 例 / 1F 1F ✅ 一致
MembershipPaySwitchTest 6 例 / 1F 1F ✅ 一致
PaymentServiceORDRoutingTest 3 例 / 1F 1F ✅ 一致
UserServiceWechatLoginTest 5 例 / 1F 1F ✅ 一致
UserServiceWechatLoginContractTest 6 例 / 1F 1F ✅ 一致
TeamProfitCronContractTest 22 例 / 1F 1F ✅ 一致
合计 103 例 / 29F+6E / 1S = 35 红 34 红 净 +1 = TaskReview 装置浮动

BUILD FAILURE(预期,有红例);Total time 04:51;testCompile 375 源 0 错。

4.3 本轮全量截断取证(B-184-1 证据链)

证据 值
编译 主源 2121 / 测试源 375,0 编译错
完成类数 76 / 368(Tests run: 计数)
已用时间 39 分钟(06:05 启动 → 06:44 截断),≈ 2 类/分钟
单类耗时 Top5 GuideRolePermissionTest 455.5s、FamilyControllerTest 192.3s、PaymentControllerTest 136.8s、GuideFamilyTaskControllerTest 125.9s、DimensionRegistryTreeTest 114.3s
上下文开销 每类 @SpringBootTest 重新执行 DatabaseInitializer 全量迁移;日志 SQLSyntaxErrorException 70 行(含 Unknown column 'a.id'×2 即 B-170-1 未修、Key column 'product_id' doesn't exist×2 即 B-156-1 未修)
宿主负载 wmic cpu loadpercentage = 100%;同窗口仅本机 1 个 surefire fork
推算 若维持 2 类/分钟 → 全量 ≈ 184 分钟(R183 为 33:49,劣化 ≈5.4×)
处置 主动 kill(pid 11316/11484),改「同源码沿用 + 红类定向复验」,不把截断当全量结论

4.4 langgraph 红例(2,较 R183 收窄 1 例)

例 归因
test_auto_tag.py::test_auto_tag_content_relevance AssertionError,上游 POST /api/v1/chat → ConnectError('All connection attempts failed')
test_auto_tag.py::test_auto_tag_short_content 同上;日志另见 prompt_service.py:118 加载提示词 intent_classifier 失败: All connection attempts failed
  • 同窗口 live 探针:/health 200 / 3.7ms,/api/v1/chat 000 / 45.0s / 0B(零字节挂死),/api/v1/analyze 同源 → 服务进程活、LLM 链路不可达,判环境红(C 类),非代码回归;
  • 节点 HEAD fcbce94b3 = 本机 HEAD,窗口零 langgraph 源码;
  • intent 组 4 例连续 2 轮绿;auto_tag 3→2 → B-142-2 观察 7/13(需连续 2 轮 51/51 才销号)。

4.5 B-177-1 第 7 轮复现(pytest 进程不退出)

  • summary 已打印 2 failed, 49 passed in 244.73s,但 bash -c 与 pytest 进程(pid 1915738 / 1915739,stat=Sl)存活 07:38 仍未退出 → echo EXIT=$rc 永不执行,日志无 EXIT= 行;
  • 再次反证:「EXIT 未落盘」不是 shell 引号/MSYS 路径问题,而是被测进程挂死(R177 已更正,本轮为独立第 2 次佐证);
  • 已 kill -9 清理,清理后 live /health 恢复正常(200/3.7ms)。

4.6 匿名鉴权探针(G8,本轮实测 6/6)

端点 HTTP body.code 判定
POST /api/mind/fortune/data 401 401 ✅
POST /api/energy/data/current 401 401 ✅
POST /api/health/plan/generate 401 401 ✅
POST /api/growth/record/list 401 401 ✅
POST /api/admin/families/overview 401 401 ✅
POST /api/huawei-health/status 401 401 ✅

B-142-1(曾长期「HTTP 200 + code:400」)销号维持第 10 轮。

4.7 线上与节点探活

目标 结果 判定
GET /admin 200 ✅
GET /frontend 200 ✅
GET / 404 ⚠️ B-141-3(与 R183 一致)
POST /api/health/data-sources/bridge/list 404 ⚠️ B-DX-1 第 27 轮(契约登记未实现,skip 正确)
POST /api/health/data-sources/bridge/sync-status 404 ⚠️ 同上
251:4096 200 ✅ G10
189:4090 200 ✅ G10
204:4090 000 ⚠️ B-95 第 40 轮

五、五要素问题清单

问题 1:B-184-1(P1,本轮新)后端全量耗时劣化,全量巡检已不可在窗口内完成

  1. 问题描述:同源码下,R183 全量 368 类 / 3111 例 / 33:49;本轮同命令 mvn -o -B clean test 在 39 分钟只完成 76 类(≈2 类/分钟),推算全量 ≈184 分钟(5.4×)。慢类 Top5 合计 1025 秒(GuideRolePermissionTest 455.5s 单类即占 11 分钟)。
  2. 测试 bug 点:cfc-backend/src/test/java/com/etotem/cfc/controller/GuideRolePermissionTest.java(455.5s)、.../controller/FamilyControllerTest.java(192.3s)、.../controller/PaymentControllerTest.java(136.8s)、.../controller/GuideFamilyTaskControllerTest.java(125.9s)、.../controller/DimensionRegistryTreeTest.java(114.3s);公共装置侧:src/test/resources 缺 application-test.yml,导致每类 @SpringBootTest 均新建上下文并重跑 DatabaseInitializer 全量迁移。
  3. 最优修改方案:① 为慢类抽公共基类 + @MockBean 收敛非必要 Bean,或把 @SpringBootTest 降级为 @WebMvcTest/standalone MockMvc(这 5 类均只测 controller 层);② 新增 src/test/resources/application-test.yml(H2/测试库 + spring.datasource.hikari.maximum-pool-size=4)统一夹具,抑制上下文重建与迁移;③ 修复 B-170-1/B-156-1 两条迁移语法错(每条失败会重试 + 打日志);④ 慢类加 @Timeout 与 surefire forkedProcessTimeoutInSeconds。
  4. 修改目的:使全量回归重新回到 ≤50 分钟窗口(G13/B-173-3 目标),恢复「每轮可全量实测」的能力,避免出现本轮这种「只能截断 + 沿用」的取证降级。
  5. 能否闭环:能。复测:修复后连跑 2 轮 mvn -o -B clean test,总时长 ≤50min 且类/例数与 368/3111 一致,即销号。

问题 2:B-152-1/2(P0/P1,第 16 轮)CI 排除清单双向失真

  1. 问题描述:.gitlab-ci.yml 的 BACKEND_OBSERVED_CLASSES 共 33 类,与本轮实测 14 红类做双向差集:漏拦 7 类(GrowthPublicEndpointMappingTest、MembershipPlanPurchaseContractTest、FamilyRemoveMemberContractTest、TaskReviewScP11ContractTest、UserServiceWechatLoginTest、UserServiceWechatLoginContractTest、TeamProfitCronContractTest)、陈旧 26 类(已连续多轮全绿仍被排除)→ backend-blocking-junit 必然失败,同时硬门禁覆盖面被人为缩小 26 类。
  2. 测试 bug 点:.gitlab-ci.yml:61 BACKEND_OBSERVED_CLASSES 字符串(清单与实测快照脱节)。
  3. 最优修改方案:以本轮 14 红类为权威快照重建清单(删 26 陈旧 + 加 7 漏拦),并在 CI 增加「清单 ↔ surefire 实测红类」自动差集校验任务,任何一侧漂移即报警。
  4. 修改目的:恢复 CI 门禁可信度(G11),使「红 = 真红」可被自动拦截,杜绝「CI 绿但线上红 / CI 红但与本轮无关」的双向虚化。
  5. 能否闭环:能。复测:重建后 CI 跑全量,漏拦 0 + 陈旧 0 且 backend-blocking-junit 结果与实测红类完全一致。

问题 3:B-142-2(P0,观察 7/13)langgraph 上游 LLM 不可达

  1. 问题描述:251 节点 /health 200(3.7ms),但 POST /api/v1/chat 000 / 45s 零字节、analyze 同源;pytest 侧 2 failed / 49 passed,两例均因 ConnectError('All connection attempts failed')。红由 3 收窄至 2,但离销号线(连续 2 轮 51/51)仍远。
  2. 测试 bug 点:cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_content_relevance、::test_auto_tag_short_content。
  3. 最优修改方案:① 修复 251 节点 LLM 上游可达性(代理/域名/凭据任一环节)并加健康探针(/health 之外增加 /health/llm 真实打点上探);② 对 LLM 依赖用例引入「上游不可达 → skip 并打 ENV_RED 标记」机制,避免把环境故障计入用例红;③ 上游恢复后连续 2 轮 51/51 销号。
  4. 修改目的:消除 AI 五能力(对话/问卷/画像/推荐/解析)的整域环境红,使 langgraph 51 例可作为可信回归网;同时让「环境红」与「代码红」在报告层可分离。
  5. 能否闭环:能。复测:连续 2 轮 251 实派 51/51 且 EXIT=0。

问题 4:B-177-1(P1,第 7 轮复现)pytest 打印 summary 后进程不退出

  1. 问题描述:2 failed, 49 passed in 244.73s 已打印,但 pid 1915739 stat=Sl 存活 7 分 38 秒仍未退出,echo EXIT=$rc 永不执行 → 日志无 EXIT= 行。任何以退出码判定的 CI 步骤会挂到超时被杀。
  2. 测试 bug 点:cfc-langgraph pytest 收尾(线索:RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited);派发器 docs/tdd/tools/dispatch_251_pytest.cjs:49。
  3. 最优修改方案:① 产品侧在 shutdown 钩子 await client.aclose(),或用 httpx.AsyncClient 的 async with;② 派发器 kick 串统一加 timeout -k 10 900,并在 timeout 后单独落盘 EXIT=124;③ CI 以「summary 行存在 + 进程已退出」双条件判定。
  4. 修改目的:使 langgraph 套件可被 CI 自动执行而不挂死,同时让退出码成为可信信号(而非长期噪声)。
  5. 能否闭环:能。复测:kick 后 ps 无残留且日志含 EXIT=0。

问题 5:B-156-1(P1,第 9 轮)nutrition_age_dosage DDL 与实体三重不一致

  1. 问题描述:schema.sql:5345-5357 建表含 INDEX idx_product (product_id),但该表无 product_id 列 → 每轮上下文启动均抛 SQLSyntaxErrorException: Key column 'product_id' doesn't exist in table(本轮 2 次),DatabaseInitializer catch 后仍打「数据表检查完成」→ 表从未创建成功;实体 NutritionAgeDosage.java:33-34 另有 updateTime 而 DDL 无 update_time 列(建表修好后仍会 Unknown column)。
  2. 测试 bug 点:cfc-backend/src/main/resources/schema.sql:5345(DX 缺陷在 DDL 而非用例;当前无任何用例断言该表存在,属覆盖缺口)。
  3. 最优修改方案:① DDL 补 product_id BIGINT NOT NULL 列(或删 idx_product 索引,二选一,按产品语义定);② 补 update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;③ 补 1 条「关键业务表存在性契约测试」(information_schema.tables 断言 nutrition_age_dosage/nutrition_ul_limit 等存在),把「建表静默失败」变成可拦截红例。
  4. 修改目的:消除「DDL 恒失败但无人知晓」的静默缺陷面,并把 DatabaseInitializer 的 swallow 行为纳入测试守护。
  5. 能否闭环:能。复测:全量日志 Key column 'product_id' doesn't exist 出现 0 次 + 新增表存在性契约测试全绿。

问题 6:B-170-1(P2,第 6 轮)activities.approved_count 迁移语句语法非法

  1. 问题描述:DatabaseInitializer.java:2261 的 UPDATE activities a SET a.approved_count = (SELECT … WHERE r.activity_id = a.id …) 在 MySQL 非法(SET a.col 带别名 + 派生表引用被更新表别名)→ 本轮 2 次 Unknown column 'a.id' in 'where clause',该列唯一写入点即此语句 → 持久化列恒 0(消费侧 ActivityRegistrationService:327 走动态计算,故前端暂不受影响)。
  2. 测试 bug 点:cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java:2261(产品侧 SQL 缺陷,无用例守护)。
  3. 最优修改方案:改写为 UPDATE activities SET approved_count = (SELECT COUNT(*) FROM activity_registrations r WHERE r.activity_id = activities.id AND r.status='approved')(去掉别名引用),并补 1 条「审批后 approved_count 与 activity_registrations 计数一致」的集成断言。
  4. 修改目的:消除持久化列恒 0 的一致性缺陷,避免未来消费侧切到该列时出现统计数据错误。
  5. 能否闭环:能。复测:日志无 Unknown column 'a.id' + 新增一致性断言全绿。

问题 7:S-cfc-176 幂等复用分支未生效(P1,增量复验新发现,唯一剩余会员购买红例)

  1. 问题描述:ca56f8699 实现 membership.plan.purchase 后,契约 7 例中 6 例转绿,剩 repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate 仍红:同 plan 重复购买时用例期望复用既有 pending 订单、不再 insert 新单,实际 paymentOrderMapper.insert(...) 被调用(NeverWantedButInvoked)。
  2. 测试 bug 点:cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java:201(repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate)。
  3. 最优修改方案:在 MembershipService.createOrder(或 purchasePlan 入口)中,先按 (familyId, planId, status=PENDING) 调 findReusablePendingOrder,命中则直接返回该订单 DTO 并跳过 paymentOrderMapper.insert;仅在未命中时新建。注意与 toOrderDTO 的字段口径保持一致(复用路径不得刷新 createTime/amount)。
  4. 修改目的:消除「重复点击购买 → 多张 pending 单 → 重复扣款/对账困难」的资损面,使 S-cfc-168 从「部分闭环」走到 GREEN。
  5. 能否闭环:能。复测:mvn -o -B test -Dtest=MembershipPlanPurchaseContractTest 7/7 全绿即销号。

六、覆盖缺口清单(8 项)

# 缺口 类型 现状 风险 建议测试设计 优先级 闭环方式
1 后端全量本轮未跑完 G1/G2 76/368 类截断,改用同源码沿用 「368 类逐例」未经本轮独立复现 先解 B-184-1 再全量 P0 耗时 ≤50min 后连跑 2 轮全量
2 langgraph 上游不可达 G7 红 2(3→2),live chat 000/45s AI 五能力无法验收 换凭据 + /health/llm 真实探针 P0 B-142-2 连续 2 轮 51/51
3 CI 清单双向失真 G11 漏拦 7 / 陈旧 26(第 16 轮) 门禁必红且覆盖虚化 14 红类快照重建 + 自动差集校验 P0 漏拦 0 + 陈旧 0
4 契约预期 RED(S-cfc-176 幂等 1 + S-cfc-178 4) G2/G3 7+4 → 1+4(增量复验后 6 例转绿) 会员购买幂等分支 / 移除成员缓存重算仍空窗 研发补齐后定向复跑 P1 7/7 + 4/4 转绿
5 pytest 进程不退出 G7/CI 第 7 轮复现,存活 7m38s CI 挂死 await client.aclose() + timeout -k P1 残留 0 + EXIT=0
6 根级黑盒环境红 G2 16 红全 ECONNREFUSED 9082 黑盒盲区 指向线上或本地起 9082 P2 非 5xx 全绿
7 关键表存在性无断言 G2 B-156-1 表从未建成却无人拦 静默 schema 缺陷 information_schema 表存在性契约 P1 新增用例全绿
8 变异/依赖漏洞/SAST G16 无工具/未授权 漏洞面未知 CI 离线缓存 NVD + pitest P1 工具链落地

七、执行档与授权(双档)

  • review 档(本轮执行):离线白名单命令——mvn -o -B clean test(截断)+ 14 红类 -Dtest= 定向(04:51)、两套 Jest、Playwright 浏览器(内网 cfc.iwintrue.com,189/本机已授权)、线上 API 点名 4 文件、匿名鉴权探针、节点探活。
  • execute 档(本轮无):SCA 依赖漏洞扫描、性能压测、DAST/渗透——未授权未执行,降级为「测试设计 + 缺口诊断」,不写成已测。
  • SRS/需求档(本轮零命中):specs 201 / test-cases 16 / user-scenarios 11 / API_REFERENCE.md 窗口零变更 → 用例零新增(G12 ✅)。

7.1 度量口径(B-124/B-32 仍未闭环,双口径并列)

指标 本轮值 口径说明
用例台账 表行 876 / 唯一 TC 308 tests/test-cases/*.md 表格行 vs TC-<域>-<...>-<NN> 去重
用户场景 唯一 SC 152 docs/superpowers/specs/*.md 显式编号
场景→用例映射 88 / 152 = 57.9% 台账中显式引用 SC 编号
可执行锚点 100 排除 tests/e2e/api/generated(253 条脚本化虚高)
双向命中 / 孤儿 / 空转 62 / 38 / 246 台账∩锚点 / 有执行无台账 / 有台账无锚点
G9 可执行锚点覆盖率 20.1%(62/308) 严格口径;宽口径(含 generated)277/315 不作门禁

八、门禁结论(Verdict)

结论:⛔ 不通过(承袭;但 G1 由 ❌ 转 ✅——增量复验后通过率 98.14%)

门禁 结果 依据
G1 通过率 ✅ 98.14%(3913/3987;剔 skip 98.76%)≥ 98%;注:后端为「同源码沿用 + 增量复验」混合口径,标「待下轮全量复核」
G2 红例 ❌ 49(后端 28 + 根级 16 + langgraph 2 + 前端 3 预期 RED)
G3 前端 ⚠️ 624 口径(609/3/12),3 红全预期 RED(S-cfc-132/133 + AC-2 RED-A7)
G4 管理端 ✅ 116/116(17 套件,120.9s)
G5 编译/完整性 ✅ 主源 2121 + 测试源 375 0 编译错;定向复验 BUILD FAILURE 为预期
G6 浏览器 ✅ 28/28 + 2 跳(189 admin 5/5 EXIT=0;本机 fe 6 / shop 4 / health 13;dx 2 跳)
G7 langgraph ❌ 49/51 = 96.1%(红 2,全环境)
G8 鉴权 ✅ 匿名 6 端点 6/6 = 401
G9 覆盖锚点 ❌ 20.1%(62/308 严格口径)
G10 双节点 ✅ 251(51 例)+ 189(5/5,spec blob 一致)
G11 CI 门禁 ❌ 漏拦 7 / 陈旧 26(第 16 轮)
G12 SRS 合规 ✅ 主窗零变更;窗口末 API_REFERENCE.md 随 ca56f8699 新增 §4.50.1 → 已核对「文档↔用例」一致(契约先于实现落地),用例零新增,见 §10.4
G13 零漂移 ⚠️ 13/14 红类逐例一致;TaskReview 1F→2F(B-178-1 装置浮动,非产品回归)
G14 场景映射 ❌ 57.9%(88/152)
G16 安全工具链 ❌ 无 SCA/SAST(未授权未执行)

变化摘要(vs R183):

  1. 正向(含增量复验):S-cfc-176 合入使会员购买契约 7F→1F(6 例转绿) → 后端红 34→28、全站通过率 97.97%→98.14%(+0.17pct)、G1 转 ✅;langgraph 红 3→2;红类定向复验逐例可复现(13/14 类完全一致)。
  2. 负向(新):B-184-1 后端全量耗时劣化至 >2h(R183 33:49),迫使本轮降级为「截断 + 沿用」,全量巡检能力受损——这是本轮最重要的问题。
  3. 持平:浏览器 / 两套 Jest / 线上 API / 根级 / 匿名鉴权 / 站点可达性逐项与 R183 一致;B-156-1、B-170-1、B-152-1/2 仍未修(第 9 / 6 / 16 轮);S-cfc-178 仍 4F。

复评转「通过」条件:

  1. B-184-1 修复 → 全量 ≤50min 且连跑 2 轮 368 类/3111 例一致(恢复每轮可全量);
  2. S-cfc-176 幂等分支补齐 → MembershipPlanPurchaseContractTest 7/7 绿(当前 6/7,剩 repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate,见问题 7);
  3. S-cfc-178 实现 → FamilyRemoveMemberContractTest 4/4 绿;
  4. 251 上游恢复 → langgraph 连续 2 轮 51/51(B-142-2 销号)+ B-177-1 EXIT=0;
  5. CI 以 14 红类快照重建双向差集(B-152-1/2)→ 漏拦 0 + 陈旧 0;
  6. 根级黑盒改指向(B-36)+ 授权执行 SCA/压测/SAST 且零高危。

九、增量复验(窗口末功能合入后的补测,本报告最终结论以此为准)

10.1 触发

本轮主体跑测基于 fcbce94b3(=R183 实测基线,零源码变更)。收尾推送前 git fetch 发现远端前进 8 提交,其中 ca56f8699 为真实功能提交(非 docs/构建元数据):

ca56f8699 feat(membership): implement membership.plan.purchase (S-cfc-176)
  - MembershipService: purchasePlan + fail-fast no-family guard
  - MembershipService: findReusablePendingOrder / toOrderDTO(createOrder 幂等辅助)
  - MembershipService: markMembershipOrderFailed(幂等) + rollbackOrderToPending
  - MembershipController: POST /api/membership/plan/purchase
  - docs: API_REFERENCE §4.50.1 + PROJECT-OVERVIEW

按 R156 教训「跑测窗口内合入的功能变更必须单独处置(rebase → 增量复验 → 按变更补用例)」执行:pull --rebase --autostash 至 HEAD=6d3564510,再定向复跑相关契约。

10.2 复验结果

契约类 主窗(fcbce94b3) 增量(6d3564510) 判定
MembershipPlanPurchaseContractTest 7F / 7 1F / 7(6 例转绿) ✅ 大幅改善,S-cfc-168 由「未实现」→「部分闭环」
FamilyRemoveMemberContractTest 4F / 8 4F / 8(持平) ⚠️ S-cfc-178 仍未实现
  • 命令:mvn -o -B test -Dtest='MembershipPlanPurchaseContractTest,FamilyRemoveMemberContractTest' → Total time 03:17,EXIT=1(有红例);
  • 剩余 1 红:repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201 → org.mockito.exceptions.verification.NeverWantedButInvoked: paymentOrderMapper.insert(<any PaymentOrder>),即同 plan 重复购买时应复用 pending 订单、不得再 insert 新单,实现里 findReusablePendingOrder 未在该分支生效;
  • 日志另见 会员开通失败: 家庭无归属用户, familyId=5, orderNo=MO_PLAN_001 + 会员开通失败,已回滚为待支付 → 新实现的 fail-fast 与回滚链路已在跑,行为符合预期。

10.3 结论修正

指标 主窗 修正后(最终)
后端红 34 28
全站红 55 49
全站通过 3907 3913
通过率 97.99% 98.14%(剔 skip 98.76%)
G1 门禁 ❌ ✅(≥98%)

10.4 SRS 闸门修正(G12)

  • 窗口内 docs/superpowers/api/API_REFERENCE.md 有变更(新增 §4.50.1 POST /api/membership/plan/purchase)——此为「接口文档随实现同步」,非新增需求;
  • 对应契约用例(MembershipPlanPurchaseContractTest 7 例)在实现前已契约先行落地,故 无需新增用例,但按纪律已核对「文档 → 用例」一致性:文档 §4.50.1 的五参方法 + 端点与用例断言逐项对应 → G12 仍 ✅(变更已核对、用例已覆盖);
  • 未因该变更触发用例编写闸门(用例数 0 新增)。

十、下轮前置

测试侧

  1. 优先复核 B-184-1:若研发未改慢类/夹具,下轮改用「分批全量(-Dtest 按包切片)+ 汇总」策略,保证每轮都能拿到全量逐例结论,不再截断;
  2. 跟踪 S-cfc-168/178 实现进度,落地即定向复跑;
  3. 补「关键业务表存在性契约测试」,把 B-156-1 类静默 DDL 缺陷纳入守护;
  4. 把 G9 双口径写死在本报告 §7.1,下轮沿用同一口径,避免与历史 13.4%/72.1% 混淆。

研发侧(按 P 级排序)

  1. P0 B-184-1:5 个慢类降级 @WebMvcTest/standalone + application-test.yml 夹具 + 修 B-170-1/B-156-1 迁移语法错;
  2. P0 B-152-1/2:CI BACKEND_OBSERVED_CLASSES 按 14 红类快照重建(漏拦 7 + 陈旧 26);
  3. P0 B-142-2:251 LLM 上游可达性 + 凭据;
  4. P1 B-177-1:pytest 收尾 await client.aclose();
  5. P1 B-156-1 / B-170-1:DDL 与迁移语句修正;
  6. P1 B-162-1:3 个未入库测试文件(GrowthPublicEndpointMappingTest 等)入库,否则 CI 不可见。

附录 A:本轮命令

# 基线
git fetch origin cfclub && git pull --rebase --autostash origin cfclub   # -> fcbce94b3
git diff --name-only 58671aa7a..HEAD | grep -vE '^(docs/|cfc-web/)'      # 空 => 零源码变更

# 环境探针(SOP 前置)
/d/jdk1.8.0_25/bin/java -version && /d/maven/apache-maven-3.6.1/bin/mvn -v

# 后端全量(截断于 76/368 类,39min)
cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 mvn -o -B clean test > ../_r184_backend.log 2>&1

# 后端 14 红类定向复验(103 例 / 29F+6E / 1S / 04:51)
mvn -o -B test -DfailIfNoTests=false -Dtest='EnergySystemFlowTest,GrowthPublicEndpointMappingTest,MembershipPlanPurchaseContractTest,FamilyRemoveMemberContractTest,DimensionRegistryMapContractTest,TaskReviewScP11ContractTest,GuideModuleIntegrationTest,OrchestrationEngineTest,OrchestrationIntegrationTest,MembershipPaySwitchTest,PaymentServiceORDRoutingTest,UserServiceWechatLoginTest,UserServiceWechatLoginContractTest,TeamProfitCronContractTest'

# Jest
cd cfc-web && npx jest --silent            # 116/116
cd cfc-frontend && npx jest --silent       # 624: 609/3/12
cd tests && npx jest --silent              # 23: 7/16

# 浏览器(每节点单任务,串行)
cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --workers=1   # 6/6
cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge --workers=1  # 4 + 2 跳
cd tests && npx playwright test -c playwright.config.health.js --workers=1                          # 13/13
node docs/tdd/tools/dispatch_189_admin.cjs                                                          # 189: 5/5 EXIT=0

# langgraph@251
node docs/tdd/tools/dispatch_251_pytest.cjs kick && node docs/tdd/tools/dispatch_251_pytest.cjs read

# 线上 API(点名 4 文件,避免 990 例误跑)
cd tests && npx playwright test -c playwright.config.api.js --workers=1 \
  e2e/api/api-smoke.spec.js e2e/api/nonfunc-security.spec.js \
  e2e/api/nonfunc-perf-compat.spec.js e2e/api/traceability-p94-p95-c26.spec.js

附录 B:本轮取证产物

文件 内容
_r184_backend.log 截断全量日志(76 类 / 1 红类 / 编译 0 错 / SQL 异常分类)
_r184_red_classes.log 14 红类定向复验(103 例 / 29F+6E / 1S / BUILD FAILURE / 04:51)
/tmp/r150_pytest.log(251) langgraph 51 例(2 failed / 49 passed / 244.73s,无 EXIT= 行)