report-test-2026-11-13-R185.md 40 KB

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

本汇报按《测试负责人工作汇报模板》填写。R185 为定向复验轮:基线 cfclub @ 58ee58114(=origin,07:14 fetch 核验;R184 增量复验修正已含 ca56f8699 membership 实现)。窗口内(R184 推送后)零提交、零源码变更,与 R184 最终实测基线 58ee58114 做 git diff 核验:src 变更 = 0。 本轮后端全量跑测按「先探速再决定」执行:08:16 启动 mvn -o -B clean test,实测 8 分钟仅完成 13 类(≈1.6 类/分钟,比 R184 的 2 类/分钟更慢) → B-184-1 持续(第 2 轮,宿主 CPU 已降至 40% 仍无改善,证结构性根因)→ 按纪律主动截断,改「同源码全量结果沿用 R184 增量后最终值 + 本轮 14 红类定向实测复验」双证,口径与本轮实测逐类对齐。 ★ 结果变化:全站 3987 例 / 3907 过 = 97.99%(剔 skip 98.61%),环比 -6 过(langgraph 环境红 +5、TaskReview 装置浮动 +1)——G1 回落 ❌(97.99% 略低于 98% 线),详见 §八。


基本信息

项目 内容
汇报人 测试负责人(自动化测试闭环任务 / 软件测试专家团·陆谨)
汇报周期 2026年11月13日 07:14 ~ 07:45(第 185 轮)
基线 cfclub @ 58ee58114(=origin,07:14 fetch 核验)
窗口内需求变更 零 — SRS/场景/接口文档零变更(G12 ✅,用例零新增)
窗口内源码变更 零 — 6d3564510..58ee58114 仅 docs(R184 汇报自身),src 命中 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(同源码沿用 R184 最终值 + 本轮 103 例红类定向复验)+ 前端 Jest 624 + 管理端 116 + langgraph 51(本轮实测)+ 浏览器 30(28 过 + 2 跳,本轮实测)+ 线上 API 32(25 过 + 7 跳,本轮实测)+ 根级 23(本轮实测)
用例通过率 97.99%(3907/3987;剔除 skip 98.61%) 红 55 / 跳 25,环比 -6 过,明细见 §四
用例台账 tests/test-cases/ 16 份 / 表行 876 / 唯一 TC 308 场景 152 / 可执行锚点 100(排除 generated 253 条脚本化);与 R184 口径一致

1.2 会话与任务分发

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

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

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

1.3 问题处置

指标 数量 填写说明
新测试发现问题数* 0 个 无新 B-#;B-184-1 持续、B-142-2 恶化(环境红)均为承袭项
已解决测试相关问题数* 0 个 各承袭项未见修复;langgraph 红 2→7(恶化,环境红形随配额漂移)
待解决测试相关问题数 P0×2 / P1×6 / P2×4 ① B-142-2 langgraph 上游 LLM 不可达(P0,第 15 轮,本轮恶化红 2→7:401 ****ab12 + 429 免费配额耗尽双因齐发);② B-152-1/2 CI 清单双向失真(P0/P1,第 17 轮,漏拦 7 / 陈旧 26);③ B-184-1 全量耗时劣化 >2.5h(P1,第 2 轮);④ B-156-1 nutrition_age_dosage DDL 缺陷(P1,第 10 轮);⑤ B-162-1 3 类未入库测试(P1);⑥ S-cfc-176 幂等分支 1 例未闭环(P1,第 2 轮);⑦ S-cfc-178 契约预期 RED 4 例(P1);⑧ B-177-1 pytest 进程不退出(P1,第 8 轮复现);⑨ B-173-1 safe-delete 守卫(P2);⑩ B-178-1 反射装置浮动(P2,本轮维持 2F);⑪ B-95 204 节点失联(P2,第 41 轮);⑫ B-170-1 activities.approved_count 迁移语法错(P2,第 7 轮)

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

提交 sha 关联任务/能力键 阶段 触及文件类型 目标分支 已推送远端 备注
(收尾)R185 commit 全站巡检 R185 汇报 报告 + 运行台账 + blockers + 研发通知 cfclub ✅ 本轮推送 langgraph 环境红 2→7、G1 回落 → 提交并通知研发

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

阶段 键数 备注
UNTRACKED 0 窗口零新增规格
RED 11 S-cfc-168 契约 1 例(幂等)+ S-cfc-178 契约 4 例 + 其他预期 RED 6 例
YELLOW 72 研发负责人口径
GREEN 8 承袭
DONE 15 承袭
合计 106 研发侧状态账本口径

1.6 数据源健康度

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

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

项 内容
上次审查 R184(2026-11-13 07:20,提交 58ee58114),结论「不通过(承袭;G1 转 ✅)」,最终口径全站 3987/3913(98.14%,剔 skip 98.76%),后端红 28(含 S-cfc-176 增量 -6),langgraph 49/51 红 2,14 红类定向 13/14 类逐例一致
遗留缺口 后端存量红 28 · langgraph 环境红 2 · 根级 16 红(9082 未起)· CI 漏拦 7/陈旧 26(B-152-1/2)· 3 未入库测试(B-162-1)· B-177-1 pytest 不退出 · B-178-1 反射装置 · B-184-1 后端全量耗时劣化 >2h(本轮持续且更慢)· S-cfc-176 幂等 1F + S-cfc-178 4F 契约预期 RED
本次是否改善 ① 恶化:langgraph 红 2→7(401+429 双因齐发,intent 4 例复红,全环境红非回归);② 恶化:B-184-1 持续(13 类/8min ≈1.6 类/min,比 R184 更慢);③ 持平:14 红类定向逐类与 R184 一致(零漂移第 21 次,TaskReview 维持 2F 装置浮动);④ 持平:浏览器/两套 Jest/根级/线上 API/匿名鉴权 6/6 全 401 逐项零漂移
教训应用 ① 全量探速前置:本轮启动后 8 分钟即核速度,确认 1.6 类/min → 及时截断,未浪费窗口(R184 39min 才截断);② CPU 负载与速度解耦:本轮 CPU 40%(R184 100%)但速度更慢 → 证 B-184-1 根因为结构性(慢类 + 每类上下文 + 迁移错),非宿主负载;③ 251 kick 用内联命令串 + POSIX 日志路径(R173 教训),本轮日志正常落盘;④ 251 派前查残留(本轮无残留),派后清残留(pid 3402723 kill,B-177-1 第 8 轮)

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


三、项目画像与覆盖矩阵

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

维度 内容
业务定位 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城
技术栈 Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000@251)
模块结构 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 例(同源码沿用 R184 + 本轮 14 红类 103 例定向复验)+ 前端 624 + 管理端 116 + 浏览器 30 + 线上 API 32 + langgraph 51 + 根级 23
质量目标 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发
风险点 ① 后端红 29(承袭 28 + TaskReview 装置 +1)· ② B-184-1 全量耗时劣化持续(本轮更慢)· ③ langgraph 上游双因(401 key + 429 配额)红 7 · ④ CI 排除清单漏拦 7 + 陈旧 26(B-152-1/2 第 17 轮)· ⑤ 根级 16 红(9082 未起)
待核实项 nutrition_age_dosage DDL 缺陷修复状态(B-156-1 第 10 轮未修)· S-cfc-176 幂等/S-cfc-178 实现排期 · 251 上游凭据与配额 · 204 节点恢复(B-95 第 41 轮)· 本轮全量截断导致「368 类全量逐例」未经本轮独立复现(以 R184 增量后同源码结果为准,标「待全量耗时修复后复核」)

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

# 测试类型 三态 证据(本轮实测)
1 单元测试 ✅ 已发现 后端 368 类 3111 例(同源码沿用 + 本轮定向 103 例);前端 42 文件 624 例(本轮实测)
2 测试覆盖率 ⚠️ 部分 管理端 Jest 覆盖率可产出;后端未开 jacoco(未授权改 pom)
3 变异测试 ❌ 未发现 全仓无 pitest/mutation 配置
4 集成测试 ✅ 已发现 *IntegrationTest(GuideModule/EnergySystemFlow/Orchestration 等)本轮定向实测,红数一致
5 契约测试 ✅ 已发现 契约类 20+;S-cfc-176 幂等 1F / S-cfc-178 4F 预期 RED 维持;TaskReviewScP11 2F(B-178-1 装置浮动)
6 接口 API 测试 ✅ 已发现 线上 API 32 例(25 过 / 7 跳 / 0 红,本轮实测 38.2s)
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 套件全量回归 + 后端红类定向复验;存量红集合 14/14 类逐例一致(零漂移第 21 次)
12 探索性测试 ✅ 已发现 本轮现场探索:langgraph 红 7 全定性为 401/429 环境红;全量速度探针(1.6 类/min)证 B-184-1 结构性;无新缺陷
13 性能测试 ⚠️ 部分 nonfunc-perf-compat.spec.js(7 跳中部分属性能项);压测未授权未执行;后端全量实测耗时劣化持续(B-184-1)
14 可靠性测试 ⚠️ 部分 上游 LLM 401/429 提供弱故障注入证据(health 200/4.4ms 而 LLM 链路降级);无长稳/混沌测试
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%(严格口径,与 R184 一致)、G11 CI 失真(第 17 轮)

四、本轮实测明细

4.1 套件数据

套件 执行 通过 红 跳 耗时 判定
后端 JUnit 全量 13/368 类 — 0 — 8m(截断) ⚠️ 本轮探速即截断(1.6 类/min,B-184-1 持续第 2 轮);前 13 类全绿,testCompile 375 源 0 错
后端 14 红类定向复验(本轮实测) 103 73 23F+6E=29 1 ≈04:51(Total time 4m 级) 14/14 类逐例与 R184 一致(零漂移第 21 次);TaskReview 维持 2F(B-178-1 装置浮动)
后端全量结果(沿用 R184 增量后,同源码) 3111 3079 28 4 — 本轮 git diff 证 src 零变更 → 沿用并显式标注;R184 已含 S-cfc-176 增量 -6
前端 Jest(本轮实测) 624 609 3 12 19.4s 3 全预期 RED(S-cfc-132/133 + AC-2 RED-A7)
管理端 Jest(本轮实测) 116 116 0 0 18.4s 全绿(17 套件)
langgraph@251(本轮实测) 51 44 7 0 114.21s 红 2→7(恶化):auto_tag 3 + intent 4,全环境红(401 key ****ab12 + 429 免费配额耗尽)
浏览器 189+本机(本轮实测) 30 28 0 2 1.2m+1.3m dx 2 跳(契约仅登记不实现)
线上 API 非功能层(本轮实测) 32 25 0 7 38.2s 契约缺口 3 例 fixme(同 R184/R183)
根级黑盒(本轮实测) 23 7 16 0 3.9s 全 ECONNREFUSED 9082(B-36 第 70 轮)
合计(采用「后端沿用 R184 增量后」口径) 3987 3907 55 25 — 97.99%(剔 skip 98.61%)

vs R184(3913 过 / 98.14%):-6 过、红 49→55。构成:langgraph 红 2→7(-5 过,环境红)+ TaskReview 装置浮动 1F→2F(-1 过,非产品回归)。其余套件逐项零漂移。 口径声明(重要):后端 3111 例为「同源码沿用 R184 增量后」,非本轮独立复现。本轮实证 = 全量前 13 类 + 14 红类 103 例定向(29 红逐例与 R184 一致)。G1 的 97.99% 是「本轮实测 6 套件 + 同源码沿用 1 套件」的混合口径,且 CFC 后端全量能力因 B-184-1 尚不可用,已在 blockers 双处标注。

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

红类 本轮实测 R184 一致性
EnergySystemFlowTest 7 例 / 6F / 1S 6F / 1S ✅ 一致
GrowthPublicEndpointMappingTest(未入库,B-162-1) 5 例 / 5E 5E ✅ 一致
MembershipPlanPurchaseContractTest 7 例 / 1F 1F(增量后) ✅ 一致(幂等分支未修,问题 7 第 2 轮)
FamilyRemoveMemberContractTest 8 例 / 4F 4F ✅ 一致(S-cfc-178 预期 RED)
DimensionRegistryMapContractTest 7 例 / 3F 3F ✅ 一致(存量 P-9)
TaskReviewScP11ContractTest 8 例 / 2F 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 例 / 23F+6E / 1S = 29 红 29 红 ✅ 14/14 类逐例一致(零漂移第 21 次)

BUILD FAILURE(预期,有红例);Total time 04:51(同量级);testCompile 375 源 0 错。 口径:28 红为「R184 增量后承袭值(TaskReview 按 1F)」;本轮定向实测 29 红含 TaskReview 2F(+1 装置浮动),故全站红 55 = 后端 29 + 根级 16 + langgraph 7 + 前端 3,已在 §八 G2 如实标注。

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

证据 值
编译 主源 2121 / 测试源 375,0 编译错
完成类数 13 / 368(Tests run: 计数,全部 config 包小类)
已用时间 8 分钟(07:16 启动 → 07:26 截断),≈ 1.6 类/分钟
宿主负载 CPU 40%(R184 为 100%)——速度未随负载下降改善,证根因为结构性
单类 前 13 类均 <1s(config 小类);慢类(GuideRolePermission 455s 等)尚未轮到
推算 若维持 1.6 类/分钟 → 全量 ≈ 230 分钟(>2.5h),比 R184 推算的 184min 更慢
处置 主动 kill(pid 18124/14148),改「同源码沿用 + 红类定向复验」,不把截断当全量结论
结论 B-184-1 持续第 2 轮且未见缓解(结构性:慢类 @SpringBootTest 重上下文 + 缺 application-test.yml 重跑迁移 + B-170-1/B-156-1 迁移错);CPU 40% 仍 1.6 类/min 排除了「R184 高负载致慢」的单因解释

4.4 langgraph 红例(7,较 R184 恶化 5 例)

例 归因
test_auto_tag.py::test_auto_tag_valid_format chat 端点 500;日志 401 Authentication Fails, Your api key: ****ab12 is invalid(召回记忆/保存记忆失败)+ 429 AgnesAI free rate limit
test_auto_tag.py::test_auto_tag_short_content 同上(401 + 429)
test_auto_tag.py::test_auto_tag_empty_content 同上(429 RateLimitError 6.87s/8.43s)
test_intent.py::test_classify_analysis intent_classifier.py:62 意图分类失败: 429 rate limit → 默认 chat → assert CHAT == ANALYSIS 失败
test_intent.py::test_classify_recommend 同上(429 → 默认 chat)
test_intent.py::test_classify_mind 同上(429 → 默认 chat)
test_intent.py::test_classify_health 同上(429 → 默认 chat)
  • 双因齐发(较 R184 单因 ConnectError 更广):① 记忆召回/保存 401 key ****ab12 invalid → chat 500(auto_tag 3 红);② 意图分类 429 AgnesAI 免费用户每日文本配额耗尽(request id 时间戳 2026-11-12 23:18 UTC = 本日 07:18 CST)→ intent 全降级默认 chat(intent 4 红);
  • 节点 HEAD 4bf5117b0(langgraph 目录零源码差异,窗口零提交);/health 200/4.4ms(服务进程活)→ 判环境红(C 类),非代码回归;
  • 红例形随配额/凭据漂移(R184 为 ConnectError、R183 为 429/401)→ 印证「不要沿用上轮红例归因」;
  • intent 4 例曾连续 2 轮绿(R183/R184),本轮复红 → B-142-2 观察由 7/13 回落(配额耗尽窗口性,非持续)。

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

  • summary 已打印 7 failed, 44 passed in 114.21s,但 bash -c(pid 3402720)与 .venv/bin/python -m pytest(pid 3402723)存活未退出 → 日志无 EXIT= 行;
  • 已 kill -9 清理,清理后 251 /health 200/4.4ms 正常;ps | grep pytest = 0;
  • 第 8 轮复现(R177 首发、R184 第 7 轮、本轮第 8 轮),佐证「被测进程挂死」而非 shell 引号/MSYS 路径问题。

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」)销号维持第 11 轮。

4.7 线上与节点探活

目标 结果 判定
GET /admin 302(→登录) ✅
GET /frontend 302(→登录) ✅
GET / 404 ⚠️ B-141-3(与 R184 一致)
251:4096 200 ✅ G10
189:4090 200 ✅ G10
204:4090 000 ⚠️ B-95 第 41 轮
189 spec blob 4703d73fb ✅ = 本机(跨节点可比)

五、五要素问题清单

问题 1:B-184-1(P1,第 2 轮持续)后端全量耗时劣化,全量巡检不可行

  1. 问题描述:同源码下 R184 39min 仅 76 类(≈2 类/min);本轮 8min 仅 13 类(≈1.6 类/min),推算全量 ≈230min(>2.5h),比 R184 更慢。本轮宿主 CPU 仅 40%(R184 100%),速度不升反降 → 排除单因高负载,证结构性根因。
  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. 最优修改方案:① 慢类降 @WebMvcTest/standalone MockMvc(5 类均只测 controller 层);② 落 src/test/resources/application-test.yml(H2 + 小连接池)抑制上下文重建与迁移;③ 修 B-170-1/B-156-1 两条迁移语法错;④ 慢类加 @Timeout + surefire forkedProcessTimeoutInSeconds。
  4. 修改目的:恢复全量回归 ≤50min 窗口能力,避免每轮「截断 + 沿用」的取证降级。
  5. 能否闭环:能。复测:修复后连跑 2 轮 mvn -o -B clean test 总时长 ≤50min 且类/例数一致。

问题 2:B-152-1/2(P0/P1,第 17 轮)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 字符串(与实测快照脱节,第 17 轮未修)。
  3. 最优修改方案:以本轮 14 红类为权威快照重建清单(删 26 陈旧 + 加 7 漏拦),CI 增加「清单 ↔ surefire 实测红类」自动差集校验任务。
  4. 修改目的:恢复 CI 门禁可信度(G11),杜绝双向虚化。
  5. 能否闭环:能。复测:重建后漏拦 0 + 陈旧 0 且 backend-blocking-junit 与实测红类一致。

问题 3:B-142-2(P0,第 15 轮,本轮恶化红 2→7)langgraph 上游 LLM 不可达(双因)

  1. 问题描述:251 节点 /health 200(4.4ms),但 ① 记忆召回/保存 401 key ****ab12 invalid → chat 500;② 意图分类 429 AgnesAI 免费用户每日文本配额耗尽 → 默认 chat。pytest 44 过 / 7 红(R184 为 49/2)。红由 2 恶化至 7(intent 4 例复红 + auto_tag 3 全红),全环境红。
  2. 测试 bug 点:cfc-langgraph/tests/test_auto_tag.py::test_auto_tag_{valid_format,short_content,empty_content}、tests/test_intent.py::test_classify_{analysis,recommend,mind,health}。
  3. 最优修改方案:① 运维轮换 ****ab12 key(长期 401)+ 升级 AgnesAI 配额(每日免费额度不足);② 加 /health/llm 真实打点上探;③ 对 LLM 依赖用例引入「上游不可达 → skip + ENV_RED 标记」,把环境故障与用例红分离。
  4. 修改目的:消除 AI 五能力整域环境红;让「环境红」与「代码红」在报告层可分离;解除 429/401 对通过率的拖累。
  5. 能否闭环:能。复测:连续 2 轮 251 实派 51/51 且 EXIT=0。

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

  1. 问题描述:7 failed, 44 passed in 114.21s 已打印,但 pid 3402723 存活未退出,echo EXIT=$rc 永不执行 → 日志无 EXIT= 行。
  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 + 单独落盘 EXIT=124;③ CI 以「summary 行存在 + 进程已退出」双条件判定。
  4. 修改目的:使 langgraph 套件可被 CI 自动执行而不挂死,退出码成可信信号。
  5. 能否闭环:能。复测:kick 后 ps 无残留且日志含 EXIT=0。

问题 5:S-cfc-176 幂等复用分支未生效(P1,第 2 轮,唯一剩余会员购买红例)

  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 字段口径一致。
  4. 修改目的:消除「重复点击购买 → 多张 pending 单 → 重复扣款/对账困难」资损面。
  5. 能否闭环:能。复测:mvn -o -B test -Dtest=MembershipPlanPurchaseContractTest 7/7 全绿即销号。

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

  1. 问题描述:schema.sql:5345-5357 建表含 INDEX idx_product (product_id) 但无 product_id 列 → 每轮上下文启动抛 SQLSyntaxErrorException: Key column 'product_id' doesn't exist,DatabaseInitializer catch 后仍打「数据表检查完成」→ 表从未创建成功;实体 NutritionAgeDosage.java:33-34 另有 updateTime 而 DDL 无 update_time 列。
  2. 测试 bug 点:cfc-backend/src/main/resources/schema.sql:5345;当前无任何用例断言该表存在(覆盖缺口)。
  3. 最优修改方案:① DDL 补 product_id BIGINT NOT NULL(或删 idx_product);② 补 update_time DATETIME ...;③ 补「关键业务表存在性契约测试」。
  4. 修改目的:消除「DDL 恒失败但无人知晓」静默缺陷面。
  5. 能否闭环:能。复测:全量日志无 Key column 'product_id' doesn't exist + 新增表存在性契约全绿。

问题 7:B-170-1(P2,第 7 轮)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 带别名 + 派生表引用被更新表别名)→ 本轮 Unknown column 'a.id' in 'where clause',该列唯一写入点即此语句 → 持久化列恒 0。
  2. 测试 bug 点:cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java:2261。
  3. 最优修改方案:改写为 UPDATE activities SET approved_count = (SELECT COUNT(*) FROM activity_registrations r WHERE r.activity_id = activities.id AND r.status='approved'),补「审批后计数一致」集成断言。
  4. 修改目的:消除持久化列恒 0 一致性缺陷。
  5. 能否闭环:能。复测:日志无 Unknown column 'a.id' + 新增断言全绿。

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

# 缺口 类型 现状 风险 建议测试设计 优先级 闭环方式
1 后端全量本轮未跑完 G1/G2 13/368 类探速即截断,改用同源码沿用 「368 类逐例」未经本轮独立复现 先解 B-184-1 再全量 P0 耗时 ≤50min 后连跑 2 轮全量
2 langgraph 上游不可达(双因) G7 红 2→7(401 key + 429 配额) AI 五能力无法验收 轮换凭据 + 升级配额 + /health/llm 探针 P0 B-142-2 连续 2 轮 51/51
3 CI 清单双向失真 G11 漏拦 7 / 陈旧 26(第 17 轮) 门禁必红且覆盖虚化 14 红类快照重建 + 自动差集校验 P0 漏拦 0 + 陈旧 0
4 契约预期 RED(S-cfc-176 幂等 1 + S-cfc-178 4) G2/G3 1 + 4 维持 会员购买幂等分支 / 移除成员缓存重算仍空窗 研发补齐后定向复跑 P1 7/7 + 4/4 转绿
5 pytest 进程不退出 G7/CI 第 8 轮复现 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= 定向、两套 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 仍未闭环,双口径并列,与 R184 一致)

指标 本轮值 口径说明
用例台账 表行 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 由 ✅ 回落 ❌——langgraph 环境红恶化使通过率跌破 98% 线)

门禁 结果 依据
G1 通过率 ❌ 97.99%(3907/3987;剔 skip 98.61%)< 98%(差 0.01pct,全因 langgraph 环境红 +5 + TaskReview 装置 +1);注:后端为「同源码沿用 + 定向复验」混合口径
G2 红例 ❌ 55(后端 29 + 根级 16 + langgraph 7 + 前端 3 预期 RED)
G3 前端 ⚠️ 624 口径(609/3/12),3 红全预期 RED(S-cfc-132/133 + AC-2 RED-A7)
G4 管理端 ✅ 116/116(17 套件,18.4s)
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 ❌ 44/51 = 86.3%(红 7,全环境)
G8 鉴权 ✅ 匿名 6 端点 6/6 = 401
G9 覆盖锚点 ❌ 20.1%(62/308 严格口径)
G10 双节点 ✅ 251(51 例)+ 189(5/5,spec blob 4703d73fb 与本机一致)
G11 CI 门禁 ❌ 漏拦 7 / 陈旧 26(第 17 轮)
G12 SRS 合规 ✅ 窗口零变更(R184 已含 §4.50.1 核对),用例零新增
G13 零漂移 ⚠️ 14/14 红类逐例一致(零漂移第 21 次);TaskReview 维持 2F(B-178-1 装置浮动,非产品回归)
G14 场景映射 ❌ 57.9%(88/152)
G16 安全工具链 ❌ 无 SCA/SAST(未授权未执行)

变化摘要(vs R184):

  1. 负向(本轮主要变化):langgraph 红 2→7(401 key ****ab12 + 429 AgnesAI 免费配额耗尽双因齐发,intent 4 例复红)→ 通过率 98.14%→97.99%(-0.15pct)、G1 由 ✅ 回落 ❌;B-184-1 持续且更慢(39min/76类→8min/13类,≈1.6 类/min)。
  2. 持平:14 红类定向逐例一致(零漂移第 21 次);浏览器/两套 Jest/根级/线上 API/匿名 6 端点 401 逐项零漂移;B-156-1、B-170-1、B-152-1/2、B-177-1、B-178-1 仍未修(第 10 / 7 / 17 / 8 / 5 轮);S-cfc-176 幂等 1F、S-cfc-178 4F 维持。
  3. 正向:无(本轮无新闭环项;189 admin 5/5 首轮即绿第 7 轮维持、匿名 401 维持第 11 轮)。

复评转「通过」条件:

  1. B-184-1 修复 → 全量 ≤50min 且连跑 2 轮 368 类/3111 例一致;
  2. B-142-2 运维处置(轮换 ****ab12 + 升级 AgnesAI 配额)→ langgraph 连续 2 轮 51/51 + B-177-1 EXIT=0;
  3. S-cfc-176 幂等分支补齐 → MembershipPlanPurchaseContractTest 7/7 绿;
  4. S-cfc-178 实现 → FamilyRemoveMemberContractTest 4/4 绿;
  5. CI 以 14 红类快照重建双向差集(B-152-1/2)→ 漏拦 0 + 陈旧 0;
  6. 根级黑盒改指向(B-36)+ 授权执行 SCA/压测/SAST 且零高危。

九、下轮前置

测试侧

  1. 优先复核 B-184-1:若研发未改慢类/夹具,下轮改用「按包切片全量(-Dtest 分组)+ 汇总」策略,保证每轮拿到全量逐例结论,不再截断;同时把「探速截断」阈值写死(≥1.5 类/min 即截断,避免空耗窗口);
  2. 跟踪 S-cfc-176 幂等 / S-cfc-178 实现进度,落地即定向复跑;
  3. 251 派发前先查残留、派后必须核 EXIT= 行 + ps 残留双判据(B-177-1 第 8 轮教训);
  4. 下轮若 langgraph 红仍随配额漂移,在报告中单列「环境红漂移带」不与代码红混算。

研发侧(按 P 级排序)

  1. P0 B-142-2:轮换 ****ab12 key + 升级 AgnesAI 免费配额(本轮双因齐发,比此前任何一轮更广,已阻碍 G1 达标);
  2. P0 B-184-1:5 个慢类降 @WebMvcTest/standalone + application-test.yml 夹具 + 修 B-170-1/B-156-1 迁移语法错;
  3. P0 B-152-1/2:CI BACKEND_OBSERVED_CLASSES 按 14 红类快照重建(漏拦 7 + 陈旧 26);
  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                       # -> 58ee58114(=origin,07:14 核验)
git diff --name-only 6d3564510..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
# 节点:189:4090=200 / 251:4096=200 / 204:4090=000;线上 admin/frontend=302、/404;CPU 40%

# 后端全量(探速即截断于 13/368 类,8min,≈1.6 类/min)
cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 mvn -o -B clean test > ../_r185_backend.log 2>&1
# (8min 后 kill pid 18124/14148 截断)

# 后端 14 红类定向复验(103 例 / 23F+6E / 1S / 04:51,14/14 类逐例一致)
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(18.4s)
cd cfc-frontend && npx jest --silent       # 624: 609/3/12(19.4s)
cd tests && npx jest --silent              # 23: 7/16(3.9s)

# 浏览器(每节点单任务,串行;统一 --output 一次性目录规避 safe-delete 守卫)
cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --workers=1 --output=../_r185/fe     # 6/6
cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge --workers=1 --output=../_r185/shop  # 4 + 2 跳
cd tests && npx playwright test -c playwright.config.health.js --workers=1 --output=../_r185/health                         # 13/13
node docs/tdd/tools/dispatch_189_admin.cjs                                                          # 189: 5/5 EXIT=0

# langgraph@251(kick 内联命令串 + 远端 POSIX 日志路径)
node _r185_251_lg.cjs kick && node _r185_251_lg.cjs read    # 44 过 / 7 红 / 114.21s;无 EXIT 行 → kill 残留 pid 3402723

# 线上 API(点名 4 文件,避免 990 例误跑)
cd tests && npx playwright test -c playwright.config.api.js --workers=1 --output=../_r185/api \
  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   # 25 过 / 7 跳 / 0 红

# 匿名鉴权 6 端点(全 401)

附录 B:本轮取证产物

文件 内容
_r185_backend.log 探速截断全量日志(13 类 / 0 红 / 编译 0 错 / 8min)
_r185_red_classes.log 14 红类定向复验(103 例 / 23F+6E / 1S / BUILD FAILURE / 04:51)
/tmp/r185_pytest.log(251) langgraph 51 例(7 failed / 44 passed / 114.21s,无 EXIT= 行)
_r185/(fe/shop/health/api) 浏览器套件输出(一次性目录,规避 safe-delete 守卫)