_test_closure_report_2026-11-05_0821.md 19 KB

测试闭环报告 · CFC(浠艾福 XAF)· 2026-11-05 08:21 (GMT+8)

主理人:陆谨(软件测试专家团)|执行档:review(已授权内网 cfc.iwintrue.com,不联网,不提交不推送) 触发:定时自动化(每小时)· @skill TDD 多智能体研发测试调度 工作区:d:/cfc | 当前 HEAD = 69f8820d8 | 需求闸门基线 = c83c4eb25(01:40 建立)


⚠️ 更正声明(08:46,相对本版初稿):初稿 4.3 节称「现成 E2E 脚本:检索为空」有误。经用户反馈并重新以排除 node_modules/.git/.worktrees/.wt-* 的精准检索核实,本仓库实际存在大量端到端/契约测试资产:主树 d:/cfc/tests/e2e/ 有 69 个 Playwright spec 文件(约 410 个测试方法) 及 playwright.config*.js;cfc-langgraph/tests/ 有 12 个 pytest 文件 / 47 个测试函数(即「12/55」中已写部分);并由 218 个 SC 派生出 729 条结构化用例(见 docs/tdd/ci/CI_READINESS_2026-11-05.md、docs/tdd/orchestration/DEV_GOAL_user_scenarios.md)。原「检索为空」系初稿依赖了过期结论且仓库级 glob 超时所致,特此撤回。真实缺口不是「无脚本」,而是资产孤儿化:存在但执行数=0、未接 CI、未在用户场景框架下端到端执行(详见 4.3 与第七节 P1)。

一、历史审查记录(对照,非本次结论依据)

  • 上次同对象执行:2026-11-05 05:42(HEAD 345cf745e)→ ⛔不通过(有条件);后端 1528 用例 / 1408 通过 / 71 失败 / 49 错误 / 4 跳过(复用 04:30 实证,源码当时零变更);E2E 无凭据降级;SRS 零变更跳过编写。
  • 本次相对上次:后端源码/测试自 345cf745e 起发生实质变更(11 个测试文件新增/修改 + 3 个生产源文件改动),故 04:30 的 1528 实测不可复用;cfc-web Jest 连续多轮 12/90 全绿;需求文档仍零变更 → 编写闸门仍关闭。
  • 注:本环境 mvn 二进制不可用(仅 /d/maven/apache-maven-3.6.1-bin.zip 未解压,无 bin/mvn),后端全量执行依铁律降级为「未实测 + 测试设计 + 缺口诊断」。

二、项目画像速览(只读)

  • 业务定位:浠艾福(XAF)家庭成长平台——五维能量、健康报告、家庭关系、测评订单、商城。
  • 技术栈:cfc-backend(Spring Boot 2.7.18 + MyBatis-Plus + JDK8,端口 9082)、cfc-web(Vue2 + Element UI 管理端,端口 8082,Jest 单测)、cfc-frontend(uni-app 微信小程序)、cfc-langgraph(Python FastAPI AI 服务,端口 9000)。
  • 关键路径/约束(来自 AGENTS.md):统一 @PostMapping、JWT Bearer、统一 Result<T>、-DskipTests=false 强制关 skipTests、mvn 默认 <skipTests>true 假绿坑、新增接口须查 API_REFERENCE。
  • 可测范围:后端契约级单测(新增 S-cfc-9..13 / SC-G-06 / SC-P-03)、前端 Jest(mock API)、内网 /admin /frontend 端到端。

三、执行范围

模块 动作 结果状态
cfc-web npm test(Jest,CI 模式,axios-mock-adapter mock API) ✅ 实跑
cfc-backend mvn -q -DskipTests=false test ⚠️ 未实测(mvn 不可用)→ 降级
内网 E2E 探活 cfc.iwintrue.com/admin、/frontend(Playwright 1.63.0 已装;无现成脚本) ⚠️ 探活成功,无凭据 → 降级
测试用例编写 SRS/PRD/API 变更闸门检测 零变更 → 跳过编写

四、实测结果

4.1 cfc-web Jest(前端单元/组件)

  • 套件 12/12 通过;用例 90/90 通过;失败 0;耗时 21.15s;JEST_EXIT=0。
  • 说明:axios-mock-adapter mock API,不访问真实服务,不据此断言真实服务端行为。
  • 注:vue-router 有 Duplicate named routes 警告(非失败);与 05:42 轮 12/90 完全一致 → 无前端回归。

4.2 cfc-backend(Spring Boot 后端)

  • 状态:未实测(mvn 不可用)。本环境无可用 mvn 二进制(zip 未解压),依铁律不自行安装/解压依赖,降级为测试设计 + 缺口诊断,标注「未实测」。
  • 不可复用 04:30 实证:自 345cf745e 起后端源码/测试已实质变更(见 4.4),04:30 的 1528/1408/71/49/4 不再代表当前套件。
  • 历史遗留(04:30 实证,待本轮无法复验):38 个失败类的契约漂移 + B-13 环境红 8 例 + 无 JaCoCo。

4.3 内网 E2E(cfc.iwintrue.com)

  • 探活:/admin → HTTP 302;/frontend → HTTP 302(服务可达,重定向至登录);hosts 解析 192.168.16.251 cfc.iwintrue.com 确认。
  • 凭据:本环境无任何 E2E/登录凭据环境变量(已检查 E2E/PLAYWRIGHT/CFC/ADMIN/TEST_USER/PASS,均为空)→ 无法越过登录态实跑关键路径;未重启远端、未落明文。
  • E2E/契约测试资产(实测清点,撤回初稿「检索为空」误判):
    • 主树 d:/cfc/tests/e2e/:69 个 Playwright spec 文件(402 个 test() 用例 + describe/step 包裹,约 410 方法),含 roles/{admin,child,parent,teacher} 分角色登录与流程、api/* 接口冒烟与安全/兼容专项(nonfunc-security.spec.js、nonfunc-perf-compat.spec.js);配置 playwright.config*.js(base/api/func/smoke/noreset)。
    • cfc-langgraph/tests/:12 个 pytest 文件 / 47 个测试函数(即「12/55」已写部分;规划 55 个)。
    • 结构化用例:218 个 SC-角色-NN 派生 729 条(正常流/异常流/权限流),见 docs/tdd/orchestration/DEV_GOAL_user_scenarios.md §四与 docs/tdd/ci/CI_READINESS_2026-11-05.md。
  • 资产执行状态(关键缺口):上述资产执行数=0——未接入 CI(根目录无 .gitlab-ci.yml/.github/workflows/Jenkinsfile,仅 docs/tdd/ci/gitlab-ci.draft.yml 草案且 when: manual 未启用),且未在用户场景框架下端到端执行;本闭环轮因无登录凭据 + 后端/前端服务未起 + 不重启远端,同样未实跑。→ 由「无脚本→仅设计」更正为「资产存在但孤儿化」,见第七节 P1 与第十节。

4.4 后端变更清点(自 345cf745e 至 69f8820d8)

  • 新增/修改测试文件 11 个(契约级单测):JwtInterceptorContractEdgeTest、JwtInterceptorLoginRequiredTest、JwtInterceptorWechatLoginTest、ScG06JwtGuardTest、AuthWechatLoginContractTest、TaskControllerCreateTaskTest、TaskControllerReviewTest、TaskServiceReviewTest、UserServiceWechatLoginContractTest、UserServiceWechatLoginTest、FamilyUserSwitchRoleTest。
  • 生产源文件改动 3 个(cfc-backend/src/main):对应 SC-P-03 双角色切换 API 修复、SC-G-06 越权接口拦截实现。
  • 含义:后端套件已非 04:30 状态;新增安全/角色契约测试须实跑验证,但本环境无法执行 → 真实通过/失败数未知。

五、回归与闭环判定

  • cfc-web Jest:连续多轮 12/90 全绿 → 无前端回归。
  • 后端:因 mvn 不可用且源码已变更,无法实证回归/新增失败;仅能确认测试资产较 04:30 显著增长(11 文件),但红/绿未知 → 闭环缺口。
  • 历史 3 RED 键 / O-1 状态机停滞仍为跨 run 长期遗留(研发 mark-yellow 卡点,非本自动化可解)。

六、测试用例编写产出

  • 闸门检测:docs/tdd/SRS.md、docs/需求分析/、docs/superpowers/specs/、docs/superpowers/api/API_REFERENCE.md 自基线 c83c4eb25 起的提交列表 为空(git log 核实)。
  • 判定:本次无需求/接口文档变更 → 跳过编写测试用例,避免仓库抖动(与 01:40、04:30、05:42 一致)。
  • 附带说明:工作树存在未提交改动 cfc-frontend/__tests__/api/api.test.js、cfc-frontend/__tests__/utils/indicator-change.test.js、docs/tdd/test/blockers.md(非 baseline 以来提交,非 SRS 触发),不开启编写闸门,列为「待核实」。
  • 本轮循环基线记为 HEAD=69f8820d8,供下次变更检测对比。

七、五要素问题清单

P1 · 后端全量执行未实测(mvn 不可用)

① 问题描述:本环境无可用 mvn 二进制(/d/maven 仅为未解压 zip),无法编译/运行后端 1528+ 用例,且源码已变更使 04:30 实证失效。 ② 测试 bug 点:环境缺失 bin/mvn(非仓库问题);cfc-backend/pom.xml:28 <skipTests>true</skipTests>。 ③ 最优修改方案:在 CI/研发环境用 mvn -o -DskipTests=false test 实跑;本自动化环境补装 Maven(解压 /d/maven/apache-maven-3.6.1-bin.zip 并加入 PATH,须用户/平台授权)。 ④ 修改目的:恢复后端回归门禁的实证能力,使 38 类漂移与新增契约测试可量化闭环。 ⑤ 问题闭环:解压并配置 Maven 后实跑 mvn -o -DskipTests=false test,产出真实 PASS/FAIL/ERROR 与(须加 JaCoCo 后)覆盖率;通过标准=全量 GREEN 且覆盖率≥阈值。

P1 · 后端测试源码漂移(test-source drift,38 失败类)

① 问题描述:历史 1528 用例中 120 非通过(71 fail + 49 error),集中于 38 个测试类,根因为测试按旧契约断言,与已重构生产代码不一致。 ② 测试 bug 点:cfc-backend/src/test/**(状态码 500↔410/403/400/5001、术语 childId→memberId、文案漂移、Mockito 误用);B-10 已修 CfBalanceControllerTest.java。 ③ 最优修改方案:逐类对齐生产契约——更新期望状态码、字段名(memberId)、文案常量;修正 Mockito stub;优先高频契约类。 ④ 修改目的:使后端套件真实可执行并达标,恢复回归门槛,避免假绿/假红误导发布。 ⑤ 问题闭环:mvn -o -DskipTests=false test 达 BUILD SUCCESS(非通过=0)且后续每小时复验稳定。

P1 · B-13 环境红:@SpringBootTest 硬编码 127.0.0.1:3306

① 问题描述:3 个 @SpringBootTest 硬编码本地 DB 地址,在非 localhost 环境必红,掩盖真实代码质量。 ② 测试 bug 点:AdminFamilyOverviewControllerTest.java、FamilyAdminOverviewServiceTest.java、UserServiceFamilyNameLinkTest.java(硬编码 127.0.0.1:3306)。 ③ 最优修改方案:@DynamicPropertySource + 配置化数据源(从 application-test.yml 读取),移除硬编码 localhost。 ④ 修改目的:消除环境耦合红,区分"环境红"与"代码红"。 ⑤ 问题闭环:在隔离环境跑通这 3 类后 GREEN。

P2 · pom 默认 skipTests=true 假绿坑

① 问题描述:pom 默认 <skipTests>true,单独 mvn test 会跳过全部测试并报告成功,易误判全绿。 ② 测试 bug 点:cfc-backend/pom.xml:28;surefire 引用 ${skipTests}(:232)。 ③ 最优修改方案:CI/本自动化强制 -DskipTests=false;或经研发确认将默认改为 false。 ④ 修改目的:防止漏测被当通过,保证实测真值。 ⑤ 问题闭环:显式 -DskipTests=false 后跑出真实结果。

P2 · 内网 E2E 无凭据 → /admin、/frontend 实跑降级

① 问题描述:内网服务可达(302),但本环境无登录凭据,无法实跑端到端用例,仅能产出测试设计。 ② 测试 bug 点:无现成 E2E 脚本(检索为空);无凭据注入机制。 ③ 最优修改方案:建立凭据注入(环境变量/加密配置,禁明文落盘与提示词);补 E2E 脚本覆盖 /admin 登录后关键路径、/frontend 首页与核心流程。 ④ 修改目的:把内网可通达服务纳入真实端到端验证。 ⑤ 问题闭环:提供凭据后实跑 Playwright 用例关键路径全绿。

P1 · 测试资产孤儿化(存在但未执行/未接 CI/未端到端)

① 问题描述:仓库已沉淀大量端到端/契约测试资产(729 结构化用例 / 218 SC;主树 69 个 Playwright spec≈410 方法;cfc-langgraph 12 个 pytest/47 函数),但执行数=0,既未接入 CI,也未在用户场景框架下端到端执行,处于「写了不跑」状态。 ② 测试 bug 点:根目录无 CI 入口(.gitlab-ci.yml/.github/workflows/Jenkinsfile 均不存在),仅 docs/tdd/ci/gitlab-ci.draft.yml(草案,when: manual,头部标注「请勿直接改名」);d:/cfc/tests/e2e/ 与 cfc-langgraph/tests/ 资产未挂任何自动触发;docs/tdd/ci/CI_READINESS_2026-11-05.md 明示「不宣称任何 SC 已跑通」。 ③ 最优修改方案:(a) 经主理人/用户核实 CI 平台为 GitLab 且 runner 具备 JDK8(编排机实测为 JDK21,非 JDK8,不能直接推断)+ Maven + node22 + 可拉依赖网络后,将草案复制为根目录 .gitlab-ci.yml(保留 when: manual 先手动跑通);(b) 后端 job 强制 -DskipTests=false 规避 pom 假绿坑;(c) 按 DEV_GOAL_user_scenarios.md 的 G0–G4 门禁逐 SC 实跑并留痕(自动化-run-*.md + 脚本报告);(d) 提供登录凭据注入后,用现有 69 个 Playwright spec 实跑 /admin、/frontend 关键路径。 ④ 修改目的:把已写资产转化为真实回归证据,闭合「218 SC 全跑通」目标,消除「假绿/假红」盲区,使覆盖矩阵可量化。 ⑤ 问题闭环:CI 启用且每轮至少推进一项缺口;后端 mvn -o -DskipTests=false test GREEN、Playwright 69 spec 与 pytest 12 文件在 CI/本地实跑有报告、729 条结构化用例按 SC 逐条标注「已跑通/失败/阻塞/未跟踪」并附 sha 证据;通过标准=G0–G4 全绿且场景矩阵无红。

P3 · 覆盖率不可采集(无 JaCoCo)

① 问题描述:pom 未集成 JaCoCo,无法采集行/分支覆盖率,覆盖门槛缺量化依据。 ② 测试 bug 点:cfc-backend/pom.xml 无 jacoco 插件。 ③ 最优修改方案:经研发确认引入 JaCoCo + 阈值门禁。 ④ 修改目的:为覆盖矩阵提供量化数据,支撑门禁裁决。 ⑤ 问题闭环:引入后 mvn test 产出 coverage 报告,覆盖率达阈值。

八、覆盖缺口清单(20 类映射,未覆盖/降级项)

  • 单元·组件:后端 38 类契约漂移待修 + 新增 11 契约测试未实证(P1)。
  • 测试覆盖率/变异:无 JaCoCo → 未实测。
  • 集成/契约:后端 38 类漂移;新增 SC-G-06/SC-P-03 契约未实跑。
  • 系统/端到端(E2E):资产存在但孤儿化——主树 69 个 Playwright spec(≈410 方法)+ 729 结构化用例(218 SC)+ cfc-langgraph 12 pytest;但执行数=0、未接 CI、未端到端实跑;本轮回填「无凭据+服务未起」仅能探活 302(P1)。
  • 性能测试:无工具 / 未授权联网 → 未执行,降级测试设计。
  • 可靠性测试:B-13 环境红掩盖信号 → 待修复后评估。
  • 安全测试(SAST/DAST/依赖漏洞):需联网扫描 → 未授权未执行,降级测试设计。
  • 兼容性/无障碍:前端组件测试覆盖有限,无专项 → 缺口。
  • 冒烟/回归:E2E 冒烟缺;Jest 90 例作前端冒烟基线。

九、待核实项

  • 后端新增 11 契约测试 + 3 生产改动(SC-G-06 越权拦截、SC-P-03 双角色切换)的真实红/绿(需 mvn 实跑)。
  • 后端 120 失败中少数 NPE/上下文加载/DB 约束类具体根因(需逐类 surefire 报告)。
  • cfc-web Jest 套件口径:本次 12/90,历史曾 14/296,范围不一致(P2)。
  • 工作树未提交改动 cfc-frontend/__tests__/api/api.test.js、indicator-change.test.js、docs/tdd/test/blockers.md 的归属与意图(非 SRS 提交,不触发编写闸门)。
  • 内网 /admin、/frontend 登录后实际页面行为与关键路径(需凭据)。

十、需用户单独授权才能继续的项(标注「未授权未执行」+ 测试设计)

  1. 后端全量实跑(mvn):本环境 mvn 不可用 → 测试设计:在 CI/研发机 mvn -o -DskipTests=false test,优先验证新增 S-cfc-9..13 / SC-G-06 / SC-P-03 契约测试是否 GREEN,再处理 38 类漂移。授权方式:允许解压 /d/maven 并配置 PATH,或指定 Maven 路径。
  2. 内网 E2E 实跑:需登录凭据注入机制(环境变量/加密配置,禁明文)→ 测试设计(Playwright):
    • /admin:注入凭据登录 → 断言跳转后台首页 → 关键路径(会员/家庭/测评/文章/商城管理列表加载、新增/编辑弹窗、列表分页与搜索)。
    • /frontend:首页加载 → 核心流程(登录态、健康报告入口、五维能量展示、家庭关系图)。
    • 断言用 data-testid/可见文本,避免依赖内部实现;失败截图归档。
  3. 依赖漏洞扫描(SAST/DAST):需联网 → 未执行;测试设计:内网镜像接入 OWASP Dependency-Check / Snyk。
  4. 性能压测:需联网打到目标 → 未执行;测试设计:k6/JMeter 对 /api/** 阶梯加压,关注 9082 吞吐与 9000 LangGraph 解析延迟。
  5. 覆盖率采集:需改 pom 加 JaCoCo(须研发确认)→ 未执行;测试设计:JaCoCo + 阈值门禁。

十一、门禁结论

⛔ 不通过(有条件)

  • 依据:① 后端全量执行未实测(mvn 不可用)且源码已变更使历史实证失效,回归门禁无法实证闭环;② 38 类契约漂移 + B-13 环境红仍未修;③ E2E/契约资产虽存在(729 结构化用例/218 SC、69 个 Playwright spec、12 个 pytest)但执行数=0、未接 CI、未端到端实跑(孤儿化缺口,P1);④ 覆盖率未测。
  • 已达标项:cfc-web Jest 12/90 连续多轮全绿(无前端回归);后端测试资产较 04:30 显著增长(11 新契约测试);SRS 闸门稳定(无需求变更,零抖动)。
  • 复评条件(满足其一即可进入复评):
    1. 后端环境具备 Maven 后 mvn -o -DskipTests=false test 产出真实结果并达 BUILD SUCCESS(非通过=0);
    2. B-13 的 3 类硬编码 DB 改为配置化并在 CI 跑通;
    3. 提供 E2E 凭据后 /admin、/frontend 核心路径实跑全绿;
    4. 引入 JaCoCo 后覆盖率达既定阈值。

十二、约束与合规声明

  • 不访问外部公网;内网仅 cfc.iwintrue.com(hosts→192.168.16.251),仅探活 /admin、/frontend。
  • 未修改、未提交、未推送任何生产源码或测试文件;本报告为只读审查 + 本地报告产物(依本 run 指令不提交)。
  • 未写入/未输出任何明文口令、令牌、密钥;凭据缺失时标「待核实登录态」降级。
  • cfc-web Jest 为 mock API,不据其断言真实服务端行为。
  • 供应商/仓库资料未明确信息一律标「需核实」,未编造 API 或断言。

未实测项汇总:① 后端全量执行=mvn 不可用(源码已变更,04:30 实证失效);② E2E 实跑=无凭据降级;③ 覆盖率=无 JaCoCo;④ 性能/安全/压测/漏洞=需联网未授权。