automation-run-2026-11-08-R90.md 19 KB

自动化运行证据(第 90 轮 · 2026-11-08 17:20 ~ 19:05)

触发:定时自动化「作为测试负责人执行自动化测试闭环(全部用例通过 + 覆盖 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


1. 实测结果总表

套件 执行 结果 通过率 备注
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)

1.1 后端关键度量

指标 值
测试源文件 / @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)

1.2 与上轮基线对比

项 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,已定向验证)。


2. 环境与节点分派实测

目标 结果 说明
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 直跑

2.1 线上 502 抖动窗口(本轮新增环境证据 → B-72)

时间窗 现象 影响
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 变更同窗口 → 判定为发布/滚动重启窗口,非产品回归。


3. 后端 66 例红因归因

3.1 归因分桶(按实测异常首帧 + 源码复核)

归因桶 例数 红类与证据 归属
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)。

3.2 24 个红类清单(按红例数降序)

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 类逐一对应,零新增、零消失。


4. langgraph 12 例红因(本机 venv 兜底,251 未派发)

归因 例数 用例 证据
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 轮未修)。


5. 浏览器自动化明细(单节点串行,28/28 全绿)

套件 用例 结果 耗时
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

5.1 TC-A-U04 首跑失败与复跑定性(B-67 纪律应用)

  • 首跑: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)。
  • 复跑:同套件 5/5 全绿(2.6/4.7/3.6/10.6/58.9s)。
  • 定性:上游 502 抖动窗口(§2.1),非用例缺陷、非鉴权回归;B-61 健康契约同窗口 13/13 未受影响。

6. 本轮代码改动(测试侧装置修复 7 文件,23 例)

# 文件 缺陷 修复 定向复跑
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) 式占位。

6.1 修复后预测(待下轮全量 clean 复跑升格为全量证据)

项 当前实测 修复后预测
后端过例 2558 / 2628 = 97.34% 2581 / 2628 = 98.21%
后端红例 66 43
后端红类 24 17
全量通过率 97.38% 98.11%(3111/3171)

口径说明(承 B-57/R88):定向绿必须由全量 clean 复跑升格后才入台账基线;本轮结论按「定向已验、全量待升格」记账。


7. 门禁判定

门禁 判据 实测 结论
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 缺失。


8. 覆盖缺口清单

# 缺口 现状 风险 建议测试设计 优先级 闭环方式
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 套可复跑基线

9. 结论与移交

  • 基线稳定:后端 2628 例 / 97.34%、24 红类 / 66 红例,与 R89 逐字段零漂移(第 2 次);前端/web/浏览器全绿;langgraph 32/44 与上两轮一致。
  • 本轮实质进展在测试侧:修复 7 个测试文件、23 例由红转绿(上下文 8 + 夹具 6 + Mockito/断言 9),定向复跑 26/26 全绿,预测后端 → 98.21%、全量 → 98.11%(待下轮全量升格)。
  • 新根因纠正(B-70):8 例 Failed to load ApplicationContext 不是「auditLogAspect 注入链」,而是 3 个测试类硬编码 127.0.0.1:3306 而本机 3306 无监听(Connection refused);前 2 轮的推断被本轮堆栈取证推翻。
  • 新环境缺陷(B-72):线上 /api/* 存在短窗口 502 抖动(17:22~17:26、17:33~17:35),直接导致 TC-A-U04 首跑假红;已按 B-67 三证纪律定性为发布/滚动重启窗口。
  • 仍未闭环:B-69(/api/mind/ 401,第 3 轮)、B-65(langgraph analyze 500,第 3 轮)、B-54(环境)、B-55/G10(251 派发)、G9(SRS 锚点)。
  • 本轮结果有变化(测试侧 23 例转绿 + 基线稳定证据)→ 交付件已提交并推送远程,研发交接通知同步落地。

10. 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 例)。