执行档: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 全量
| 轮次 | 时间 | 后端全量 | 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 |
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)。| # | 测试类型 | 状态 | 证据 |
|---|---|---|---|
| 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),未跑全量静态审查 |
| # | 维度 | 命令/方式 | 节点 | 结果 |
|---|---|---|---|---|
| 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)
| 缺口 | 现状 | 风险 | 建议测试设计 | 优先级 | 闭环方式 |
|---|---|---|---|---|---|
| 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 例绿 |
| 审查维度 | 负责专家 | 结论 | 关键证据 |
|---|---|---|---|
| 单元·组件级 | 苏雅 | 不通过(局部) | 后端 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% |
settle_* 8 例全部失败,报 cfBalanceService.earnByRule(...) / ppointConsumptionLogMapper.insert(...) 未被调用。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点消费日志_基数与订单对应)。any() 改为 ArgumentCaptor 捕获后校验实付/基数/档位,避免「桩不匹配 → 提前 return → 断言不触发」。mvn -Dtest=CfCommissionServiceSettleTest test(注意 surefire 2.22.2 只认逗号分隔)复跑 12/12 绿。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。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。getXxxByFamilyMember,桩仍是旧方法名);130 改为断言业务响应码/message,而非守卫层布尔。applyAndActivate_无active实例时新建并置active 期望 100 得 null(返回 id 为空)。cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java。insert 回填主键的 mock(doAnswer 设置 id),或改用 ArgumentCaptor 校验保存对象。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。Caused by 最内层(历史同类多为空指针/字段缺失),对照 /api/energy/* 实现在「孩子→家庭成员」重构后的成员解析;5001 为自定义错误码,需与断言口径对齐(若 5001 为设计值,则改断言并写入契约)。/api/energy/overview 带 token 实返 200。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。null 而非 jwt-token-1;createOrderWithPayType_virtualEnabled_configMissing_returnsNull 返回了订单对象;ORD 未知前缀未路由到 handlePaymentCallback(得 FAIL)。service/UserServiceWechatLoginTest.java、UserServiceWechatLoginContractTest.java:110、MembershipPaySwitchTest.java:209、PaymentServiceORDRoutingTest.java:83。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 且不发放;核对定时任务与退款回调的竞态(谁先谁后)。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。@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。@PostMapping(同步前端调用);凭据改 ${ENV_VAR} 占位 + 部署注入 + gitleaks 预检。grep -c @GetMapping = 0;gitleaks 扫描 0 命中。| 指标 | 数值 | 环比 |
|---|---|---|
| 测试类(后端) | 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 错 | — |
| 门禁 | 判据 | 实测 | 结论 |
|---|---|---|---|
| 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 窗口零变更 → 不新增(合规) | ✅ |
总裁决:不通过(有条件)
chat/analyze 90s 零字节(生产 AI 对话不可用),与「测试 43/43 全绿」并存 → 说明单测覆盖不到 LLM 真实链路,需补 live 契约。git status --porcelain 已跟踪改动 0)。workers:1)。# 后端
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