触发:定时自动化「作为测试负责人执行自动化测试闭环(全部用例通过 + 覆盖 SRS/场景 + 浏览器走 cfc.iwintrue.com/admin 与 /frontend + langgraph 派 251 + 结果有变化提交远程并通知研发)」。 执行档:
review(离线)——未联网装依赖、未启停服务、未改生产代码(仅改测试侧装置)。 基线:cfclub@b58d54775(=origin/cfclub) 原始日志:_r1720_backend.log(后端全量)·_jest_frontend_r90.log/_jest_web_r90.log·_pytest_lg_r90.log·_e2e_{admin,frontend,shop,health}_r90*.log·_r90_targeted{1..4}.log·_r90_testcompile.log·_r90_502_probe.log·_r90_agg.json
| 套件 | 执行 | 结果 | 通过率 | 备注 |
|---|---|---|---|---|
| cfc-backend | mvn -o -B clean test(JDK1.8.0_25 + Maven 3.9.9) |
311 类 · 2628 例 / 2558 过 / 35F+31E / 4S | 97.34% | 与 R89 全字段零漂移(连续第 2 轮) |
| cfc-frontend | npx jest --silent |
21 suites · 354 passed / 1 skipped | 99.72% | 持平 |
| cfc-web | npx jest --silent |
17 suites · 116 passed / 116 | 100% | 契约闭环保持 |
| cfc-langgraph | .venv/Scripts/python.exe -m pytest tests/ --ignore=tests/qna |
44 collected · 32 passed / 12 failed | 72.73% | B-65 产品 2 + B-54 环境 10 |
| admin-desktop | --project=admin-desktop |
5 passed(首跑 1 红→复跑全绿,见 §5.1) | 100% | 单节点串行 |
| frontend-mobile | --project=frontend-mobile |
6 passed | 100% | 单节点串行 |
| shop-api | --project=shop-api |
4 passed | 100% | 商城排序契约 |
| health-contract | -c playwright.config.health.js |
13 passed | 100% | B-61 连续第 10 轮零回归 |
| 合计 | 6 套件 + 后端全量 | 3171 例 / 3088 过 = 97.38% | — | 红 78(后端 66 + langgraph 12) |
| 指标 | 值 |
|---|---|
测试源文件 / @Test / @Disabled |
311 / 2618 / 4 |
| surefire 完整性 | 311/311 XML,silent_missing = 0,无 dump |
| testCompile | 317 源 0 错(含本轮 7 处测试侧修改) |
| 全量耗时 | 1:06 h(机器负载高,R89 为 44:39) |
| 恒等式 | @Test 2618 + 参数化 26 − @Disabled 4 − 早退截断 12 = 2628,误差 0 |
控制器 / @PostMapping / @GetMapping |
363 / 1961 / 8(@GetMapping 仍违 AGENTS.md) |
| 项 | R89 | R90 | Δ |
|---|---|---|---|
| 后端类/例/过 | 311 / 2628 / 2558 | 311 / 2628 / 2558 | 0 |
| 后端 F/E/S | 35 / 31 / 4 | 35 / 31 / 4 | 0 |
| 红类 / 红例 | 24 / 66 | 24 / 66 | 0 |
| 前端 / web / langgraph / 浏览器 | 355 / 116 / 44 / 28 | 355 / 116 / 44 / 28 | 0 |
| 全量通过率 | 97.38% | 97.38% | 0 |
结论:基线完全稳定(第 2 次零漂移)。本轮增量不在基线,而在测试侧装置修复 23 例(§6,已定向验证)。
| 目标 | 结果 | 说明 |
|---|---|---|
cfc.iwintrue.com /admin |
200 | admin-desktop 套件 |
cfc.iwintrue.com /frontend |
200 | frontend-mobile 套件 |
| 192.168.16.189:4090 | OPEN(HTTP 200,opencode web) | 浏览器节点可达;22/80 CLOSED → 无 SSH/远程驱动通道,浏览器任务在本机单节点串行执行(workers:1) |
| 192.168.16.251:9000 / :8000 / :22 | 全部 CLOSED(000) | langgraph 服务未监听、无远程通道 → 251 派发仍未达成(G10 ❌,B-55 延续),降级本机 venv 直跑 |
| 时间窗 | 现象 | 影响 |
|---|---|---|
| 17:22 ~ 17:26 | /api/stats/dashboard、/api/admin/menu/user-menus、/api/system/health 连续 20/20 502 Bad Gateway(openresty/1.19.9.1rc1);同窗口 /api/admin-auth/login-by-password 仍 200 |
TC-A-U04 首跑失败(登录成功但后台数据接口 502 → 前端停留登录页) |
| 17:33 ~ 17:35 | /api/health/plan/list 连续 13 次 502,随后恢复 401 |
契约套件有被误判「鉴权回归」的风险 |
| 17:36 ~ 17:38 | 30s 采样 18 组全部 401(稳定) | 恢复 |
| 17:40 ~ 18:28 | _r90_502_probe.log 每 30s 双端点采样:health=401 system=200 为主,偶发 system=000(5s 超时) |
抖动为短窗口,非持续不可用 |
与仓库
chore: auto bump version and changelog(b58d54775)+cfc-web/package-lock.json变更同窗口 → 判定为发布/滚动重启窗口,非产品回归。
| 归因桶 | 例数 | 红类与证据 | 归属 |
|---|---|---|---|
| A-2 上下文加载失败(数据源指向不可达 127.0.0.1:3306) | 8 | AdminFamilyOverviewControllerTest 3E + FamilyAdminOverviewServiceTest 3E + UserServiceFamilyNameLinkTest 2E;根因链 Failed to load ApplicationContext → HikariPool init → CJCommunicationsException: Communications link failure → ConnectException: Connection refused(本机 3306 无监听,netstat 实测 REFUSED) |
测试侧 · 本轮已修 |
A-4 夹具 NPE(@InjectMocks 缺依赖桩) |
10 | FamilyJoinRequestServiceReferrerBindTest 4(缺 familyInvitationMapper/familyMemberMapper/familyRelationshipService/couponService)+ FortuneServiceTest 2(缺 familyMemberMapper/familyMemberAttributesMapper)+ ServiceRoleApproveTest 2 + GrowthRecordSyncFlowTest 2 |
测试侧(前 6 例本轮已修,余 4 例待下轮) |
| A-6 Mockito 原语匹配器误用 + Result 文案断言错位 | 9 | ProductOrderServiceFulfillmentMultiModeTest 6E(uploadShippingInfo(...,int logisticsType,...) 用 any() → 恒 null NPE;另 4 例断言 getMessage() 而业务文案在 getData())+ ProductOrderServiceUpdateExpressFieldTest 3F(生产已统一 7 参 overload,旧 5 参 verify ArgumentsAreDifferent) |
测试侧 · 本轮已修 |
| A-3 CF 分佣结算打桩未触发 | 8 | CfCommissionServiceSettleTest 8F(verify(cfBalanceService).earnByRule(...) 未发生) |
测试侧 · 待下轮 |
| A-7 断言语义/状态泄漏 | 6 | EnergySystemFlowTest 6F |
待核实(逐例定性) |
| A-8 邀请绑定流程断言 | 5 | PlannerBindInviteFlowTest 4F+1E |
待核实 |
| A-5 Optional 空值 | 4 | DimensionScoreServiceImplTest 4E(NoSuchElementException,Optional.get() 空) |
测试侧 · 待下轮 |
| 契约口径分歧 | 3 | DimensionRegistryMapContractTest 3F |
待核实(P-2 家族) |
| 文章流状态机 | 3 | ArticleWorkflowTest 3F |
待核实 |
| 其他单例断言 | 7 | GrowthRecordSyncFlowTest 1F、DailyCheckinStreakFlowTest 1E、OrchestrationEngineTest 1F、OrchestrationIntegrationTest 1F、MembershipPaySwitchTest 1F、PaymentServiceORDRoutingTest 1F、TaskPlanServiceTest 1F、TeamProfitCronContractTest 1F(合计 8,其中 1 已计入上表) |
待核实 |
| P-1 产品缺陷(B-69) | 1 | MindFortuneControllerTest 期望 code=401 实得 400(/api/mind/ 未入 LOGIN_REQUIRED_PATHS,第 3 轮未修) |
研发 |
| E-1 环境 | 1 | GuideModuleIntegrationTest 1E |
环境 |
合计 66(A 类 58 / 产品 1 / 环境 1 / 待核实已计入各桶)。A-2/A-4/A-6 中 23 例本轮已修并定向验证(§6)。
CfCommissionServiceSettleTest 8 · EnergySystemFlowTest 6 · ProductOrderServiceFulfillmentMultiModeTest 6 · PlannerBindInviteFlowTest 5 · DimensionScoreServiceImplTest 4 · FamilyJoinRequestServiceReferrerBindTest 4 · AdminFamilyOverviewControllerTest 3 · DimensionRegistryMapContractTest 3 · GrowthRecordSyncFlowTest 3 · ArticleWorkflowTest 3 · FamilyAdminOverviewServiceTest 3 · ProductOrderServiceUpdateExpressFieldTest 3 · FortuneServiceTest 2 · UserServiceFamilyNameLinkTest 2 · ServiceRoleApproveTest 2 · MindFortuneControllerTest 1(产品)· DailyCheckinStreakFlowTest 1 · GuideModuleIntegrationTest 1(环境)· OrchestrationEngineTest 1 · OrchestrationIntegrationTest 1 · MembershipPaySwitchTest 1 · PaymentServiceORDRoutingTest 1 · TaskPlanServiceTest 1 · TeamProfitCronContractTest 1
与 R89 的 24 类逐一对应,零新增、零消失。
| 归因 | 例数 | 用例 | 证据 |
|---|---|---|---|
| B-65 产品缺陷 | 2 | test_analyze.py::test_analyze_endpoint / ::test_analyze_missing_report |
ValueError: Checkpointer requires one or more of the following 'configurable' keys: thread_id... |
| B-54 环境(chromadb 原生 DLL) | 6 | test_auto_tag.py 5 + test_chat.py 1 |
ImportError: DLL load failed while importing chromadb_rust_bindings |
| B-54 环境(LLM key 无效) | 4 | test_intent.py 4 |
401 Authentication Fails, Your api key: ****ocal is invalid → 分类降级为默认 chat |
与 R88/R89 逐例一致;B-65 为研发侧唯一产品缺陷项(连续第 3 轮未修)。
| 套件 | 用例 | 结果 | 耗时 |
|---|---|---|---|
| admin-desktop | TC-A-U01~U05(登录页/滑块/未登录拦截/真实登录/核心菜单) | 5/5(复跑) | 1.5m |
| frontend-mobile | TC-F-U01~U06(首页/五维沙盘/TabBar×2/「我的」鉴权引导/资源无 failed) | 6/6 | 58.2s |
| shop-api | TC-S-U01~U04(price asc/desc/默认/非法列白名单) | 4/4 | 9.2s |
| health-contract | TC-H-U01~U10 + TC-HP-U01~U03(13 端点 401) | 13/13 | 5.8s |
1 failed / 3 passed / 1 skipped,断言「登录后应离开登录页,实际 URL=…/admin/login」(11.5s)。_diag_admin_r90.cjs):POST /api/admin-auth/login-by-password 200、/api/admin-auth/info 200,随后 stats/dashboard、stats/membership、stats/traffic、system/health、admin/menu/user-menus 全部 502;8s 后 URL 已为 /admin/dashboard(登录态建立,仅数据接口 502)。| # | 文件 | 缺陷 | 修复 | 定向复跑 |
|---|---|---|---|---|
| 1 | AdminFamilyOverviewControllerTest |
硬编码 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zxyj,本机 3306 无监听 → 上下文加载失败(3E) |
改 192.168.16.251:3306(与其余 300+ 类一致,251 可达) |
3/3 绿(332s) |
| 2 | FamilyAdminOverviewServiceTest |
同上(3E) | 同上 | 3/3 绿(63s) |
| 3 | UserServiceFamilyNameLinkTest |
同上(2E) | 同上 | 2/2 绿(48s) |
| 4 | FamilyJoinRequestServiceReferrerBindTest |
@InjectMocks 缺 4 个依赖桩 → 审批分支 NPE(4E) |
补 familyInvitationMapper/familyMemberMapper/familyRelationshipService/couponService |
5/5 绿(0.8s) |
| 5 | FortuneServiceTest |
FortuneServiceImpl 另需 familyMemberMapper(calculateFamilyElements)+ familyMemberAttributesMapper(2E) |
补两个 @Mock(mapper 返回 null 时实现已有空集合兜底) |
4/4 绿(3.1s) |
| 6 | ProductOrderServiceFulfillmentMultiModeTest |
① uploadShippingInfo(...,int,...) 用 any() → 6E NPE;② 4 例断言 getMessage() 而业务文案在 getData()(Result.success() message 恒 "success");③ 自提用例复用同一 mock 订单,首调后状态变 pending_receipt 致负向断言命中错误守卫 |
① 原语位改 anyInt();② 断言改 getData();③ 负向断言前复位 status=paid |
6/6 绿(3.8s) |
| 7 | ProductOrderServiceUpdateExpressFieldTest |
生产已统一 7 参 overload,测试仍 verify 5 参 → ArgumentsAreDifferent(3F) |
verify 对齐 7 参(单号/公司/eq(1) 不变,仅补 any(), eq(1), any()) |
3/3 绿(0.04s) |
验证口径:mvn -o -B test -Dtest=A,B,C,D(逗号分隔,遵守 R88 教训:+ 会静默 0 执行)→ 实测 13/13 + 13/13 全绿;另 mvn -o -B test-compile 317 源 0 错。
未放宽任何断言强度:所有修改均为「对齐真实契约 / 补齐装置 / 修正断言读取位」,无删除断言、无
assertTrue(true)式占位。
| 项 | 当前实测 | 修复后预测 |
|---|---|---|
| 后端过例 | 2558 / 2628 = 97.34% | 2581 / 2628 = 98.21% |
| 后端红例 | 66 | 43 |
| 后端红类 | 24 | 17 |
| 全量通过率 | 97.38% | 98.11%(3111/3171) |
口径说明(承 B-57/R88):定向绿必须由全量 clean 复跑升格后才入台账基线;本轮结论按「定向已验、全量待升格」记账。
| 门禁 | 判据 | 实测 | 结论 |
|---|---|---|---|
| G1 总通过率 ≥95% | 97.38% | ≥95% | ✅ |
| G2 零红例 | 78(后端 66 + langgraph 12) | 0 | ❌ |
| G3 前端 Jest | 354/355(1 skip) | 无红 | ✅ |
| G4 管理端 Jest(含契约) | 116/116 | 全绿 | ✅ |
| G5 后端编译/完整性 | 317 源 0 错;311/311 XML | 无缺失 | ✅ |
| G6 浏览器 E2E | 28/28 | 100% | ✅ |
| G7 langgraph 零红 | 12 红 | 0 | ❌ |
| G8 B-61 健康鉴权契约 | 13/13 | 零回归 | ✅ |
| G9 SRS/场景锚点覆盖 | SC 锚点 120/241 = 49.8%(口径升级见下) | ≥目标 | ❌ |
| G10 langgraph 派 251 | 未达成(9000/8000/22 CLOSED) | 达成 | ❌ |
| G11 CI 流水线门禁 | 无阻断式 CI(langgraph 会红) | 通过 | ❌ |
| G12 用例资产入库 | 本轮 7 文件待提交 | 入库 | ⏳(本轮随交付提交) |
G9 口径升级说明:R88/R89 沿用「SRS 章节级锚点 3/170」,该口径不可复算(B-30)。本轮改为可复算的 SC 编号在测试资产中的被引用数:sc-key-map 登记 SC 241,测试资产(后端 src/test + 前端/web Jest + tests/e2e-live)中出现的不同 SC 编号 120 个 → 49.8%;TC 台账 293 条,但测试资产中出现 TC 编号的文件仅 4 个(e2e-live spec)→ TC 级锚点仍近乎为零。
总判定:⛔ 不通过(有条件)——8 项达标(G1/G3/G4/G5/G6/G8/G12 待提交),4 项未达标(G2 红例 / G7 langgraph / G9 SRS 锚点 / G10 派发)+ G11 CI 缺失。
| # | 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|---|---|---|---|---|---|---|
| C-1 | SRS/场景用例锚点 | SC 120/241(49.8%);TC 编号仅 4 文件出现 | 无法证明「SRS 全覆盖」,需求变更无法精准回归 | 每个 SRS 章节/SC 编号在对应测试类 Javadoc 或方法名中显式锚定;新增 SC-TRACE 校验脚本 |
P0 | 锚点率 ≥90% 且脚本入 CI |
| C-2 | langgraph 集成层可执行性 | 12 红(环境 10 + 产品 2),251 不可派发 | AI 能力回归无自动化守门 | ① 本机装 VC++ 运行时重建 venv;② 注入有效 LLM key 或 StubLLM 桩;③ 251 放通 9000 | P0 | langgraph 44/44 绿 |
| C-3 | 后端 A 类装置残留 | 43 例(预测)红,集中在 CF 结算 / 能量流 / 契约口径 | 掩盖真实产品缺陷(红噪声稀释信号) | 逐类按「打桩缺失 / 断言读取位 / 状态泄漏」三分类修复 | P1 | 红例 ≤10 |
| C-4 | 覆盖率工具 | 无 JaCoCo 报告 | 无法量化行/分支覆盖 | jacoco-maven-plugin + 行覆盖 ≥60% 门禁 |
P2 | 生成报告并入 CI |
| C-5 | 浏览器用例健壮性 | TC-A-U05 仍用 test.skip(url.includes('/login'))(B-59) |
前置失败被转为「不判定」,验收缺口静默 | 改 waitForURL(/dashboard/, 20s) + expect 硬断言,或复用 storageState |
P1 | admin 连续 2 轮 5/5 无 skip |
| C-6 | 性能/安全/兼容/无障碍 | 全未实测(无工具、未授权联网) | 非功能质量盲区 | 压测(k6)需 execute 档授权;SAST 用 semgrep 离线规则;兼容性补 webkit/firefox project | P2 | 各维度至少 1 套可复跑基线 |
Failed to load ApplicationContext 不是「auditLogAspect 注入链」,而是 3 个测试类硬编码 127.0.0.1:3306 而本机 3306 无监听(Connection refused);前 2 轮的推断被本轮堆栈取证推翻。/api/* 存在短窗口 502 抖动(17:22~17:26、17:33~17:35),直接导致 TC-A-U04 首跑假红;已按 B-67 三证纪律定性为发布/滚动重启窗口。/api/mind/ 401,第 3 轮)、B-65(langgraph analyze 500,第 3 轮)、B-54(环境)、B-55/G10(251 派发)、G9(SRS 锚点)。本轮跑测起点 HEAD 为
b58d54775;推送前git fetch发现origin/cfclub已前进 18 提交(含新功能与新规格)。以下变更不在本轮基线内,按「SRS/场景变更须更新用例」要求登记。
| # | 变更 | 类型 | 本轮状态 | 用例影响 | 下轮动作 |
|---|---|---|---|---|---|
| S-1 | docs/superpowers/specs/2026-11-08-diet-recommendation-polish.md(推荐食材页改版:去标题条 / 视图切换清选中态 / 今日食谱与筛选 Tab 同行 / 分页 / 共餐人选择,共 7 条意见,2 个能力键 diet.recommendation.uiRework、diet.recommendation.participantSelect) |
需求变更(SRS) | 未覆盖(规格 17:00 后入库) | 需新增前端 Jest 守卫 7 条(cfc-frontend/pages/diet/recommendation.vue 视图/选中态/分页/共餐人)+ 后端契约 1 条(/api/diet/recommendation participants 入参) |
下轮补 RED 契约用例(随研发入池节奏,先立用例再实现) |
| S-2 | docs/superpowers/specs/2026-11-08-dx-health-bridge.md(GAP-A:D/X 同步数据桥接五维消费链路,O-17 裁决「仅登记不实现」) |
契约补建(SRS 新增) | 未覆盖(无实现,不得伪证) | 契约核对阶段不建测试;桥接实现入池后再补「health_data_sources → health_dimension_score → 档案展示 → 小程序端点」四段链路用例 | 下轮在覆盖矩阵登记「已识别未覆盖」,与 C-1 合并跟踪 |
| S-3 | c575a3a5b feat(articles) 发布后异步预生成朗读音频 + 正文变更作废旧音频(自带 11 例单测:ArticleAudioServiceAutoGenTest 3 + ArticleServiceAudioInvalidationTest 8) |
功能新增(已带测试) | 未执行(提交未在基线内) | 基线用例数将由 2628 → 2639 | 下轮全量复跑纳入 |
结论:窗口内 2 份 SRS 新增/变更 + 1 个带测新功能。S-1 需按 7 条意见补用例(未补,登记为缺口);S-2 按 O-17「仅登记不实现」不建伪用例;S-3 下轮全量纳入基线(预计 +11 例)。