report-test-2026-11-12-R156.md 32 KB

测试负责人工作汇报(第 156 轮 · 2026-11-12 23:35–00:50 GMT+8)

角色:cfc-tester(测试负责人 / 陆谨)|执行档:review(离线 + 内网已授权)——内网浏览器自动化(cfc.iwintrue.com/admin + /frontend)、langgraph 实派 192.168.16.251:4096、后端 mvn -o -B clean test 全量实跑;未联网装依赖、未启停服务、未改生产源码/测试。 基线 HEAD:跑测起点 722de8f37;跑测窗口内远端合入 1 个功能变更 3d35ab714 merge(miniprogram): 聊天/消息类入口按有效会员隐藏(10 文件 +124/−29,新增 utils/membershipGate.js)→ 收尾 rebase 至 c7d921bcf 后做了增量复验(前端全量 624 例,见 §5.1),并按「变更→补用例」原则新增 7 条用例。 节点分工(用户约束:每节点单任务,串行):189:4090 = admin-desktop 5/5|251:4096 = langgraph pytest 51 例|本机 = fe/shop/health/dx + 三套 Jest + 根级 + 后端全量。 结论:⛔ 不通过——后端 99.29%(17 红,与 R154 逐类逐例一致 → 零回归第 14 次);langgraph 41/51(3→10 红,本轮唯一恶化项);浏览器 28/28 + 2 skip;前端在功能合入后增量复验 624 例 / 609 过 / 3 红(集合不变);全量 3790 例 / 3726 过 = 98.31%。


0. 基本信息(测试负责人模板)

项目 内容
汇报人 cfc-tester(测试负责人)
汇报周期 2026-11-12 第 156 轮(跑测窗口 23:36–00:50)
负责模块/单元 cfc-backend(JUnit 全量实跑)· cfc-frontend(Jest)· cfc-web(Jest)· cfc-langgraph(251 实派)· 浏览器 E2E(admin@189 / fe·shop·health·dx@本机)· 根级黑盒

0.1 测试用例建设与执行

指标 数量 说明
本轮新增测试用例数 7 个 cfc-frontend/__tests__/utils/membershipGate.test.js(TC-MG-U01~U07),覆盖窗口内合入的 utils/membershipGate.js(此前零测试)。SRS/场景/API_REFERENCE 本身零变更,但功能合入属「场景实现落地」→ 按纪律补用例(未改任何生产代码)
本轮验证执行测试数 3790 个 后端 2946 + 前端 624 + 管理端 116 + 根级 23 + langgraph 51 + 浏览器 30(含 dx 2 skip)
用例通过率 98.31%(3726/3790) 剔 skip 口径 98.78%(3726/3772);红 46 = 后端 17 + 根级 16 + langgraph 10 + 前端 3
新增覆盖资产 1 项 新增 TC-MG-U01~U07 可执行锚点(membershipGate 会员门控契约);反向核查无死资产(tests/e2e-live 4 个 spec 全部挂入 project,dx 2 例按 404 正确 skip)
SRS/场景变更 0(文档)/ 1(实现) SRS specs 201 份 + test-cases 15 份 + API_REFERENCE.md 窗口内零变更;但同日 00:33 合入会员门控实现(3d35ab714)→ 已有场景「聊天/消息入口按有效会员可见」实现落地,已补 7 条用例覆盖

0.2 会话与任务分发

指标 数量 说明
分派任务数 2 个 ① 189:admin-desktop(1.4m,5/5,EXIT=0);② 251:langgraph pytest(126.67s,41/51)
恢复智能体会话数 0 无中断重建
当前在用会话数 3 本机(done)/ 189(done)/ 251(done)
会话标签 会话 ID 状态 任务 耗时 工作目录 备注
本机 localhost done 后端全量 + Jest×3 + 根级 + 浏览器 fe/shop/health/dx 61:02 d:\cfc fe 6/6、shop 4/4、health 13/13、dx 2 skip
189:4090 sh_1cb439b16… done admin-desktop E2E 1.4m C:\code\cfc\tests 5/5(EXIT=0);节点 HEAD 3c3d4b0a5、spec blob 4703d73fb 与本机完全一致 → 跨节点可比
251:4096 shell 直连(setsid nohup + 落盘) done langgraph pytest 126.67s /sc-data/cfc/cfc-langgraph 41/51;节点 HEAD 722de8f37 = 本机

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

  • 对象:cfc 周期性自动化闭环,R148–R156 连续稳态轮。上一轮 R155 @ 23:01 结论 ⛔ 有条件通过(G7 langgraph 3 红 + EXIT=124 消失、后端/前端/管理端采信 R153/R154)。
  • 遗留缺口(沿用):后端 17 红存量、cfc-web 覆盖率 9.95%<20%(G7)、langgraph 上游 429/401、安全/性能/依赖扫描未授权、CI 硬门禁必红(G11)、admin.referral(TR-25)零覆盖、dx-bridge 未部署(G14)。
  • 本轮相对 R155 的整改核查:R155 起「后端采信」已累计 1 轮 → 本轮改回全量实跑(mvn -o -B clean test,61:02)以排除窗口内隐式回归。结果与 R154 逐类逐例一致,采信期无漏检。
  • 本次非首次审查,结论以本轮实际取证为准。

2. 项目画像速览(只读)

  • 业务:浠艾福 XAF 家庭成长平台(家长端/孩子端/规划师端 + 管理端 + 独立商城 + AI 解析)。
  • 技术栈:cfc-backend(Spring Boot 2.7.18 / Java 8 / MyBatis-Plus,9082)、cfc-web(Vue 2 + Element UI 管理端,8082)、cfc-frontend(uni-app 微信小程序)、cfc-langgraph(FastAPI + LangGraph + ChromaDB,9000)、dan/danshop(8888)。
  • 关键路径:JWT 鉴权 /api/**(JwtInterceptor,8 个公开路径)、统一 @PostMapping(@GetMapping 仅存 8 处、@Put/@DeleteMapping 0 处)、AiGateway 调 LangGraph、健康报告 PDF 上传解析、五维能量、测评订单、家庭关系与邀请、商城价格排序。
  • 规模:后端控制器 366 个、@RestController 366 个;测试源 353 份 / @Test 2935;编译产出 *.class 2330;浏览器 spec:tests/e2e 75 份 + tests/e2e-live 5 份。
  • 测试现状:单元/组件/契约/集成资产齐备(后端 347 类可执行);E2E 走「线上只读浏览器 + 接口契约」双轨;无 JaCoCo(pom.xml 无 jacoco 插件)→ 后端覆盖率无法度量;CI 存在(.gitlab-ci.yml)但硬门禁必红。
  • 风险点:① 后端测试装置使全量耗时 61:02(34 次 Spring 上下文 + 每次重跑 DatabaseInitializer 全量迁移);② langgraph 依赖单一免费额度上游(429 即整片红);③ 管理端匿名访问鉴权门缺失;④ 根级黑盒套件强依赖本机 9082。

3. 20 类测试覆盖矩阵(三态)

# 测试类型 状态 本轮证据
1 单元测试 已实测 后端 347 类 / 2946 例(含单测包 com.etotem.cfc.unit、service、util);cfc-web 116/116;cfc-frontend 617
2 组件测试 已实测 cfc-frontend/__tests__/pages/**、cfc-web/src/__tests__/views/**(含 FamiliesPlanEntry.spec.js 等)
3 集成测试 已实测 com.etotem.cfc.integration.*(EnergySystemFlow 7、DimensionRegistryMap 7、GuideModule 4、ArticleWorkflow…)
4 接口 API 测试 已实测 tests/e2e-live/shop-sort-api.spec.js 4/4、health-contract.spec.js 13/13(直连 /api)、tests/e2e/api 契约集
5 系统/端到端 已实测 浏览器 28/28(189 admin 5/5 + 本机 fe 6/6、shop 4/4、health 13/13)
6 冒烟测试 已实测 langgraph@251 51 例 126.67s 正常收尾;站点 /admin /frontend 302→200
7 回归测试 已实测 后端 17 红与 R154 逐类逐例一致(零漂移第 14 次);浏览器 28/28 连续零漂移;前端 3 红集合不变
8 探索性测试 待核实 无 charter 文档、无会话记录(tests/exploratory 不存在)
9 契约测试 已实测 *ContractTest(DimensionRegistryMap 3 红、UserServiceWechatLoginContract 1 红、TeamProfitCronContract 1 红);dx-bridge 2 例按 404 skip
10 性能测试 未授权未执行 仓库无 k6/JMeter/Locust 脚本;压测属 execute 档(需联网 + 打目标环境)
11 可靠性测试 已实测(失败面) 34 次 Spring 上下文重跑 + langgraph 429 熔断面;AiGateway 熔断/超时存在但无专项可靠性用例
12 安全测试 未授权未执行 无 semgrep/DAST 配置;仅做鉴权契约 5/5(本机可达性)与匿名探针(B-142-1)
13 依赖漏洞扫描 未授权未执行 无 dependency-check/SBOM/.sarif;需联网拉库
14 兼容性测试 待核实 无浏览器/机型矩阵;Playwright 仅 chromium(1440×900 / 375×812)
15 可用性测试 待核实 无可用性指标与用户测试记录
16 无障碍测试 未发现 tests/** 无 aria/axe-core 引用(0 命中)
17 测试覆盖率 已实测(部分未达标) cfc-web Lines 9.95% / Branch 6.06% / Funcs 7.48%(<20% 不达标);cfc-frontend Lines 53.57% / Branch 28.96%;后端无 JaCoCo
18 质量指标 已实测 全量 3790 / 3726 = 98.31%(剔 skip 98.78%);红 46 / 跳 18;新增 7 例全绿
19 QA 流程 待核实(负向证据) CI 存在但 BACKEND_OBSERVED_CLASSES 漏拦 3 个当前红类 → backend-blocking-junit 必然失败
20 全项目代码审查 已实测(抽样) 本轮定位 schema.sql:5354 DDL 无效、NutritionAgeDosage 实体/表列不一致、NutritionProductService:48 死注入;未做全量逐文件审查(方案排除)

4. 执行范围 / 用例总数·通过·失败

模块 命令 总数 通过 失败 跳过 结果
cfc-backend 全量 cd cfc-backend && mvn -o -B clean test(JDK1.8.0_25 + Maven 3.6.1) 2946 2925 17 4 99.29%(剔 skip 99.42%),61:02,BUILD FAILURE(预期:红例存量)
浏览器 admin@189 playwright test -c playwright.config.live.js --project=admin-desktop 5 5 0 0 EXIT 0 ✅ 1.4m
浏览器 frontend(本机) --project=frontend-mobile 6 6 0 0 EXIT 0 ✅ 1.0m
浏览器 shop(本机) --project=shop-api 4 4 0 0 EXIT 0 ✅ 15.4s
浏览器 health(本机) -c playwright.config.health.js 13 13 0 0 EXIT 0 ✅ 14.6s
浏览器 dx-bridge(本机) --project=dx-bridge 2 0 0 2 EXIT 0;两端点 404 → 按设计 skip(B-DX-1 第 16 轮)
langgraph@251 .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py 51 41 10 0 10 failed / 41 passed / 126.67s(R155 为 48/3 → 恶化 7 例)
cfc-web (Jest) npx jest --coverage 116 116 0 0 EXIT 0 ✅ 179.2s(17 套件)
cfc-frontend (Jest) npx jest --coverage 624 609 3 12 EXIT 1;3 红 = 预期 RED(S-cfc-138 AC-R1/R2 + S-cfc-134 RED-A7)集合不变;含本轮新增 7 例;合入后复验 47.4s
根级黑盒 (Jest) cd tests && npx jest -c jest.config.js 23 7 16 0 EXIT 1;16 红全 fetch failed(本机 9082 未启动,B-36 第 50 轮)
合计 — 3790 3726 46 18 98.31%(剔 skip 98.78%)

红例分布(46):后端 17 + 根级 16 + langgraph 10 + 前端 3。


5. 关键变化(vs R155)

维度 R155 R156 变化
后端全量 采信 R154:2946/2925/17 实跑:2946/2925/17(347 类,61:02) ✅ 零漂移(第 14 次),采信期无漏检
langgraph@251 48 过 / 3 红 41 过 / 10 红 ❌ 恶化 7 例(唯一实质变化)
浏览器 28/28 + 2 skip 28/28 + 2 skip ✅ 零漂移
cfc-web 采信 116/116 实跑 116/116 ✅ 零漂移
前端功能合入 — 3d35ab714 会员门控(10 文件) ⚠️ 跑测窗口内落库 → 已做增量复验 + 补 7 例(§5.1)
cfc-frontend 采信 602/3/12 实跑 609/3/12(624 总) ✅ 零漂移 + 新增 7 例全绿(3 红集合不变)
根级黑盒 7/16 7/16 持平(B-36 第 50 轮)
全量通过率 98.91%(R155 口径) 98.31%(3790/3726) ❌ 下行,全部由 langgraph 承担(分母 +7 为新增用例)
门禁结论 有条件通过 不通过 收紧(G7 由 ✅ 改善态回落为 ❌ 阻断)

5.1 跑测窗口内功能合入 → 增量复验(新增)

跑测期间远端合入 3d35ab714 merge(miniprogram): 聊天/消息类入口按有效会员隐藏(cfc-frontend 10 文件 +124/−29,含新文件 utils/membershipGate.js)。按纪律不把窗口内合入当成「零变更」,收尾 rebase 至 c7d921bcf 后重跑前端全量:

项 结果
前端全量复验 624 例 / 609 过 / 3 红 / 12 跳(47.4s,EXIT 1)
红例集合 signature.consignee(AC-R1/AC-R2)+ growthHistory.dayGroupView(RED-A7)—— 与合入前完全一致 → 功能合入零回归
覆盖率变化 Lines 53.57% → 53.57% 同档;Stmts 46.16→46.25、Branch 28.96→29.16、Funcs 18.75→18.95(新用例带来的小幅提升)
新增用例 cfc-frontend/__tests__/utils/membershipGate.test.js 7 例(TC-MG-U01~U07)全绿
覆盖缺口闭合 membershipGate.js 合入时零测试、零用例编号;本轮补齐 4 条契约分支(无 token 不发请求 / isActive===true / 非布尔真值不误放行 / 异常 fail-closed)

补测设计要点:该函数唯一判据是 data.isActive === true(严格等值),所以专门加了 isActive: 1 与 isActive: 'true' 两个反向用例——若后端把布尔退化成数字/字符串,用例会立刻转红而不是静默放行非会员。


6. langgraph 10 红根因定性(环境红,非代码回归)

失败文件 例数 失败表征 日志证据
tests/test_analyze.py 1 test_analyze_missing_report → assert 500 == 200 RateLimitError 429 AgnesAI_error(analyze 3.66s)
tests/test_auto_tag.py 5 endpoint_responds / valid_format / content_relevance / short_content / empty_content → assert 500 == 200 每次 chat 调用 9~10s 后抛 429
tests/test_intent.py 4 classify_analysis/recommend/mind/health → assert <Intent...> ≠ 期望 intent_classifier.py:62 429 后静默兜底 chat(B-134-4 延续未修)
  • 上游原文:"You have used up today's text quota and are now limited to 1 request every 3 minutes." / "You've reached the API rate limit for free users."(429,AgnesAI)。
  • 叠加 401:chat_graph.py:148 召回记忆失败: 401 Authentication Fails, Your api key: ****ab12 is invalid(记忆召回 key 失效,非本轮新增)。
  • 服务本身健康:同窗口 251:9000/health = 200;说明「服务活、仅 LLM 面被配额掐断」——不可用单一指标否定另一面。
  • 结论:10 红全部落在 LLM 调用面,无一条为代码回归;但按门禁纪律红例即红例,G7/G2 照实判 ❌。

7. SRS/需求变更感知(G12)

检查项 结果
docs/superpowers/specs/*.md 201 份,窗口 abf53aa0d..722de8f37 零变更
tests/test-cases/*.md 15 份,零变更
docs/superpowers/api/API_REFERENCE.md 零变更
场景/用例度量(官方脚本 test_report_metrics.py --scene) 场景 215;映射到 TC 155 = 72.1%;场景 ID 字面出现在 spec 33 = 15.3%;TC 837;异常流 TC 498 = 59.5%;有可执行锚点 104(扫描资产 523)
场景缺口台账 docs/tdd/test/scenario-gap-backlog.csv 98 条缺口(A 真缺口·需补用例为主)
实现落地(非 SRS 文档变更) 1 项:3d35ab714 会员门控(utils/membershipGate.js + 9 个页面入口),合入时零测试 → 本轮补 7 条用例(TC-MG-U01~U07)
判定 G12 ✅ 合规:SRS 文档零变更 → 不因文档变更改用例;实现变更按纪律补用例(7 条,见 §5.1);admin.referral(TR-25)仍为零用例零锚点(遗留)

8. 五要素问题清单

① 后端 17 红存量(P0 · 研发)

  • ① 问题描述:mvn clean test 全量 2946 例中 16F+1E,10 个类;其中 UserServiceWechatLoginTest、UserServiceWechatLoginContractTest、TeamProfitCronContractTest 不在 CI 排除清单内。
  • ② 测试 bug 点:cfc-backend/target/surefire-reports/:EnergySystemFlowTest(7例/6F)、DimensionRegistryMapContractTest(7/3F)、GuideModuleIntegrationTest(4/1E)、OrchestrationEngineTest(8/1F)、OrchestrationIntegrationTest(7/1F)、MembershipPaySwitchTest(6/1F)、PaymentServiceORDRoutingTest(3/1F)、UserServiceWechatLoginTest(5/1F)、UserServiceWechatLoginContractTest(6/1F)、TeamProfitCronContractTest(22/1F)。
  • ③ 最优修改方案:按类归因修:① 集成夹具类(EnergySystem/GuideModule)改为 @Transactional 回滚 + 固定种子数据;② 契约类(DimensionRegistryMap/WechatLoginContract/TeamProfitCron)由产品裁决契约后同步实现与断言;③ 装置类(Orchestration/MembershipPay/PaymentORD)去 Thread.sleep、外部调用打桩。
  • ④ 修改目的:消除长期红底噪,使 G13(≤17)可收敛至 0,并为 G2(红例 ≤20)腾出额度。
  • ⑤ 闭环:修后 mvn -o -B clean test 该 10 类 0 红 + 全量 0 红,连续 2 轮零漂移 → 销号。

② CI 硬门禁漏拦 3 个红类(P0 · 研发,B-152-1 延续)

  • ① 问题描述:.gitlab-ci.yml 的 BACKEND_OBSERVED_CLASSES(33 类)未包含本轮实测红类 UserServiceWechatLoginTest、UserServiceWechatLoginContractTest、TeamProfitCronContractTest。
  • ② 测试 bug 点:.gitlab-ci.yml:61。
  • ③ 最优修改方案:把上述 3 类加入 BACKEND_OBSERVED_CLASSES;或更优——改为「运行期生成红类快照」而非静态白名单。
  • ④ 修改目的:让 backend-blocking-junit 从「必然失败」变为可信门禁,恢复 G11。
  • ⑤ 闭环:CI 流水线跑绿一次 + 人为移除一类实现使其红、验证门禁能拦住 → 双证销号。

③ CI 排除清单含 26 个已转绿类(P1 · 研发,B-152-2 延续)

  • ① 问题描述:33 类白名单中 26 类本轮实测全绿(如 AuthControllerTest 239s 全绿、ProductControllerTest、StatsControllerTest、WishControllerTest 等),仍被永久排除 → 硬门禁覆盖被人为缩小。
  • ② 测试 bug 点:.gitlab-ci.yml:61(与 ② 同一行,缺陷方向相反)。
  • ③ 最优修改方案:按 R156 实测快照重建白名单(仅保留 10 个红类),并把「白名单衰减」写入 CI 注释要求每轮复核。
  • ④ 修改目的:恢复这 26 类的 CI 阻断力,避免「绿了也测不到」。
  • ⑤ 闭环:清单重建后 CI 一次跑绿 + 抽查 3 类故意改坏能拦住。

④ nutrition_age_dosage 三重不一致(P2 · 研发,B-145-1 未修 + B-156-1 新增)

  • ① 问题描述:schema.sql:5354 建表语句含 INDEX idx_product (product_id),而表定义没有 product_id 列 → 建表恒失败;本轮 34 次 Spring 上下文启动中 34/34 失败(SQLSyntaxErrorException: Key column 'product_id' doesn't exist),DatabaseInitializer catch 后仍打「数据表检查完成」,该表从未创建成功。追加发现:实体 NutritionAgeDosage 声明 updateTime(→ update_time),而 DDL 无此列;NutritionProductService:48 注入 ageDosageMapper 但全类零调用(死注入)。
  • ② 测试 bug 点:cfc-backend/src/main/resources/schema.sql:5354;cfc-backend/src/main/java/com/etotem/cfc/entity/NutritionAgeDosage.java:33-34;cfc-backend/src/main/java/com/etotem/cfc/service/NutritionProductService.java:48。
  • ③ 最优修改方案:① 删 INDEX idx_product (product_id)(或补 product_id BIGINT 列);② DDL 补 update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;③ 按 AGENTS.md 纪律在 DatabaseInitializer.runMigrations() 增加幂等迁移(ensureColumn("nutrition_age_dosage","update_time",…)),并同步 schema.sql;④ 死注入删除或补齐调用方。
  • ④ 修改目的:消除每次启动必现的 DDL 异常(也污染全量日志与耗时);同时避免「表建好后运行期 Unknown column 'update_time'」的第二层失败。
  • ⑤ 闭环:grep -c SQLSyntaxErrorException 归零 + 启库后 SHOW CREATE TABLE nutrition_age_dosage 成功 + 剂量建议接口实调 200 → 销号。

⑤ langgraph 10 红(P0 · 运维 + 研发,B-142-2 恶化 / B-134-4 未修)

  • ① 问题描述:51 例 10 红,全部为 LLM 面 429(免费额度耗尽)+ 401(记忆召回 key 失效);intent_classifier.py:62 把 429 静默兜底成 chat,使 4 条分类用例从「上游故障」伪装成「分类错误」。
  • ② 测试 bug 点:tests/test_analyze.py::test_analyze_missing_report、tests/test_auto_tag.py(5 例)、tests/test_intent.py(4 例);cfc-langgraph/app/agents/intent_classifier.py:62;app/graphs/chat_graph.py:148。
  • ③ 最优修改方案:① 运维为 251 的 AgnesAI key 提额/换付费 key;② intent_classifier 改为显式降级(抛错或返回 degraded=true)而非默认 chat;③ 修补 chat_graph 记忆召回 key;④ 测试侧为 LLM 依赖用例加 pytest.mark.env_skip(429 时 skip 而非 fail),避免环境红污染通过率。
  • ④ 修改目的:让 langgraph 套件能反映代码质量而非配额状态,恢复 G7(≥46/51)。
  • ⑤ 闭环:连续 2 轮 51/51 全绿(或红例全为显式 env_skip)→ 销号。

⑥ 根级黑盒 16 红:本机 9082 不可达(P1 · 测试装置,B-36 第 50 轮)

  • ① 问题描述:tests/ 根级 Jest 23 例中 16 红,全部 fetch failed(/api/admin-auth/login-by-password、/api/guide/plans/family-list、/api/admin/tasks/stats 等直连 127.0.0.1:9082)。
  • ② 测试 bug 点:tests/integration/plan-chain.spec.js、tests/integration/mini-games-api.spec.js。
  • ③ 最优修改方案:加 beforeAll 探活 9082,不可达则 describe.skip 并输出 BACKEND_UNAVAILABLE(与 dx-bridge 的 404→skip 同构);或在 CI 中以 service 容器拉起后端后再跑。
  • ④ 修改目的:把「环境缺失」与「功能失败」分离,避免 16 条永久红把通过率压低 0.4pt 且掩盖真实回归。
  • ⑤ 闭环:无后端时 16 例转 skip(红 0);有后端时全绿 → 双态各验一次销号。

⑦ 前端 3 红(P2 · 研发,预期 RED)

  • ① 问题描述:signature.consignee 2 例(AC-R1 确认回调方法缺失、AC-R2 模板缺 HandSignature 段)、growthHistory.dayGroupView 1 例(RED-A7:3 条无效日期记录中 1 条未被跳过,flat.length 实测 7、期望 6)。
  • ② 测试 bug 点:cfc-frontend/__tests__/pages/signature/signature.consignee.test.js、cfc-frontend/__tests__/pages/growth-main/growthHistory.dayGroupView.test.js:287。
  • ③ 最优修改方案:① 交付 consignee-edit.vue 的确认回调与 HandSignature 内嵌段;② groupByDate 对 checkinDate 解析失败且无 recordDate 兜底的记录直接跳过(不改写输入)。
  • ④ 修改目的:让契约测试转绿,同时修掉「脏日期记录泄漏进分组」的真实体验缺陷。
  • ⑤ 闭环:前端 jest 3 红→0 且连 2 轮 0 红 → 销号(S-cfc-138 / S-cfc-134)。

⑧ 管理端匿名访问鉴权门缺失(P1 · 安全,B-142-1 延续未修)

  • ① 问题描述:匿名 POST /api/admin/families/overview → HTTP 200 + body code:400(请求参数格式错误);对照组 /api/energy/overview 等 5 个接口均 401。说明 /api/admin/** 未纳入 JWT 强校验,仅靠参数校验拦住。
  • ② 测试 bug 点:cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java(LOGIN_REQUIRED_PATHS 未覆盖 /api/admin/)。
  • ③ 最优修改方案:LOGIN_REQUIRED_PATHS 增 /api/admin/,admin 族控制器补 role=admin 校验;补一条「匿名 → 401/403」浏览器/接口契约用例。
  • ④ 修改目的:消除越权面;顺带把「200 + 业务错误码」这种伪正常态变成可断言的红线。
  • ⑤ 闭环:匿名探测返回 401/403(非 200)+ 新增契约用例常绿 → 销号。

⑨ 后端全量耗时 61:02 的装置放大(P3 · 效率,B-152-3 延续)

  • ① 问题描述:347 类耗时 61:02,其中 34 次 @SpringBootTest 上下文启动,每次重跑 DatabaseInitializer 全量迁移(日志 DatabaseInitializer 命中 10715 行、cfc-scheduler 22365 行 = 全日志 75346 行的 29.7%);最慢类 UserServiceFamilyNameLinkTest 331s、GuidePackageServiceTest 307s、GuideRolePermissionTest 258s、AuthControllerTest 239s。
  • ② 测试 bug 点:CfcApplication:12 @EnableScheduling + 缺 src/test/resources/application-test.yml(无 spring.task.scheduling.pool.size=1 与 DatabaseInitializer 开关)。
  • ③ 最优修改方案:① 测试 profile 关闭 DatabaseInitializer 与 @EnableScheduling;② 统一 @SpringBootTest(webEnvironment=NONE) + @DirtiesContext 策略合并上下文;③ 引入 JaCoCo 顺带产出覆盖率。
  • ④ 修改目的:把全量从 61 分钟压回 30 分钟量级,让全量可在 CI 每提交运行(G11 前置条件),并解锁 G7 后端覆盖率度量。
  • ⑤ 闭环:连续 2 轮全量 <35:00 且红例集合不变 → 销号。

9. 覆盖缺口清单

缺口 现状 风险 建议测试设计 优先级 闭环方式
后端覆盖率不可度量 pom.xml 无 JaCoCo(0 命中) 无法证明单测有效性 接 jacoco-maven-plugin + 阈值门禁 P0 出首份报告并设 line≥60% 门禁
cfc-web 覆盖率 Lines 9.95% / Branch 6.06% 管理端回归靠人眼 按 views/** 高价值页补组件测试 P1 覆盖率 ≥20% 连续 2 轮
场景→用例映射 215 场景,映射 TC 155(72.1%),有锚点 104 40 条场景无自动化 按 scenario-gap-backlog.csv 98 条逐条补 P1 映射率 ≥90%
安全测试 / 依赖漏洞 未授权未执行(0 配置) 漏洞不可见 semgrep + OWASP dependency-check(需联网授权) P1 高危 0
性能 / 可靠性 无脚本 全量耗时劣化无基线 k6 冒烟 + /health P95 基线 P2 基线入库 + 回归对比
兼容性 / 无障碍 chromium 单浏览器、无 axe 小程序机型/无障碍盲区 Playwright 多 viewport + axe-core 冒烟 P2 3 viewport × 关键 5 页
探索性测试 无 charter 脚本外缺陷遗漏 每轮 1 个 30 分钟 charter 并落记录 P3 charter + 缺陷单双证据
admin.referral(TR-25) 0 用例 0 锚点 功能黑盒 补接口契约 + 后台页面 E2E P2 2 条用例常绿
会员门控页级 E2E 函数级已补 7 例,页面级 0 例(9 个入口页未验渲染隐藏) 入口可见性只在函数层受保护,模板层漏改不会被发现 Playwright 游客态断言「聊天/消息」入口不可见 + 会员态可见 P1 2 条 E2E 常绿

10. 门禁矩阵(14 条)

门 阈值 本轮实测 状态
G1 全量通过率 ≥95% 98.31% ✅
G2 红例数 ≤20 46(be17 + 根16 + lg10 + fe3) ❌
G3 前端预期 RED 已知 3 3 ✅
G4 cfc-web 零红 0 0(实跑 116/116) ✅
G5 编译 EXIT 0 testCompile 353 源 0 错;classes 2330 ✅
G6 浏览器 E2E ≥26/28 28/28 ✅
G7 langgraph ≥46/51 41/51 ❌(由 ✅ 回落)
G8 鉴权契约 5 端点全 401 5/5 = 401 ✅
G9 安全/依赖扫描 中危 0 未授权未执行 ❌
G10 节点派发 ≥1 3(189 + 251 + 本机) ✅
G11 CI 固化 门禁可信 CI 存在但必红(漏拦 3 类) ❌
G12 SRS 变更→用例更新 合规 零变更 → 零写入 ✅
G13 后端红例 ≤17 17 ⚠️ 临界(零漂移)
G14 dx-bridge 已部署 404 未部署(2 例 skip) ❌

门禁结论:⛔ 不通过 —— 正向 G1/G3/G4/G5/G6/G8/G10/G12;阻断 G2/G7/G9/G11/G14;G13 临界。 较 R155「有条件通过」收紧,唯一动因是 langgraph 红例 3→10(G7 由改善态回落)。


11. 变化点与推送决策

  • 测试结果有变化:langgraph 48 过/3 红 → 41 过/10 红(恶化 7 例);门禁结论由「有条件通过」转为「不通过」。
  • 其余全部零漂移:后端 347/2946/2925/17(第 14 次)、浏览器 28/28、cfc-web 116/116、前端 602/3/12、根级 7/16。
  • 新增证据:nutrition_age_dosage 34/34 建表失败(B-145-1 未修)+ 实体 update_time 缺列 + 死注入(B-156-1 新);后端全量装置损耗量化(B-152-3 延续)。
  • 决策:按「测试结果有变化时提交到远程并通知研发」→ commit + push origin/cfclub + 落地研发通知。

12. 复评条件

  1. G7:251 LLM key 提额 / 换付费 key → langgraph 连续 2 轮 ≥46/51 且红例为显式 env_skip。
  2. G11:BACKEND_OBSERVED_CLASSES 补 3 红类并剔除 26 绿类 → CI 一次跑绿。
  3. G2/G13:后端 17 红清零(先修 CI 漏拦的 3 类)。
  4. G9:授权联网后跑 semgrep + dependency-check,中危 0。
  5. G14:dx-bridge 2 端点上线,2 例转 401/403 断言。
  6. G7 覆盖率:后端接 JaCoCo 出首份报告;cfc-web ≥20%。

13. 未实测项(如实登记)

  1. 后端覆盖率 / 变异测试:pom.xml 无 JaCoCo、无 PIT → 未实测,只有执行结果无可信覆盖率。
  2. 安全测试(SAST/DAST/渗透)、依赖漏洞扫描:execute 档需联网授权 → 未授权未执行(G9 ❌)。
  3. 性能 / 压测 / 可靠性专项:无脚本、需联网打目标环境 → 未授权未执行。
  4. 登录态业务流 E2E:无 MACHINE_JSON_PATH 凭据 → 仅做游客态可用性 + 鉴权契约,登录后业务流待核实。
  5. 兼容性 / 无障碍:仅 chromium 单引擎、无 axe → 未发现资产。
  6. 探索性测试:无 charter 记录 → 待核实。
  7. langgraph 深度链路(对话/RAG/whisper 全栈 app.main):本机不启、生产在 ai.etotem.com.cn → 仅验 251 节点最小服务套件。

附录:本轮命令与日志

# 后端全量(实跑,61:02)
cd d:/cfc/cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o -B clean test   # → _r156_backend.log
# 管理端 / 小程序端 Jest
cd d:/cfc/cfc-web && npx jest --coverage                                                                  # → _r156_web.log
cd d:/cfc/cfc-frontend && npx jest --coverage                                                             # → _r156_fe.log
# 增量复验(窗口内功能合入后)
cd d:/cfc/cfc-frontend && npx jest __tests__/utils/membershipGate.test.js && npx jest --coverage           # → _r156_fe_inc.log
# 根级黑盒
cd d:/cfc/tests && npx jest -c jest.config.js                                                             # → _r156_root.log
# 浏览器(189 单任务 / 本机单任务串行)
node docs/tdd/tools/dispatch_189_admin.cjs                                                               # → _r156_189_admin.log
cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile              # → _r156_e2e_fe.log
cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=shop-api                     # → _r156_e2e_shop.log
cd d:/cfc/tests && npx playwright test -c playwright.config.health.js                                      # → _r156_e2e_health.log
cd d:/cfc/tests && npx playwright test -c playwright.config.live.js --project=dx-bridge                    # → _r156_e2e_dx.log
# langgraph@251
node _r156_251.cjs kick && node _r156_251.cjs read                                                       # → /tmp/r156_pytest.log