report-test-2026-11-10-R127.md 22 KB

测试负责人工作汇报 · 第 127 轮(2026-11-10 16:30~17:35)

执行档:review(内网 cfc.iwintrue.com 已授权;离线 mvn -o;未联网装依赖) 基线 HEAD:05f48f12d(= origin/cfclub,跑测期间分支/HEAD 未漂移) 分工:189=admin 浏览器套件|本机=frontend/shop/health 浏览器套件 + Jest + 后端全量|251=langgraph pytest|204=失联(B-95) 结论:⛔ 不通过(有条件) — 三项阻塞延续:G2 49 红 / G9 可执行锚点 9.9% / G11 无 CI 全量


1. 历史审查记录(仅作对照,不作为本轮结论依据)

轮次 时间 后端全量 langgraph 结论 遗留缺口
R123 11-10 13:30 2865 例 / 2828 过 / 98.71% / 33 红 43/42/1 不通过(有条件) G2 50 红、G9 17.1%、G11
R125 11-10 14:55 3501/3445=98.40%(引用上一轮后端) 43/43 全绿 不通过(有条件) G2 49、G9、G11
R126 11-10 15:55 未跑(仅 test-compile) 39/43(B-74 复发 4 例 LLM 401) 有条件通过 B-74、B-95、B-125
R127(本轮) 11-10 17:30 2865 例 / 2828 过 / 98.71% / 33 红(与 R123 逐字段一致) 43/43 全绿 不通过(有条件) G2 49、G9 9.9%、G11
  • 本轮为该对象第 127 轮持续闭环审查,非首次。
  • 与 R123 对比:后端逐类逐例零漂移(2865/2828/33 红,红类集合完全一致)→ 研发窗口内无后端源码变更。
  • B-74(langgraph 4 例 LLM 401)本轮未复现,43/43 全绿;因 R126 曾复发,按纪律「连续 2 轮绿才销号」记为观察第 1 轮。

2. 项目画像速览

  • 业务:浠艾福 XAF —— 家庭教育 SaaS(家庭成员/五维能量/成长规划师/健康报告/商城分佣/AI 管家)。
  • 技术栈:cfc-backend(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· cfc-web(Vue2 + ElementUI,Jest 116 例)· cfc-frontend(uni-app H5/小程序,Jest 426 例)· cfc-langgraph(FastAPI + LangGraph + Chroma,9000)· dan/danshop(独立商城 8888)。
  • 关键路径:登录/家庭邀请 → 五维测评 → 成长任务 → 健康报告上传解析 → 商城下单分佣(CF)→ AI 对话。
  • 测试现状:后端 339 测试类 / 2865 例(全量可跑);前端 Jest 27 套件;浏览器硬契约 28 例;langgraph 43 例。
  • 质量目标:20 类全覆盖、G1≥95%、G2≤10 红、G6 28/28、G7 0 红、G9≥80%。
  • 风险点:后端 33 红中 14 例产品类未闭环;SRS 锚点率长期 <30%(B-124 口径未统一);无 CI 全量门禁。

3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)

# 测试类型 状态 证据
1 单元测试 ✅ 已实测 后端 339 类 2865 例(surefire);web 116;fe 426
2 组件测试 ✅ 已实测 Vue shallowMount 组件用例(Families/AuditDetailDrawer 等 17+26 套件)
3 接口 API 测试 ✅ 已实测 后端 364 Controller 的 MockMvc/直调用例;线上 4 端点鉴权探针 401
4 集成测试 ✅ 已实测 integration.* 5 类(EnergySystem/GrowthRecordSync/GuideModule/DimensionRegistryMap)实跑
5 系统/端到端 E2E ✅ 已实测 浏览器 28/28(admin 5 / frontend 6 / shop-api 4 / health 13)
6 冒烟测试 ✅ 已实测 浏览器 28 例 + Jest 全绿即冒烟面
7 回归测试 ✅ 已实测 与 R123 后端逐字段零漂移;web/fe 零漂移;langgraph 由 39→43
8 探索性测试 ⚠️ 待核实 本轮只做定向探针(langgraph live chat/analyze),无 chartered 探索会话
9 验收 UAT / BDD ⚠️ 待核实 无 BDD(cucumber/gherkin)执行证据
10 性能测试 ⛔ 未授权未执行 压测属 execute 档(需联网授权),本轮未做
11 可靠性测试 ⚠️ 待核实 无混沌/恢复演练;仅观察 502 窗口与节点失联
12 安全测试(SAST/DAST/SCA/渗透) ⛔ 未授权未执行 依赖漏洞扫描/DAST 需联网;仅剩静态项(见 §7 #10)
13 兼容性测试 ⚠️ 待核实 仅 Chromium 单浏览器;无 iOS/Android/多浏览器矩阵
14 可用性测试 ⚠️ 待核实 无真实用户可用性证据
15 无障碍测试 ⚠️ 待核实 无 axe/WCAG 扫描
16 覆盖率度量 ⚠️ 已实测(低) cfc-web 语句 10.09% / 分支 6.12% / 函数 7.50% / 行 9.97%;后端 JaCoCo 未接入
17 变异测试 ⛔ 未发现 无 PIT/mutation 资产
18 契约测试 ✅ 已实测 鉴权契约 4/4 401(含 /api/mind/**);D/X 桥接契约 16 例在册全绿
19 QA 流程 ⚠️ 待核实 127 轮闭环可追溯;门禁未脚本化(G11)
20 全项目代码审查 ⚠️ 待核实 本轮仅做规范扫描(@GetMapping 8 处仍违 AGENTS.md),未跑全量静态审查

4. 实测结果明细(本轮真实信号,全部本机/节点实跑,无引用)

# 维度 命令/方式 节点 结果
1 后端全量 mvn -o -B clean test(JDK1.8.0_25 + Maven 3.6.1,42m36s) 本机 339 类 / 2865 例 / 2828 过 / 30F+3E+4S = 98.71%;14 红类 / 33 红例;339/339 XML 无沉默;testCompile 345 源 0 错;target/classes 2325 class
2 cfc-web Jest CI=true npx jest --ci --runInBand 本机 ✅ 17 套件 / 116 例全绿(18.1s)
3 cfc-frontend Jest 同上 本机 ✅ 26 套件 / 426 例 = 423 过 / 3 skip / 0 红(18.1s)
4 根级黑盒 Jest npx jest -c tests/jest.config.js 本机 ⚠️ 23 例 = 7 过 / 16 红(ECONNREFUSED 9082 未启,B-36 第 30 轮零漂移)
5 langgraph pytest 251 POST /api/shell 实派 .venv/bin/python -m pytest tests --ignore=tests/qna --ignore=tests/test_chat.py 251 ✅ 43 passed / 0 红(1020.56s);PYTEST_EXIT=124=测试跑完后解释器不退(timeout 收尾杀进程),非用例失败
6 管理端 UI E2E playwright -c live --project=admin-desktop 189 ✅ 5/5(1.3m,TC-A-U01~U05 含滑块+真实登录入主框架)
7 小程序 H5 E2E --project=frontend-mobile 本机 ✅ 6/6(1.1m,TC-F-U01~U06)
8 商城排序契约 --project=shop-api 本机 ✅ 4/4(11.6s,TC-S-U01~U04)
9 健康鉴权契约 -c playwright.config.health.js 本机 ✅ 13/13(7.6s,TC-HP-U01~U03 均 401)
10 线上鉴权探针 curl -X POST 4 端点匿名 本机 ✅ 4/4 = 401(/api/mind/fortune、/api/energy/overview、/api/health/plan/list、/api/huawei-health/status)→ B-69 连续 2 轮闭环
11 langgraph live POST /api/v1/chat、/api/v1/analyze(正确 schema) 本机→251 ❌ 均 90s 零字节(HTTP 000) → B-90 延续(/health 6ms 200、schema 校验层 422 均正常,仅 LLM 链路挂死)
12 节点探活 curl 4 节点 251:4096=200 / 251:9000={"status":"ok"} / 189:4090=200 / 204:4090=000(B-95) / 本机 9082 未启

全量计数(去重口径:后端 2865 + web 116 + fe 426 + 根级 23 + langgraph 43 + 浏览器 28)

  • 合计 3501 例,通过 3445 = 98.40%,红 49(后端 33 + 根级 16),skip 7(后端 4 + fe 3)。

5. 覆盖缺口清单

缺口 现状 风险 建议测试设计 优先级 闭环方式
G-127-1 SRS 可执行锚点 827 TC 行,末列锚点非空 234(28.3%),指向可执行用例仅 82(9.9%) 需求→用例不可双向追溯,改动无法判断回归面 为每个 spec 章节强制登记 ≥1 个可执行 anchor(用例名/测试类#方法) P1 test-cases/*.md 末列补锚点后重算 ≥80% 才过 G9
G-127-2 场景覆盖 SC 244,被 TC 引用 146(59.8%) 98 个场景无用例,验收无据 按 P0 场景优先补三类流(正常/异常/边界) P1 sc-key-map 与 TC 台账双向对账
G-127-3 后端产品红 14 例 EnergySystem 6×500、Orchestration 2、UserWechatLogin 2、MembershipPay 1、PaymentORD 1、TeamProfitCron 1、platform_fee 1 五维能量与微信登录为高频入口,可能真实不可用 先线上复现(可用账号)再定产品/装置 P0 研发修复后定向复跑转绿
G-127-4 装置红 16 例 CfCommission 8、ArticleAutoTag 4、GrowthRecordSync 3、TaskPlan 1 掩盖真实分佣/打标回归 按 §7 #1~#4 修装置 P1 定向复跑 16/16 绿
G-127-5 langgraph 运行时不收敛 测试 43/43 通过但进程不退(EXIT=124);live chat/analyze 90s 零字节 CI 会挂死;生产 AI 对话不可用 ① 加 --timeout/os._exit 收尾 ② 给 LLM 调用加显式超时与降级 P0 连续 2 轮 pytest 正常退出 + live 200 有 body
G-127-6 无 CI 后端全量 后端 2865 例只在本地人工跑 回归不可持续,红例长期沉淀 GitLab CI 增 blocking 全量 job(可离线缓存 m2) P1 CI 绿/红可查 + 阻断合并
G-127-7 覆盖率空白 后端无 JaCoCo;web 语句 10.09% 无法度量单测有效性 后端接 jacoco-maven-plugin,报告入库 P2 覆盖率报告产出并可复算
G-127-8 204 节点失联 4090 等端口全 000 浏览器任务无冗余节点 运维恢复并登记节点能力 P2 探活 200 + 实派 1 例绿

6. 域结论表

审查维度 负责专家 结论 关键证据
单元·组件级 苏雅 不通过(局部) 后端 33 红中 16 例装置型(Mockito 误用/夹具无值);web 覆盖率 10.09% 偏低
集成·接口级 柯砚 不通过(局部) integration.* 5 类中 4 类红(EnergySystem 6×500、GrowthRecord 3、GuideModule 1 截断、DimensionMap 3)
系统·验收级 白樾 有条件通过 浏览器 28/28;但无 UAT/BDD,验收仅靠 E2E 硬契约
测试保障级 闻朔 有条件通过 26 轮零漂移回归有效;冒烟面 = 28 例;探索性无 chartered 记录
性能·可靠性 骆骋 未实测(未授权) 压测需 execute 档授权;仅有 langgraph 90s 零字节的可靠性观察
安全 关屿 不通过(局部) 鉴权 4/4 401 达标;但 @GetMapping 8 处违 AGENTS.md、application.yml 明文凭据 B-31 未改造
兼容·体验 阮清 待核实 仅 Chromium;无多端矩阵、无 axe 无障碍扫描
流程·度量·代码 何序 不通过(局部) G9 口径三套并存(B-124);无 CI 全量(G11);测例台账 827 行但可执行锚点 9.9%

7. 五要素问题清单

#1【P1·装置】CfCommissionServiceSettleTest 8 例「Wanted but not invoked」

  • ① 问题描述:settle_* 8 例全部失败,报 cfBalanceService.earnByRule(...) / ppointConsumptionLogMapper.insert(...) 未被调用。
  • ② 测试 bug 点:cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java(settle_F03a发放_自动创建感恩记录、settle_两级销售奖_F03a按团队档位_F03b按自身档位、settle_同家庭引荐人跳过_顺延到下一级拿F03a、settle_商品订单实付与分润基数分离、settle_推荐人分润只走earnByRule_不再写旧分佣流水、settle_最多两级_第三级引荐人不发放、settle_档位比例超规则上限_按上限封顶、settle_落P点消费日志_基数与订单对应)。
  • ③ 最优修改方案:先补 settle 路径的前置守卫桩(订单状态、受益人解析、家庭关系),mock 返回真实形态对象;断言由精确 any() 改为 ArgumentCaptor 捕获后校验实付/基数/档位,避免「桩不匹配 → 提前 return → 断言不触发」。
  • ④ 修改目的:消除 8 例装置假红,恢复分佣链路的真实守护能力(CF 结算是资金链路)。
  • ⑤ 闭环:mvn -Dtest=CfCommissionServiceSettleTest test(注意 surefire 2.22.2 只认逗号分隔)复跑 12/12 绿。

#2【P1·装置】ArticleAutoTagServiceTest 4 例线程池调用次数断言

  • ①:3 例 Wanted 1 time 未发生、1 例 Never wanted here 反被调用。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java(auditArticle_…、publishByUser_…、toggleStatus_发布且标签为空_调度自动打标、toggleStatus_标签非空_不调度自动打标)。
  • ③:改用 verify(executor, timeout(1000)).execute(any()) 容忍异步提交;标签非空用例先显式 clearInvocations(executor) 再断言 never。
  • ④:区分「异步调度」与「同步执行」,避免把时序差异判成功能缺失。
  • ⑤:定向复跑 4/4 绿,且连续 2 轮稳定(防 flaky)。

#3【P1·装置】GrowthRecordSyncFlowTest 3 例(2 处 NPE + 1 处布尔断言)

  • ①:parentCreatesRecordWithOrder_Success:164、parentUploadsHealthReport_Success:204 抛 NullPointerException;parentCreatesRecordWithoutChild_Fails:130 期望 true 得 false。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java:130/164/204。
  • ③:164/204 补 mock 返回值(订单/报告对象在「孩子→家庭成员」重构后改走 getXxxByFamilyMember,桩仍是旧方法名);130 改为断言业务响应码/message,而非守卫层布尔。
  • ④:消除重构遗留的夹具滞后,恢复成长记录同步的回归保护。
  • ⑤:定向复跑 10/10 绿。

#4【P2·装置】TaskPlanServiceTest 1 例

  • ①:applyAndActivate_无active实例时新建并置active 期望 100 得 null(返回 id 为空)。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java。
  • ③:补 insert 回填主键的 mock(doAnswer 设置 id),或改用 ArgumentCaptor 校验保存对象。
  • ④:使激活路径可断言,避免「新建成功但 id 空」类缺陷逃逸。
  • ⑤:定向复跑 4/4 绿。

#5【P0·产品】EnergySystemFlowTest 6 例全 500(五维能量核心链路)

  • ①:parentGetsEnergyOverview / parentQueriesEnergyLogs / taskCompletionGrantsEnergy / childExchangesWishWithEnergy 均 expected 200 but was 500;childExchangesWithInsufficientEnergy_Fails 期望 true 得 false;userWithoutFamily_Fails 期望 500 得 5001。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java:116/150/182/212/246/282。
  • ③:先取 500 的 Caused by 最内层(历史同类多为空指针/字段缺失),对照 /api/energy/* 实现在「孩子→家庭成员」重构后的成员解析;5001 为自定义错误码,需与断言口径对齐(若 5001 为设计值,则改断言并写入契约)。
  • ④:五维能量是产品主线,6 例常红意味着能量查询/兑换可能对真实用户不可用。
  • ⑤:修复后定向复跑 7 例全绿 + 线上 /api/energy/overview 带 token 实返 200。

#6【P1·产品】Orchestration 2 例

  • ①:testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow 期望 "manual_fail" 得 null;testEvaluateFlow_AndNode_AllCompleted_Triggered 实际 "failed" 不在 [in_progress,pending]。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java:176、OrchestrationIntegrationTest.java:105。
  • ③:核对失败原因枚举落库时机(是否仅在事务提交后回写);若实现改为异步回写,则用例改为轮询等待终态。
  • ④:编排引擎的失败态判定直接影响任务流转与结算。
  • ⑤:定向复跑 2 类全绿,并补 1 例「失败→重试→终态」回归。

#7【P1·产品】UserServiceWechatLogin(Contract) 2 例 + MembershipPaySwitch 1 例 + PaymentServiceORD 1 例

  • ①:微信首次登录返回 null 而非 jwt-token-1;createOrderWithPayType_virtualEnabled_configMissing_returnsNull 返回了订单对象;ORD 未知前缀未路由到 handlePaymentCallback(得 FAIL)。
  • ②:service/UserServiceWechatLoginTest.java、UserServiceWechatLoginContractTest.java:110、MembershipPaySwitchTest.java:209、PaymentServiceORDRoutingTest.java:83。
  • ③:微信登录按「新 openid 建档 + 家庭创建」契约核对返回体;虚拟支付在配置缺失时应短路返回 null(当前未短路);ORD 路由补前缀白名单。
  • ④:登录与支付是营收入口,任何静默降级都是资金/账号风险。
  • ⑤:3 类定向复跑全绿 + 线上登录取 token 冒烟 1 次。

#8【P1·产品】TeamProfitCronContractTest 冷静期退款未全撤销

  • ①:refundWithinCooling_cancelAllRecordsFundsNotPaid 断言 cancelled=0 应为 true。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java(§8.2 契约)。
  • ③:退款回调需将 team_share_record/team_award_record 置 cancelled 且不发放;核对定时任务与退款回调的竞态(谁先谁后)。
  • ④:冷静期退款错发是资金损失。
  • ⑤:定向复跑 22 例全绿 + 1 例竞态顺序用例。

#9【P0·契约待裁决】DimensionRegistryMapContractTest 3 例(P-9,第 9 轮)

  • ①:map_unknownLegacy_returnsNullData 期望 data=null 实得 "unknown_legacy_xyz";map_missingLegacy_returnsBadRequest 期望 400 得 200;map_emptyLegacy 期望 null 得 ""。
  • ②:cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionRegistryMapContractTest.java:76/85/92。
  • ③:需主理人裁决「未知 legacyCode 的语义」——透传 or 归 null;裁决后单向修改(改实现或改用例),不得两边各改一半。
  • ④:同一契约连续 9 轮红,已成为 G2 的固定分母,且掩盖真实回归。
  • ⑤:裁决落地后定向复跑 7/7 绿,并在 P-9 台账销号。

#10【P1·安全和流程】@GetMapping 8 处仍违 AGENTS.md + 明文凭据未改造

  • ①:cfc-backend/src/main/java 仍有 8 处 @GetMapping(规范要求统一 @PostMapping);application.yml 7 处明文凭据(B-31)未按 O-10 改造。
  • ②:grep -rn "@GetMapping" cfc-backend/src/main/java(8 命中);cfc-backend/src/main/resources/application.yml。
  • ③:8 处改为 @PostMapping(同步前端调用);凭据改 ${ENV_VAR} 占位 + 部署注入 + gitleaks 预检。
  • ④:GET 暴露参数于 URL/日志;明文凭据可被仓库读权限者直取。
  • ⑤:grep -c @GetMapping = 0;gitleaks 扫描 0 命中。

8. 度量快照

指标 数值 环比
测试类(后端) 339 与 R123 一致
后端用例 2865 一致
用例台账 TC 行 / 唯一编号 827 / 284 一致(SRS 零变更)
可执行锚点 82(9.9%)/ 末列非空 234(28.3%) 口径见 B-124
用户场景 SC 244,TC 引用 146(59.8%) 一致
Controller 364 —
@GetMapping 违规 8 一致(未整改)
测试文件 / testCompile 345 源,0 错 —

9. 门禁结论

门禁 判据 实测 结论
G1 全量通过率 ≥95% 98.40%(3445/3501) ✅
G2 红例数 ≤10 49(后端 33 + 根级 16) ❌
G3 前端 Jest 0 红 423 过 / 0 红 / 3 skip ✅
G4 管理端 Jest 0 红 116/116 ✅
G5 编译与完整性 testCompile 0 错 + XML 无沉默 345 源 0 错;339/339 XML ✅
G6 浏览器 28/28 28/28(4 套件) ✅
G7 langgraph 0 红 0 红(43/43,B-74 观察第 1 轮) ✅
G8 鉴权契约 全 401 线上 4/4 + 契约 13/13(含 /api/mind/**) ✅
G9 SRS 锚点 ≥80% 9.9%(严格)/ 28.3%(宽松) ❌
G10 双节点派发 251 + 189 均实派 251 ✅(43 例)/ 189 ✅(5/5) ✅
G11 CI 含后端全量 存在 blocking 全量 无 ❌
G12 用例入库 本轮有新增/更新 SRS 窗口零变更 → 不新增(合规) ✅

总裁决:不通过(有条件)

  • 阻塞放行三项:G2 49 红、G9 可执行锚点 9.9%、G11 无 CI 全量。
  • 环比改善:G7 由 39/43 回到 43/43;G10 双节点连续 2 轮通过(189 admin 5/5 第 2 轮,B-122 销号成立);B-69 连续 2 轮闭环。
  • 环比持平:后端 2865/2828/98.71% 与 R123 逐字段一致(零漂移);49 红构成不变。
  • 新增/延续风险:B-90 langgraph live chat/analyze 90s 零字节(生产 AI 对话不可用),与「测试 43/43 全绿」并存 → 说明单测覆盖不到 LLM 真实链路,需补 live 契约。
  • 放行建议:内网灰度可放(核心浏览/登录/商城/健康鉴权均绿);不支撑对外正式发布,除非 §7 #5/#7/#8 的产品红有结论或已修复。

10. 本轮执行合规声明

  • 未联网安装依赖、未启停线上服务、未修改生产源码;仅新增测试侧脚本与本报告/台账。
  • 未触碰他人 WIP(跑前跑后 git status --porcelain 已跟踪改动 0)。
  • 浏览器任务严格「每节点单任务」:189 跑 admin,本机串行跑 frontend→shop→health(workers:1)。
  • 8 类套件全部实跑,无引用历史数字。

附录 A · 本轮命令(可复现)

# 后端
cd cfc-backend && JAVA_HOME=D:/jdk1.8.0_25 mvn -o -B clean test     # 42m36s
# Jest
cd cfc-web   && CI=true npx jest --ci --runInBand --coverage         # 116
cd cfc-frontend && CI=true npx jest --ci --runInBand                 # 423+3skip
cd tests && npx jest -c jest.config.js --ci                          # 7/16
# 浏览器(本机串行,workers:1)
cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile
cd tests && npx playwright test -c playwright.config.live.js --project=shop-api
cd tests && npx playwright test -c playwright.config.health.js
# 189(PowerShell 节点,cmd /c 分离进程)
node _r127_189_admin.cjs kick / read
# 251(同 shell 轮询 + tee 落盘)
MSYS_NO_PATHCONV=1 PYTEST_TIMEOUT=1650 node _r127_251_v3.cjs