执行档:review(离线) — 白名单内离线套件 + 已授权内网只读 E2E(
cfc.iwintrue.com的/admin+/frontend)+ 节点派发(251 跑 langgraph / 189 跑浏览器 admin) 仓库:D:/cfc;分支cfclub;测试基线 HEAD8f5585198(R118 提交;git fetch后与 origin/cfclub 零差异,零生产源码 / 零 SRS / 零用例变更) 执行窗口:08:32 → 09:47(后端 73 min 串行占主窗,其余套件错峰并行) 拓扑(用户本轮指令):浏览器自动化 →cfc.iwintrue.com/admin、/frontend,192.168.16.189与本机各一节点(每节点单任务);langgraph 部署192.168.16.251,测试分派该节点 团队:自动化闭环轮,八域结论由测试负责人依据本轮实测证据汇总(未启用分布式成员会签),不代写任何成员未产出之结论
| 项 | 内容 |
|---|---|
| 上次审查 | 第 118 轮(2026-11-10 08:26,已提交 8f5585198);本轮为直接接续轮 |
| 历史遗留缺口 | B-69(/api/mind/** 鉴权,第 18 轮)、B-65/B-74/B-82(langgraph LLM 凭据/checkpointer)、B-36(根级黑盒 16 红,第 21 轮)、B-90(chat 挂起观察)、B-15(tests/qna 收集期错误)、B-118(env 能力探针)、B-119(langgraph 口径)、G-11(已闭环待销号) |
| 本次是否改善 | 测试通过/失败计数与 R118 严格零漂移(后端 34 红 15 类差集空、前端/管理端/根级/langgraph 逐项一致);新增 B-120-New 观察(189 首轮 U05 登录偶发,复验 5/5 全绿);B-69 第 19 轮复证未修;G-11 已闭环第 2 轮稳定(等待销号) |
| 本次新发现 | B-120-New(P2 观察):189 首轮 TC-A-U05 前置登录失败(停在 /admin/login)→ 复验轮 5/5 全绿、本机同批 U05 绿 → 判定滑块登录偶发,非产品回归,观察 2 轮后再定性 |
| 声明 | 历史结论仅作对照;本轮所有数字均为重新取证(后端全量 clean test、四个前端套件、双节点派发、线上匿名鉴权探针) |
| 模块 | 技术栈 | 端口 | 本轮可测范围与关键路径 |
|---|---|---|---|
| cfc-backend | Spring Boot 2.7.18 + MyBatis-Plus(JDK8) | 9082(本机 DOWN) | 339 测试类 / 2854 @Test;DatabaseInitializer 迁移入口;JwtInterceptor 8 公开路径白名单 + LOGIN_REQUIRED_PATHS;AI 走 AiGateway |
| cfc-frontend | uni-app 小程序 (Vue2) | — | 26 套 Jest(utils/store/components/pages/specs) |
| cfc-web | Vue2 + Element UI 管理端 | 8082 | 17 套 Jest / 116 例;语句覆盖 9.98% |
| cfc-langgraph | Python FastAPI + LangGraph + ChromaDB | 9000(@251,/health → 200) |
44 例 pytest 于 251 实派执行(.venv py3.11,72.4s) |
环境能力实测
| 能力 | 实测 | 结论 |
|---|---|---|
D:\maven\apache-maven-3.6.1\bin\mvn |
3.6.1 / Java 1.8.0_25 可执行 | 可用 |
D:\jdk1.8.0_25 |
存在,Maven 默认运行时指向它 | 可用 |
192.168.16.251:9000 |
200 /health |
langgraph 服务在线 |
192.168.16.251:4096 |
200(Basic 鉴权通过) | shell 直连派发可用 |
192.168.16.189:4090 |
200(Basic 鉴权通过) | 浏览器节点可派发 |
http cfc.iwintrue.com |
HTTP 302→200 | 可用(G-11 闭环后稳定) |
127.0.0.1:9082 |
000 | 本机后端未起(按规则不擅自启停) |
| # | 类型 | 状态 | 证据(本轮实测 / 基线引用) |
|---|---|---|---|
| 1 | 单元测试(cfc-web) | 已发现 | 本轮回跑 17 套 / 116 例全绿(214.9s) |
| 2 | 单元测试(cfc-frontend) | 已发现 | 本轮回跑 26 套 / 426(423 过 / 3 跳,105.5s) |
| 3 | 组件测试 | 已发现 | Families.* / ProductPicker / signature.canvas2d / recommendation.* spec |
| 4 | 测试覆盖率 | 已发现 | cfc-web 语句 9.98% / 分支 6.12% / 函数 7.51% / 行 9.98%;后端无 jacoco |
| 5 | 变异测试 | 未发现 | 无 pitest / mutation 配置 |
| 6 | 集成测试 | 已发现 | com.etotem.cfc.integration.** 本轮全量执行(含 15 红类中的 5 类) |
| 7 | 契约测试 | 已发现 | DimensionRegistryMapContractTest 3 红 / UserServiceWechatLoginContractTest 1 红 / TeamProfitCronContractTest 1 红 等(与 R118 逐例一致) |
| 8 | 接口 API 测试(活服务器) | 已发现 | health-contract 13/13 本轮实跑;匿名鉴权探针 2 端点 |
| 9 | 系统/端到端 E2E | 已发现 | 本机 live 15/15 + health 13/13 + 189 复验 5/5 |
| 10 | 验收 UAT / BDD | 未发现 | 无 UAT 记录、无 .feature |
| 11 | 冒烟测试 | 已发现 | ci-smoke.spec.js + _automation_reachability.cjs |
| 12 | 回归测试 | 已发现 | 全量 3500 例可复现,与 R118 严格零漂移 |
| 13 | 探索性测试 | 未发现 | 无 charter / 会话记录 |
| 14 | 性能测试 | 未授权未执行 | 需联网压测(execute 档);后端 73 min 仅作时延观察 |
| 15 | 可靠性测试 | 待核实 | 无故障注入;B-90 chat 未复证(本轮未打 chat) |
| 16 | 安全测试(SAST/DAST/SCA) | 未发现 | 仅鉴权契约 + 匿名探针;无 SAST/DAST/依赖扫描工具 |
| 17 | 兼容性测试 | 未发现 | 仅 chromium |
| 18 | 可用性测试 | 未发现 | 无可用性任务/量表 |
| 19 | 无障碍测试 | 未发现 | 无 axe 扫描 |
| 20 | QA 流程 / 度量 / 代码审查 | 部分已发现 | 全量 98.06%;CI 仅 test-compile + 前端 jest |
「未发现」为扫描未命中,不等于项目没做;扫描截断/环境缺失一律标「待核实」。
| 项 | 内容 |
|---|---|
| 目标 | ① 全部用例通过 ② SRS/场景覆盖可量化 ③ 变更即更新用例 |
| 范围(本轮实跑) | 后端全量 mvn -o -B clean test(339 类 / 2864 例)、cfc-web Jest+覆盖率、cfc-frontend Jest、根级 tests/jest.config.js 黑盒、langgraph pytest@251 实派、浏览器 E2E 本机 live+health、浏览器 E2E@189 派发+复验 |
| 排除项 | dan/danshop(独立商城);tests/qna(收集期错误,B-15);需联网命令(依赖漏洞/压测/DAST);本机 9082 未起 |
| 执行档 | review:不联网装依赖、不启停服务、不改生产代码 |
| 授权 | 内网 E2E(/admin+/frontend)、双节点派发、按 SRS 变更写用例已授权;execute 档(压测/DAST)未申请,未执行 |
| 后端命令 | JAVA_HOME=/d/jdk1.8.0_25 + /d/maven/apache-maven-3.6.1/bin/mvn -o -B -f cfc-backend/pom.xml clean test(73 min,BUILD FAILURE 仅由测试红导致) |
| 套件 | 用例 | 通过 | 红 | Skip | 通过率 | 耗时 |
|---|---|---|---|---|---|---|
| 后端 JUnit(339 类) | 2864 | 2826 | 34(31F+3E) | 4 | 98.67% | 73 min |
| 前端 Jest(26 套) | 426 | 423 | 0 | 3 | 100%(剔 skip) | 105.5s |
| 管理端 Jest(17 套) | 116 | 116 | 0 | 0 | 100% | 214.9s |
| 根级黑盒 Jest(3 套) | 23 | 7 | 16 | 0 | 30.43% | 14.3s |
| langgraph pytest@251 | 43(本口径)/ 44(含 test_chat) |
32 | 11 / 12 | 0 | 74.42% | 72.4s |
| 浏览器 E2E 本机(live 15 + health 13) | 28 | 28 | 0 | 0 | 100% | 3.1m + 8.4s |
| 浏览器 E2E@189(admin-desktop,复验) | 5 | 5 | 0 | 0 | 100% | 1.4m |
| 全量(主口径,去 189 重复) | 3500 | 3432 | 61 | 7 | 98.06% | — |
恒等式核验:
@Test 2854 − 类级 @Disabled 4 + 参数化/早退净增 14 = 2864,误差 0;测试源类 339 = surefire XML 339 → 沉默 0、完整性 339/339。 langgraph 口径(B-119 固化):全量收集 44 例(含test_chat)+1 红;同口径(剔test_chat)为 43/32/11,与 R118 严格一致。 189 说明:首轮 4/5(U05 登录偶发)→ 复验轮 5/5 全绿,本机同批亦全绿 → 本轮按全绿记,单列观察项 B-120。
| 指标 | R118(08:26) | 本轮 R119 | Δ |
|---|---|---|---|
| 后端 类/例/通过 | 339 / 2864 / 2826 | 339 / 2864 / 2826 | 0 / 0 / 0 |
| 后端红例(31F+3E) | 34(15 类) | 34(15 类) | 0 |
| 红类差集 | — | 空(15 类逐一相同) | 0 |
| 前端 Jest | 423/426(3 跳) | 423/426(3 跳) | 0 |
| 管理端 Jest | 116/116 | 116/116 | 0 |
| 根级黑盒 | 7/23(16 红) | 7/23(16 红) | 0 |
| langgraph(同口径) | 32/43(11 红) | 32/43(11 红) | 0 |
| 浏览器 E2E | 28/28 + 189 5/5 | 28/28 + 189 复验 5/5 | 0 |
| 全量(主口径) | 3500/3432(98.06%) | 3500/3432(98.06%) | 0 |
Δ 归因:源码/SRS/用例零变更 + 全部套件本轮重跑 → 逐项零漂移,红例集合差集为空。
| 层 | 类数 | 例数 | 明细 |
|---|---|---|---|
| A 测试装置 | 4 | 16 | CfCommissionServiceSettleTest 8(Mockito WantedButNotInvoked)、ArticleAutoTagServiceTest 4(verify 次数)、GrowthRecordSyncFlowTest 3(2 NPE 测试帧 + 1 assert)、TaskPlanServiceTest 1 |
| B 产品缺陷 | 6 | 14 | EnergySystemFlowTest 6、OrchestrationEngineTest 1、OrchestrationIntegrationTest 1、MembershipPaySwitchTest 1、PaymentServiceORDRoutingTest 1、UserServiceWechatLogin* 2、TeamProfitCronContractTest 1、MindFortuneControllerTest 1(B-69 同源) |
| C 数据/环境 | 1 | 1 | GuideModuleIntegrationTest → DataIntegrityViolation(platform_fee 列截断) |
| 契约待裁决 | 1 | 3 | DimensionRegistryMapContractTest(未知/空码映射 + 缺码 400 期望) |
反证:环境红 0,历史 B-13 类(
AdminFamilyOverviewControllerTest)保持 3/3 绿,维持「潜在风险未复现」观察。
| 节点 | 任务 | 结果 |
|---|---|---|
| 192.168.16.251 | langgraph pytest(shell 直连) | ✅ 实派取回:44 例 / 32 过 / 12 红,72.4s;基线 8f5585198 |
| 192.168.16.189 | admin-desktop E2E | ⚠️ 首轮 4/5(U05 登录偶发)→ ✅ 复验 5/5 passed,1.4m |
| 本机 | live + health | ✅ 15/15 + 13/13,单节点串行 |
| 端点 | HTTP | body | 判定 |
|---|---|---|---|
/api/mind/fortune |
200 | {"code":400,"message":"用户不存在","data":null} |
❌ 未拦截,应为 401 |
/api/energy/overview(对照) |
401 | — | ✅ 拦截正确 |
结论:JwtInterceptor.LOGIN_REQUIRED_PATHS 当前不含 /api/mind/(O-21 裁决尚未落码),B-69 连续第 19 轮未修。
8f5585198 → 本轮 git fetch 后与 origin/cfclub 零差异;--changes --days 3:需求侧 / 测试用例 / 契约设计 均无新增能力键(0 → 0);tests/test-cases 14 份、tests/user-scenarios 11 份,零变更。结论:本次无 SRS/场景/接口变更 → 按规则跳过用例编写。 度量:场景 215、TC 映射 155(72.1%)、spec 字面引用 32(14.9%);TC 812、异常流 483(59.5%)、锚点 86(10.6%)——与 R118 逐位一致。
| 缺口 | 类型 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|---|---|---|---|---|---|---|
| G-1 | 覆盖缺口 | TC 锚点 10.6%(86/812) | 「场景→用例→资产」不可追 | 资产首行加 TC-xxx 锚点 |
P1 | 锚点率 ≥40% 纳门禁 |
| G-2 | 覆盖缺口 | HL-05 仍无契约/E2E 用例 | 新特性零回归网 | 补 ProductSelectionFlow 契约 + Playwright |
P1 | 定向套件全绿入台账 |
| G-3 | 测试装置 | A 类 16 例 | 噪音掩盖真实回归 | 见 P-1 | P1 | 定向复跑 0 红 → 红例 34→18 |
| G-4 | 黑盒失效 | 根级 16 红(B-36 第 22 轮) | 接口层无有效黑盒网 | 注入 CFC_API_TOKEN + seed 账号 |
P1 | 0 红或显式 skip |
| G-5 | 工具缺口 | 无覆盖率(java)/变异/压测/SAST/SCA | 内部质量不可量化 | jacoco+pitest;k6/zap 需授权 | P2 | 产物入库纳门禁 |
| G-6 | 流程缺口 | CI 仅 test-compile + 前端 jest | 2864 例不在门禁内 | CI 增 mvn test -DskipTests=false |
P1 | pipeline 出现 Tests run |
| G-7 | 节点偶发 | 189 TC-A-U05 首轮偶发(复验绿) |
不稳定假红 | 登录前置加重试 | P2 | 连续 2 轮 0 偶发销号(B-120) |
| G-8 | 资产缺口 | @Disabled 4 例 + tests/qna 错误 |
静默失效 | 修或删 | P2 | 收集期 0 error |
| G-9 | 离线约束 | api.test.js 对公网真实 POST |
违离线约束 | 改 axios-mock-adapter | P2 | 零外联且仍绿 |
| G-10 | 派发缺口 | 189 / 251 实派取回 | — | — | ✅ | shell 直连 v2 固化 |
| 审查维度 | 负责专家 | 结论 | 关键证据 |
|---|---|---|---|
| 单元·组件级(后端 339 类) | 苏雅 | 不通过(有条件) | 2864 例 98.67%,34 红(A16/B14/C1/契约3),零漂移 |
| 单元·组件级(前端 / 管理端) | 苏雅 | 通过 | 426(0 红 / 3 跳)、116/116 |
| 集成·接口级 | 柯砚 | 不通过 | 集成包 5 红类;契约 3 例口径未决;EnergySystemFlowTest 5×500 |
| 系统·E2E | 白樾 | 通过 | 本机 28/28 + 189 复验 5/5;UAT/BDD 未实测 |
| 测试保障级 | 闻朔 | 通过(部分) | 冒烟/回归可复现;探索性无;根级 16 红 |
| 性能·可靠性 | 骆骋 | 未实测 | 无压测工具/未授权联网 |
| 安全 | 关屿 | 不通过 | B-69 第 19 轮复证:匿名 fortune → 200;O-21 未落码 |
| 兼容·体验·无障碍 | 阮清 | 未实测 | 仅 chromium;无 axe |
| 流程·度量·代码审查 | 何序 | 不通过 | CI 无后端全量;锚点 10.6%;B-120 节点偶发需观察 |
① 问题描述:CfCommissionServiceSettleTest 8 例、ArticleAutoTagServiceTest 4 例、GrowthRecordSyncFlowTest 3 例、TaskPlanServiceTest 1 例,断言/桩口径与生产不一致,非生产缺陷。本轮与 R118 逐例一致。
② 测试 bug 点:CfCommissionServiceSettleTest#settle_F03a发放_自动创建感恩记录 等 8 例;ArticleAutoTagServiceTest#toggleStatus_发布且标签为空_调度自动打标 等 4 例;GrowthRecordSyncFlowTest#parentUploadsHealthReport_Success:204、#parentCreatesRecordWithOrder_Success:164、#parentCreatesRecordWithoutChild_Fails:130;TaskPlanServiceTest 1 例。
③ 最优修改方案:CfCommission 8 例补档位查询桩;ArticleAutoTag 改 verify(executor, times(n));GrowthRecordSync 在 @BeforeEach 补齐 mock;TaskPlan 对齐返回值口径。
④ 修改目的:让红例直接反映产品/契约缺陷,恢复信号价值。
⑤ 能否闭环:可。定向复跑 4 类 0 红 → 全量红例 34→≤18。
① 问题描述:EnergySystemFlowTest 6 例(5×500 + 1 码值)、编排 2 例、会员支付 1、支付路由 1、微信登录 2(token null)、分佣冷却 1、MindFortune 1(B-69 同源)。
② 测试 bug 点:EnergySystemFlowTest#parentQueriesEnergyLogs_Success:246 等 6 例;OrchestrationEngineTest:176、OrchestrationIntegrationTest:105;MembershipPaySwitchTest:209;PaymentServiceORDRoutingTest:83;UserServiceWechatLoginContractTest:110、UserServiceWechatLoginTest;TeamProfitCronContractTest#refundWithinCooling_cancelAllRecordsFundsNotPaid。
③ 最优修改方案:EnergySystem 取 500 堆栈最内层;Orchestration 对齐 task.status 写入;MembershipPay 修 configMissing→null;PaymentORD 补未知前缀路由;WechatLogin 核 token 签发;TeamProfitCron 补冷却期退款取消。
④ 修改目的:消除五维能量/编排/支付/登录/分佣主链路真实缺陷。
⑤ 能否闭环:可,需研发逐类复现;判据:定向复跑 0 红 + 全量红例下降。
DimensionRegistryMap 契约口径未决(第 9 轮挂账)① 问题描述:map_unknownLegacy_returnsNullData:76、map_emptyLegacy_returnsNullData:85 期望 data=null 实返原值;map_missingLegacy_returnsBadRequest:92 期望 400 实返 200。
② 测试 bug 点:DimensionRegistryMapContractTest 上述 3 例。
③ 最优修改方案:主理人裁定「未知码/空码映射 null、缺码 400」并同步改契约或实现。
④ 修改目的:终止测试与实现的长期契约分歧。
⑤ 能否闭环:可。裁定落码后 3 例转绿。
/api/mind/** 鉴权缺口① 问题描述:线上匿名 POST /api/mind/fortune → HTTP 200 + {"code":400,"message":"用户不存在"};对照 /api/energy/overview → 401,证明机制可用、清单缺项。
② 测试 bug 点:MindFortuneControllerTest#testGetTodayFortuneWithoutAuth(期望 401 实得 400)。
③ 最优修改方案:按 O-21 裁决,将 /api/mind/ 等 4 条白名单移入 JwtInterceptor.LOGIN_REQUIRED_PATHS(JwtInterceptor.java:88-130 当前无 /api/mind/),并去掉 MemorySaver。
④ 修改目的:关闭匿名可达的用户私有数据面。
⑤ 能否闭环:可。判据:匿名探针全 401 + MindFortuneControllerTest 转绿 + JwtInterceptorLoginRequiredPathTest 全绿。
TC-A-U05 登录前置偶发① 问题描述:189 首轮 5 例中 TC-A-U05 前置登录停在 /admin/login;复验轮 5/5 全绿、本机同批 U05 亦绿 → 判定节点偶发(滑块时序/风控),非产品回归。
② 测试 bug 点:tests/e2e-live/admin-live.spec.js:184 TC-A-U05(B-59 后前置失败为硬断言,不再吞为 skip,故偶发显式暴露)。
③ 最优修改方案:登录步骤加重试(滑块失败回退重跑 1 次再断言,2 次仍失败才判红)。
④ 修改目的:消除滑块偶发假红,保持前置失败硬断言不退化回 skip。
⑤ 能否闭环:可。判据:连续 2 轮 189 首轮 0 偶发 → 销号 B-120。
① 问题描述:251 实派 44 例中 12 红:test_analyze 2 例、test_chat 1 例、test_auto_tag 5 例(LLM 401)、test_intent 4 例(静默降级 chat)。与 R118 逐例一致。
② 测试 bug 点:tests/test_analyze.py::test_analyze_endpoint、::test_analyze_missing_report;tests/test_chat.py::test_chat_endpoint;tests/test_auto_tag.py 5 例;tests/test_intent.py::test_classify_analysis|recommend|mind|health。
③ 最优修改方案:注入有效 LLM_API_KEY(或全 mock);analyze 补 thread_id/checkpointer;intent_classifier 401 时应抛错。
④ 修改目的:让 251 测试产出有效信号而非稳定噪声。
⑤ 能否闭环:可。判据:251 实派 44 例 0 红(或全 mock 后 0 红)。
| 门禁 | 阈值 | 本轮实测 | 判定 |
|---|---|---|---|
| G1 全量通过率 | ≥98% | 98.06%(后端 98.67%) | ✅ |
| G2 红例数 | 0 | 61(后端 34 + 根级 16 + langgraph 11) | ❌ |
| G3 前端 jest | 全绿 | 423/426(3 skip,0 红) | ✅ |
| G4 管理端 jest | 全绿 | 116/116 | ✅ |
| G5 后端编译完整性 | 0 错、无沉默 | 编译 0 错;339/339 XML、沉默 0;恒等式误差 0 | ✅ |
| G6 浏览器 E2E | 全绿 | 28/28 + 189 复验 5/5 | ✅ |
| G7 langgraph | 0 红 | 32/43(11 红) | ❌ |
| G8 鉴权契约 | 全绿 | health 13/13 + /api/mind 1 红 + 线上匿名 200 |
❌ |
| G9 SRS 锚点 | ≥40% | 10.6%(86/812) | ❌ |
| G10 节点派发 | 双节点可派 | 251 ✅ / 189 ✅(复验 5/5) | ✅ |
| G11 CI 接入 | 含后端全量 | 仅 test-compile + 前端 jest | ❌ |
| G12 测试资产入库 | 变更已入库 | 报告/台账/阻塞更新入库 | ✅ |
| 文件 | 内容 |
|---|---|
docs/tdd/orchestration/report-test-2026-11-10-R119.md |
本报告 |
docs/tdd/test/automation-run-2026-11-10-R119.md |
执行台账(命令/耗时/原始数字) |
docs/tdd/test/blockers.md |
追加 B-120-New(189 偶发观察),更新 B-69(第 19 轮)/B-36(第 22 轮)/B-13(观察) |
docs/tdd/研发交接通知-2026-11-10-第119轮.md |
研发交接通知(P-4 / P-2 / P-6 优先) |