触发:定时自动化「作为测试负责人执行自动化测试闭环(全部用例通过 + 覆盖 SRS/场景 + 浏览器走 cfc.iwintrue.com + langgraph 派 251)」。 执行档:
review(离线)——不联网装依赖、不启停服务、不改生产代码;仅改测试侧装置文件(有据可查,见 §6)。 基线:cfclub@49d7bccac(=origin/cfclub,跑前跑后一致,窗口内零提交)。 工作区:已跟踪文件 0 修改(git status --porcelain | grep -v '^??'= 0)→ 后端在本工作区直接跑全量,无需隔离树。 原始日志:_r88_backend.log(后端全量)·_r88_lg.log/_r88_lg2.log(langgraph 修前/修后)·_r88_targeted2.log(定向复跑)·_r88_agg.json(聚合)
| 套件 | 命令 | 结果 | 通过率 | 退出码 |
|---|---|---|---|---|
| cfc-backend(全量单元+集成) | mvn -o -B test(JDK1.8.0_25 + Maven 3.9.9) |
311 类 / 2628 例 / 40F / 34E / 4S → 2550 过 | 97.03% | 1(有红) |
| cfc-frontend(Jest) | node node_modules/jest/bin/jest.js --ci |
21 suites · 354 passed / 1 skipped / 355 | 99.72% | 0 |
| cfc-web(Jest) | 同上 | 12 suites · 90 passed / 90 | 100% | 0 |
| cfc-langgraph(pytest,本机 venv py3.12) | .venv/Scripts/python.exe -m pytest tests/ --ignore=tests/qna |
44 collected · 32 passed / 12 failed | 72.73% | 1 |
| admin-desktop(E2E 真浏览器) | npx playwright test -c playwright.config.live.js --project=admin-desktop |
5 passed(TC-A-U01~U05) | 100% | 0 |
| frontend-mobile(E2E 真浏览器) | ... --project=frontend-mobile |
6 passed(TC-F-U01~U06) | 100% | 0 |
| shop-api(E2E 契约) | ... --project=shop-api |
4 passed(TC-S-U01~U04) | 100% | 0 |
| health-contract(E2E 契约) | npx playwright test -c playwright.config.health.js |
13 passed(TC-H-U01~U10 + TC-HP-U01~U03) | 100% | 0 |
合计 3145 例 / 3054 过 = 97.11%(剔除 5 skip 后 97.26%);红例 86(后端 74 + langgraph 12)。
| 指标 | 值 | 说明 |
|---|---|---|
| 测试类 / 用例 | 311 / 2628 | surefire XML 实测,含参数化展开 |
| 失败 / 错误 / 跳过 | 40 / 34 / 4 | @Disabled 4 例 |
| 红类 / 红例 | 27 / 74 | 逐类见 §3 |
| 完整性 | 311/311 XML | 无静默丢失、无 0 字节 XML、.dump 0 |
| testCompile | 317 源 / 0 错 | 含本轮测试侧修订后重编 |
| 恒等式 | @Test 2618 + 参数化展开 26 − @Disabled 4 − 早退截断 12 = 2628(误差 0) |
早退截断 12 未逐类取证,标注为「待核实」 |
| Maven 总时长 | 46:18 | XML 耗时总和 2361.2s |
| 慢类 Top3 | GuideRolePermissionTest 274.3s / ArticleControllerTest 244.7s / ActivityControllerTest 241.5s | B-60(单类超 120s)仍成立 |
| 项 | R77 基线(采信值) | 本轮 R88 实测 | Δ |
|---|---|---|---|
| 后端用例 | 2398 | 2628 | +230 |
| 后端通过率 | 95.07% | 97.03% | +1.96pp |
| 后端红例 | 115 | 74 | −41 |
| 后端红类 | 35 | 27 | −8 |
| 浏览器 E2E | 25/25 | 28/28 | +3(health 13 全绿) |
| 契约鉴权(B-61) | 3 红(P0 连续 8 轮) | 13/13 绿 | 闭环 |
说明:R78~R87 一直未跑后端全量(多轮以「指令排除编译」采信 R77 数字),本轮首次实测到研发侧修复后的真实基线。方向:红例 115→74 主要由研发修复(Article/Auth/GuideOrder/GuideTeam 等历史红类已转绿)+ 测试侧装置跟进。
| 目标 | 结果 | 说明 |
|---|---|---|
| cfc.iwintrue.com:443 | OPEN | /admin 302 → 登录页;/frontend H5 正常 |
| 192.168.16.189:4090 | OPEN(HTTP 200,opencode Web UI) | 浏览器节点可用;本机与 189 每节点单任务约束下,本轮全部浏览器任务在本机串行执行(workers:1),未并发 |
| 192.168.16.189:22 | CLOSED(Connection refused) | 无 SSH 通道 |
| 192.168.16.251:9000 / :8000 | CLOSED | langgraph 服务未监听 → 无法按指令派发 251,降级本机 venv 直跑(标注未实测项) |
| 192.168.16.251:22 | OPEN 但 publickey,password 均被拒 |
无可用凭据,不可远程执行 |
| 192.168.16.251:8080 | Gogs Git 服务(非 langgraph) | 不可用于 langgraph 派发 |
分派结论:langgraph 派 251 未达成(B-55 延续第 N 轮);浏览器任务按「每节点单任务」在本机单节点串行完成 4 个套件,未触发并发。
| 异常类型 | 例数 |
|---|---|
| AssertionFailedError | 24 |
| NullPointerException | 16 |
IllegalStateException(均 Failed to load ApplicationContext) |
8 |
| WantedButNotInvoked(Mockito verify) | 8 |
| AssertionError | 5 |
NoSuchElementException(No value present) |
4 |
| InvalidUseOfMatchersException | 3 |
| ArgumentsAreDifferent | 3 |
| MockitoException | 2 |
| DataIntegrityViolationException(DB 字段截断) | 1 |
| 归因桶 | 例数 | 判定依据 | 归属 |
|---|---|---|---|
| A-1 本轮已修(契约/装置漂移) | 8 | guide-bind 改「提交申请待审批」、getXxxByChild→getXxxByFamilyMember、checkMemberOnly 需 taskMapper.selectById 打桩 |
测试侧 |
| A-2 Mockito 误用族 | 8 | InvalidUseOfMatchersException 3 + ArgumentsAreDifferent 3 + MockitoException 2 |
测试侧 |
| A-3 verify 未触发(未打桩) | 8 | CfCommissionServiceSettleTest 8 例 WantedButNotInvoked: cfBalanceService.earnByRule(...),档位/规则查询未 stub |
测试侧 |
| A-4 夹具 NPE | 13 | 16 例 NPE 中 16/16 堆栈首帧均在测试方法内、无生产帧(B-27 判据),扣除已修 3 例 | 测试侧 |
| A-5 Optional 空值 | 4 | DimensionScoreServiceImplTest 4 例 NoSuchElementException: No value present(repo 未 stub) |
测试侧 |
| A-6 上下文加载失败 | 8 | auditLogAspect → auditLogService 注入链失败(AdminFamilyOverviewControllerTest 3 / FamilyAdminOverviewServiceTest 3 / UserServiceFamilyNameLinkTest 2) |
测试侧(需补 @MockBean) |
| A-7 断言基线未细分 | 23 | 剩余 AssertionFailed/AssertionError,需逐例判定「装置 vs 产品」 |
待核实 |
| P-1 产品缺口 | 1 | MindFortuneControllerTest 期望 code=401 实得 400 → /api/mind/ 未入 LOGIN_REQUIRED_PATHS(详见 B-69) |
研发 |
| E-1 环境/数据 | 1 | GuideModuleIntegrationTest MySQL Data truncation: Out of range |
环境 |
量化结论:A 类合计 72 例(含已修 8)、产品 1、环境 1、待核实 23。 若 A-2~A-6 全部修完(41 例),后端通过率 → 98.59%、红例 74→33;叠加 A-7 全绿则 → 99.47%。
CfCommissionServiceSettleTest 8 · EnergySystemFlowTest 6F+1S · ProductOrderServiceFulfillmentMultiModeTest 6E · GuideFamilyTaskControllerTest 5(已修)· PlannerBindInviteFlowTest 5 · DimensionScoreServiceImplTest 4E · FamilyJoinRequestServiceReferrerBindTest 4E · AdminFamilyOverviewControllerTest 3E · FamilyAdminOverviewServiceTest 3E · GrowthRecordSyncFlowTest 3 · ArticleWorkflowTest 3 · DimensionRegistryMapContractTest 3F · ProductOrderServiceUpdateExpressFieldTest 3F · GuideRolePermissionTest 2(已修)· FortuneServiceTest 2E · UserServiceFamilyNameLinkTest 2E · OrchestrationEngineTest 1 · OrchestrationIntegrationTest 1 · MembershipPaySwitchTest 1 · PaymentServiceORDRoutingTest 1 · DailyCheckinStreakFlowTest 1E · GuideModuleIntegrationTest 1E · FamilyControllerTest 1(已修)· MindFortuneControllerTest 1(产品)
修前后对比:17 红 → 12 红(+6 绿,44 收集 / 32 过)。
| 类 | 例数 | 归因 | 类型 |
|---|---|---|---|
test_analyze.py |
2 | ValueError: Checkpointer requires ... thread_id → /api/v1/analyze 恒 500 |
产品缺陷(B-65) |
test_chat.py |
1 | 500,ImportError: chromadb_rust_bindings DLL 缺失 |
环境(B-54) |
test_auto_tag.py |
5 | 依赖 /api/v1/chat(RAG/chromadb)→ 同上 |
环境 |
test_intent.py |
4 | prompt_service 连 localhost:9082 失败 + 意图分类降级 chat |
环境(需本机后端 + LLM) |
本轮测试侧修复(+6 绿):
test_memory.py 3 红 → 4 绿(B-64 闭环):对齐 MemoryManager 真实契约(__init__(embeddings) / save_conversation / recall),并以 patch("langchain_chroma.Chroma") 隔离原生 DLL 依赖 → 单测不再被宿主机环境拖红;新增守护「旧接口不回潮」。test_report_parse.py 2 红 → 5 绿(B-66 闭环):样本 PDF 路径由写死容器路径 /app/cfc/... 改为 __file__ 上溯 3 级解析,附 requires_sample_pdf 缺样本即 skip。| 套件 | 用例 | 结果 | 耗时 |
|---|---|---|---|
| admin-desktop | TC-A-U01 登录页渲染 / U02 滑块人机验证 / U03 未登录拦截 / U04 真实登录进主框架 / U05 核心菜单 | 5/5 | 1.7m |
| frontend-mobile | TC-F-U01 首页渲染 / U02 五维沙盘 / U03 TabBar 健康 / U04 TabBar 成长 / U05 未登录「我的」鉴权引导 / U06 关键资源无 failed | 6/6 | 1.4m |
| shop-api | TC-S-U01 price asc / U02 price desc / U03 默认排序 / U04 非法排序列白名单拦截 | 4/4 | 9.6s |
| health-contract | TC-H-U01~U10 华为/小米 10 端点 401 + TC-HP-U01~03 健康方案 3 端点 401 | 13/13 | 7.7s(第 3 次复跑) |
B-61 闭环证据:13:41(R87)TC-HP-U01~03 仍 200 直通;本轮 14:14 起转为 401
{"code":401,"message":"请先登录"},独立 curl 7 端点全部 401 → 部署已含cfclub@de16f40b0(JwtInterceptor.java:114含/api/health/plan/)。连续 8 轮的 P0 缺口闭环。 首跑假红已排除(B-67):14:11 首次执行 health 出现 10 红(10 例无任何 console 输出、单轮 1.1m),紧接 14:14--workers=1 --reporter=list(13.1s)与 14:38--reporter=line(7.7s)两次独立复跑均 13/13 绿 → 判定瞬时上游抖动,非产品回归、非并发(配置本就workers:1)。
| 文件 | 改动 | 依据 | 验证 |
|---|---|---|---|
cfc-langgraph/tests/test_memory.py |
重写对齐 MemoryManager 真实契约 + 隔离 chromadb 原生依赖 + 旧接口守护 |
B-64 | pytest tests/test_memory.py → 4 passed |
cfc-langgraph/tests/test_report_parse.py |
样本路径可移植化 + requires_sample_pdf |
B-66 | pytest tests/test_report_parse.py → 5 passed(234.5s) |
cfc-backend/.../GuideFamilyTaskControllerTest.java |
3 处服务方法更名(...ByFamilyMember)、断言键 totalChildren→totalFamilyMemberren、2 处 taskMapper.selectById 打桩 |
生产重构(孩子→成员)+ checkMemberOnly 前置校验 |
定向复跑见 §6.1 |
cfc-backend/.../GuideRolePermissionTest.java |
2 处 taskMapper.selectById 打桩 |
同上 | 同上 |
cfc-backend/.../FamilyControllerTest.java |
新增 @MockBean TeacherFamilyBindingRequestService + 断言改为「申请已提交,请等待家庭主账号审批」 |
guide-bind 契约变更(直接绑定 → 申请审批) |
同上 |
未改任何生产代码、未放宽断言强度(NPE 类改为「补齐桩」而非「删断言」;契约类改为「对齐新契约」而非「忽略差异」)。
命令:mvn -o -B test "-Dtest=GuideFamilyTaskControllerTest,GuideRolePermissionTest,FamilyControllerTest" -DfailIfNoTests=false → BUILD SUCCESS
| 类 | 全量基线 | 定向复跑 | 结论 |
|---|---|---|---|
| GuideFamilyTaskControllerTest | 20 例 / 3F+2E | 20 / 0F / 0E(253.2s) | 5 红全转绿 |
| GuideRolePermissionTest | 21 例 / 1F+1E | 21 / 0F / 0E(59.5s) | 2 红转绿(耗时 274.3s→59.5s,上下文复用) |
| FamilyControllerTest | 8 例 / 1F | 8 / 0F / 0E(181.9s) | 1 红转绿 |
| 合计 | 49 例 / 8 红 | 49 / 0 / 0 | 8 例全修复,且同文件其余 41 例无回归 |
预测(未入台账,待下轮全量 clean 复跑确认):后端红例 74→66、通过率 97.03%→97.34%;全量 3145 例 → 97.37%。
方法论纪律(承 B-57):定向绿不写入基线,必须由下轮全量 clean 复跑升级为全量证据后才可入台账。
| # | 测试类型 | 状态 | 证据 |
|---|---|---|---|
| 1 | 单元测试 | 已发现 | 后端 311 类 / Jest 355+90 |
| 2 | 测试覆盖率 | 未发现 | 无 JaCoCo;N/A |
| 3 | 变异测试 | 未发现 | 无 PIT |
| 4 | 集成测试 | 已发现 | integration/ 包 + SpringBootTest |
| 5 | 契约测试 | 已发现 | tests/e2e-live/*contract*、*MapContractTest |
| 6 | 接口 API 测试 | 已发现 | shop-api / health-contract / 3194 handler |
| 7 | 系统/端到端 | 已发现 | Playwright live 4 套件 28 例 |
| 8 | 验收 UAT | 待核实 | 无显式 UAT 记录/签署 |
| 9 | BDD 规格 | 未发现 | 无 feature 文件 |
| 10 | 冒烟测试 | 已发现 | tests/e2e/ci-smoke.spec.js |
| 11 | 回归测试 | 已发现 | CI test-blocking 两级门禁 |
| 12 | 探索性测试 | 未发现 | 无 charter/记录 |
| 13 | 性能测试 | 未发现 | 无 k6/JMeter;B-60 有慢类观测 |
| 14 | 可靠性测试 | 未发现 | 无故障注入 |
| 15 | 安全测试 SAST/DAST | 未发现 | 无扫描器;仅鉴权契约 13 例 |
| 16 | 依赖漏洞扫描 | 未发现 | 无 SCA |
| 17 | 兼容性测试 | 待核实 | 仅 Chromium;无多浏览器/机型矩阵 |
| 18 | 可用性测试 | 未发现 | 无真实用户可用性证据 |
| 19 | 无障碍测试 | 未发现 | 无 axe/WCAG |
| 20 | QA 流程与度量 | 已发现 | docs/tdd、CI、台账、blockers |
「未发现」仅表示扫描未命中,不等于项目没做;扫描未覆盖处一律「待核实」。
| 维度 | 数值 | 说明 |
|---|---|---|
SRS 规格章节(docs/superpowers/api/API_REFERENCE.md §4.x) |
170 | — |
| 被 E2E 用例显式引用的章节 | 3(§4.43 / §4.44 / §4.49) | grep -rhoE '§4\.[0-9]+' tests/ --include=*.spec.js 去重 |
| 章节级锚点覆盖率 | 1.8% | G9 未达标 |
| 今日 SRS 变更 | 2 项(HL-03/R2+R3、HL-04/R4,87ffb4e3e / e7c379e17) |
已有 TC-HP-U01~03 覆盖,本轮 13/13 绿 → 变更已绑定用例 |
| 结构化 TC 台账 | 784(异常流 474 = 60.5%) | docs/tdd/test/doc-case-execution-report.md |
| 用例可自动化推导 | 253 | 同上 |
结论:最新 SRS 变更已覆盖且有实测证据;但全量 SRS 的章节级锚点覆盖仍极低(3/170),SRS 全覆盖目标未达成。
| 门禁 | 判据 | 实测 | 判定 |
|---|---|---|---|
| G1 全量通过率 | ≥95% | 97.11%(后端 97.03%) | ✅ |
| G2 红例数 | ≤20 | 86(后端 74 + langgraph 12) | ❌ |
| G3 小程序 Jest | 0 失败 | 354 过 / 1 skip | ✅ |
| G4 管理端 Jest | 0 失败 | 90/90 | ✅ |
| G5 编译与完整性 | 0 错 + 无静默丢失 | 317 源 0 错;311/311 XML | ✅ |
| G6 浏览器 E2E | 全绿 | 28/28 | ✅ |
| G7 langgraph | 0 失败 | 12 失败 | ❌ |
| G8 鉴权契约 | 全绿 | 13/13(B-61 闭环) | ✅ |
| G9 SRS 锚点覆盖 | ≥60% | 1.8%(3/170) | ❌ |
| G10 节点分派 | langgraph 派 251 | 251:9000 CLOSED,本机兜底 | ❌ |
| G11 CI 硬门禁 | 流水线可绿 | CI 存在;langgraph-blocking-pytest 因 12 红会阻断 |
❌ |
| G12 未实测项标注 | 全标注 | 已标注(见 §10) | ✅ |
总判定:⛔ 不通过(有条件) — 8 项达标 / 5 项未达标(含 1 项不可自主闭环的分派环境)。
| 序 | 动作 | 预期收益 | 归属 |
|---|---|---|---|
| P-1 | 修 auditLogAspect→auditLogService 注入链(补 @MockBean) |
8 例转绿 | 测试 |
| P-2 | CfCommissionServiceSettleTest 档位查询补桩 |
8 例 | 测试 |
| P-3 | Mockito 误用族(matcher/doNothing/verify)修订 | 8 例 | 测试 |
| P-4 | 夹具 NPE 13 例补桩 | 13 例 | 测试 |
| P-5 | MindFortune 401 口径(/api/mind/ 入清单) |
1 例 + 安全口径 | 研发 |
| P-6 | langgraph analyze thread_id(B-65) |
2 例 + 1 端点可用 | 研发 |
| P-7 | 251 放通 9000 或提供 SSH 凭据 | G10 | 运维 |
| P-8 | 剩余 23 例断言逐例定性 | 23 例 | 测试 |
clean:复用 target/,但以 311/311 新 XML + 时间戳过滤统计,无旧报告混入。