测试负责人工作汇报(第 141 轮 · 2026-11-11 09:05 GMT+8)
角色:cfc-tester(测试负责人)|执行档:review(内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化;langgraph 实派 192.168.16.251;未联网装依赖、未启停服务、未改生产代码)
基线 HEAD:d4626e5f1(R140 闭环)→ 跑测期间分支/HEAD 未漂移,收尾 fetch 远端仍为 d4626e5f1(源码零变更,结果对该 SHA 有效)
节点:189:4090=200(admin 实派 5/5)|251:4096=200(langgraph pytest 实派 51 例)|251:9000 /health=200|204:4090=000(B-95 第 12 轮)
分工:本机=后端全量 + Jest×3 + 浏览器 fe/shop/health/dx|189=admin-desktop|251=langgraph pytest
结论:⛔ 不通过(有条件) —— 无回归;红例 90 全部为「预期 RED 契约 52 + 装置 16 + 环境 5 + 根级环境 16 + 遗留业务 1」,但 G1/G2/G7/G9/G11 仍未达阈值 → 触发提交远程 + 通知研发
0. 基本信息(测试负责人模板)
| 项目 |
内容 |
| 汇报人 |
cfc-tester(测试负责人) |
| 汇报周期 |
2026-11-11(第 141 轮,基线 d4626e5f1,跑测窗口 07:40–09:05) |
| 负责模块/单元 |
cfc-backend(全量实跑) · cfc-frontend(Jest) · cfc-web(Jest) · cfc-langgraph(pytest@251) · 浏览器 E2E(admin@189 / frontend / shop / health / dx@本机) · 根级黑盒 |
| 执行档 |
review(离线;未装依赖、未启停服务、未改生产代码) |
0.1 测试用例建设与执行
| 指标 |
数量 |
填写说明 |
| 本轮新增测试用例数 |
0 个(测试侧) |
窗口对 docs/superpowers/(specs/test-cases/api)零命中(git log abdb2d6de..HEAD -- docs/superpowers/ 空、find -newermt 空)→ 无 SRS 触发的用例编写(G12 ✅)。研发侧另有 5 个 RED 契约(S-cfc-132~136)计入被测集,见附录 A |
| 本轮验证执行测试数 |
3773 个 |
后端 2937(全量实跑)+ 前端 616 + 管理端 116 + 根级 23 + langgraph 51(251 实派)+ 浏览器 30 |
| 用例通过率 |
99.11%(后端)/ 97.14%(全量) |
全量 PASS 3665 / FAIL 90 / SKIP 18 / 总 3773;剔 skip 口径 97.60% |
| 新增覆盖资产 |
0 项(测试侧) |
无 SRS 变更 → 不新增台账用例;沿用 15 份 test-cases(366 唯一 TC) |
0.2 会话与任务分发
| 指标 |
数量 |
填写说明 |
| 分派任务数 |
3 个 |
① 本机:后端全量(62:00)+ 三套 Jest + 浏览器 4 套;② 189:admin-desktop E2E(1.2m);③ 251:langgraph pytest(137.10s) |
| 恢复智能体会话数 |
0 个 |
无中断/重建 |
| 当前在用会话数 |
3 个 |
本机 / 189=shell(done)/ 251=shell(done) |
0.2b 各会话当前工作状态
| 会话标签 |
会话 ID |
当前状态 |
当前任务 |
静默/空闲时长 |
工作目录 |
备注 |
| 本机 |
localhost |
done |
后端全量 + Jest×3 + 浏览器 4 套 |
— |
d:\cfc |
后端 2937;web 116;fe 616;根级 23;浏览器 28+2跳 |
| 189:4090 |
sh_1c7e2f98c001XE3Nouz5OCO2SA |
exited(0) |
admin-desktop E2E |
78s |
...\tests |
5/5 通过(1.2m),HEAD 2f74afb23@feature/s-cfc-70-star-digest(未 reset,保护他人工作区) |
| 251:4096 |
shell 直连(kick 分离) |
done |
langgraph pytest |
137.10s |
/sc-data/cfc/cfc-langgraph |
HEAD d4626e5f1,51 例 / 46 过 / 5 红 |
| 204:4090 |
— |
unknown(000) |
失联(B-95 第 12 轮) |
— |
— |
不可用 |
0.3 问题处置
| 指标 |
数量 |
填写说明 |
| 新测试发现问题数 |
3 个 |
① B-141-1(P1) langgraph tests/qna/test_graph.py ModuleNotFoundError: No module named 'src.qna' → 整轮 pytest 收集期中断、0 例执行(必须 --ignore=tests/qna 才能跑);② B-141-2(P1) 251 LLM 时延劣化:chat 100.03s、analyze 46.99s(R138 为 12.2s / 10.2s);③ B-141-3(P2) 站点根 / 502 而 /admin、/frontend 均 200 |
| 已解决测试相关问题数 |
0 个 |
无自处置修复(本轮无测试侧装置缺陷) |
| 待解决测试相关问题数 |
5 类 |
后端 22 红(17 存量 + 5 新预期 RED)· 前端 47 预期 RED · langgraph 5 环境红(429/401)· 根级 16 环境红 · dx 2 端点 404 |
1. 历史审查记录(仅作对照,不作为本轮结论依据)
| 轮次 |
时间 |
后端全量 |
langgraph |
浏览器 |
前端 Jest |
结论 |
| R138 |
11-11 06:10 |
344 类 / 2928 例 / 99.28%(实跑)/ 17 红 |
41 过 / 2 红(429)/ 43 例 |
28/28 + dx 2 skip |
47 红 / 9 跳 / 557 过 |
不通过(有条件) |
| R139 |
11-11 06:31 |
采信 R138(零 src 变更) |
41 过 / 2 红 / 43 例 |
28/28 + dx 2 skip |
47 红 / 9 跳 / 551 过 |
不通过(有条件) |
| R140 |
11-11 07:16 |
采信 R138(连续第 2 轮采信) |
本地 venv 38 过 / 6 红(251 派发 CLOSED) |
28/28 + dx 2 skip |
47 红 / 12 跳 / 551 过 |
不通过(有条件) |
| R141(本轮) |
11-11 09:05 |
346 类 / 2937 例 / 99.11%(实跑)/ 22 红 |
251 实派 46 过 / 5 红 / 51 例 |
28/28 + dx 2 skip |
47 红 / 12 跳 / 557 过 |
不通过(有条件) |
本轮改善/变化(对照 R138 实跑基线)
| 项 |
R138 |
R141 |
判定 |
| 后端类/例 |
344 / 2928 |
346 / 2937 |
+2 类 +9 例(含研发侧新增 2 个契约类) |
| 后端红例 |
17(16F+1E) |
22(21F+1E) |
+5 全为预期 RED(LangGraphErrorPropagateContractTest 3 + LangGraphExitHangContractTest 2 = S-cfc-135/136);存量 17 红逐类逐例一致 → 零回归 |
| 后端通过率 |
99.28% |
99.11% |
−0.17pp(分母 +9、分子红 +5,纯新增契约稀释,非质量退化) |
| langgraph |
43 例(251)/ 41 过 2 红 |
51 例(251实派)/ 46 过 5 红 |
用例 +8(tests_contract/test_growth_report_contract.py 8 例,S-cfc-135/136 落地);红 5 全为 C 环境 429/401 |
| 251 派发通道 |
可用 |
可用(B-55/B-139 撤销延续判定) |
本轮 4096 直连 + kick 分离成功取回 stdout |
| 前端 |
616 / 557 过 / 47 红 / 12 跳 |
同 |
零漂移(47 红全为 S-cfc-132/133/134 预期 RED) |
| 管理端 / 根级 |
116/116;7/16 |
116/116;7/16 |
零漂移(B-36 第 37 轮) |
| 浏览器 |
28/28 + 2 skip |
28/28 + 2 skip |
零漂移,G10 双节点连续通过 |
R140「采信上轮」已纠正:R139/R140 连续 2 轮未实跑后端,本轮按「采信不可连续超过 2 轮」纪律强制实跑,取得 346/2937/22 红,证明期间新增的 5 条契约红已被识别、存量 17 红无回归。
2. 项目画像(简版,SRS 口径)
| 维度 |
本轮事实 |
| 业务定位 |
家庭教育成长平台(五维能量 · 健康报告 · 测评订单 · 家庭邀请 · 商城 · AI 管家) |
| 技术栈 |
Spring Boot 2.7.18 + MyBatis-Plus(Java 8,9082)· uni-app 小程序 Vue2 · Vue2+Element UI 管理端 · FastAPI+LangGraph+ChromaDB(9000) |
| 模块结构 |
cfc-backend(346 测试类/365 控制器) · cfc-frontend(40 套件/616 例) · cfc-web(17 套件/116 例) · cfc-langgraph(51 例) · tests/(浏览器 30 + 根级黑盒 23) |
| 关键路径 |
登录鉴权(JWT+/api/** 拦截) → 家庭/成员 → 五维能量 → 健康报告上传解析 → 健康方案 → 商城订单/支付 → AI 对话/分析 |
| 质量目标 |
全量通过率 ≥98%、零未归因红、SRS 场景锚点可追溯、CI 全量门禁 |
| 风险点 |
① LLM 依赖型用例(429/401)不可控;② 预期 RED 契约占红例 58%;③ 后端全量耗时 62 分钟(无 CI 承载);④ 8 处 @GetMapping 违 AGENTS.md |
| 待核实 |
覆盖率/JaCoCo、变异测试、压测、DAST/SCA、UAT/BDD、无障碍/多浏览器(均未授权或未安装) |
3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)
| # |
测试类型 |
状态 |
证据(本轮) |
| 1 |
单元测试 |
✅ 已实测 |
后端 2937 例(346 类,62:00);web 116;fe 616 |
| 2 |
组件测试 |
✅ 已实测 |
fe 40 套件 / web 17 套件(shallowMount 组件用例) |
| 3 |
接口 API 测试 |
✅ 已实测 |
后端 MockMvc/直调覆盖 365 控制器面;langgraph 51 例(251 实派) |
| 4 |
集成测试 |
✅ 已实测 |
integration.* 实跑(EnergySystem 6 红、DimensionRegistryMap 3 红、GuideModule 1E) |
| 5 |
系统/端到端 E2E |
✅ 已实测 |
浏览器 30 例:189 admin 5/5 + 本机 fe 6/6、shop 4/4、health 13/13、dx 2 skip |
| 6 |
冒烟测试 |
✅ 已实测 |
浏览器 28 通过 + Jest 616 + 后端 2937 构成冒烟面 |
| 7 |
回归测试 |
✅ 已实测 |
后端存量 17 红逐类逐例一致;web 116、fe 616、根级 23 零漂移 |
| 8 |
探索性测试 |
⚠️ 待核实 |
无 charter 记录(沿用历轮结论) |
| 9 |
验收 UAT / BDD |
⚠️ 待核实 |
无 cucumber/gherkin 执行证据 |
| 10 |
性能测试 |
⛔ 未授权未执行 |
压测属 execute 档,需联网显式授权(本轮只记录真实时延,见 B-141-2) |
| 11 |
可靠性测试 |
✅ 已实测(有缺陷) |
后端 62:00 无中断、346/346 XML 无沉默;langgraph tests/qna 收集期中断整轮(B-141-1) |
| 12 |
安全测试(SAST/DAST/SCA/渗透) |
⛔ 未授权未执行 |
仅鉴权契约面:线上 5/5 匿名 POST → 401(G8 ✅);@GetMapping 违规 8 处 |
| 13 |
兼容性测试 |
⚠️ 待核实 |
仅 Chromium 单引擎(1440×900 / 375×812) |
| 14 |
可用性测试 |
⚠️ 待核实 |
无真实用户可用性证据 |
| 15 |
无障碍测试 |
⚠️ 待核实 |
无 axe/WCAG 扫描 |
| 16 |
覆盖率度量 |
⚠️ 已实测(低) |
web 语句 ≈10%(17 套件);后端 JaCoCo 未接入 → 无行覆盖 |
| 17 |
变异测试 |
⛔ 未发现 |
无 PIT / mutation 资产 |
| 18 |
契约测试 |
✅ 已实测 |
health 13/13、shop 4/4、dx 2(skip=404);后端契约 16 类(5 新预期 RED) |
| 19 |
QA 流程 |
⚠️ 待核实 |
141 轮闭环可追溯;门禁未脚本化 |
| 20 |
覆盖率门禁/CI |
⛔ 未发现 |
仓库无 .github/workflows/,无 CI 全量 job(G11 ❌) |
4. 本轮实测明细
4.1 后端全量(本机实跑,62 分 00 秒)
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
→ Tests run: 2937, Failures: 21, Errors: 1, Skipped: 4 (BUILD FAILURE:仅测试红)
| 指标 |
值 |
| 测试类 / 用例 |
346 类 / 2937 例 |
| 通过 / 红 / 跳过 |
2911 / 22 / 4 |
| 通过率 |
99.11%(剔 skip 99.25%) |
| 产物完整性 |
target/classes 2326 class;surefire XML 346/346,无静默丢失 |
| 编译 |
testCompile 352 源 0 错 |
| 恒等式 |
@Test 2926 + 参数化/早退净增 11 = 2937(误差 0);@Disabled 4 = 本轮 4 skip |
| 一致性 |
346 个 Tests run 行 − 1 条总结行 = 346 类 ✅ |
| 基线纯度提示 |
346 类中有 1 类 2 例来自工作区未跟踪文件 cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleTagsContractTest.java(声明包 com.etotem.cfc.controller,mtime 11-10 23:43,非 HEAD 内容,2 例全绿)。对 HEAD 的纯度口径为 345 类 / 2935 例 / 99.11%;该文件按「他人 WIP 零触碰」纪律未提交。 |
22 红三层归因
| 桶 |
例数 |
明细 |
定性 |
| 预期 RED(研发侧新增契约) |
5 |
LangGraphErrorPropagateContractTest 3(429/401 静默 null 未传播)、LangGraphExitHangContractTest 2(cfc-async-1/cfc-scheduler-4 非 daemon) |
S-cfc-135/136,待研发 GREEN |
| 装置(A 类) |
16 |
EnergySystem 6(Mock 链路 500)、DimensionRegistryMap 3(契约待裁决 P-9)、Orchestration 2、MembershipPay 1、PaymentORD 1、WechatLogin 2(UserServiceWechatLoginTest + ...ContractTest)、TeamProfitCron 1 |
测试侧/契约裁决 |
| 数据(C 类) |
1 |
GuideModuleIntegrationTest:platform_fee Out of range(真库列定义) |
研发(DBA) |
4.2 其余套件
| 套件 |
命令/节点 |
结果 |
耗时 |
| cfc-web |
npx jest --ci(本机) |
17 套件 / 116 通过 / 0 红 |
22.0s |
| cfc-frontend |
npx jest --ci(本机) |
40 套件 / 616 例:557 过 / 47 红 / 12 跳;6 套件红 |
32.2s |
| 根级黑盒 |
npx jest -c tests/jest.config.js --ci |
3 套件 / 23 例:7 过 / 16 红(全 ECONNREFUSED 9082) |
5.9s |
| langgraph |
251 实派 pytest -q --ignore=tests/test_chat.py --ignore=tests/qna |
51 例:46 过 / 5 红 |
137.10s |
| 浏览器 admin |
189 实派 --project=admin-desktop |
5/5(含滑块 + 真实登录 + 核心菜单) |
1.2m |
| 浏览器 frontend |
本机 --project=frontend-mobile |
6/6 |
54.4s |
| 浏览器 shop |
本机 --project=shop-api |
4/4 |
10.6s |
| 浏览器 health |
本机 -c playwright.config.health.js |
13/13 |
5.5s |
| 浏览器 dx |
本机 --project=dx-bridge |
2 skipped(端点 404) |
— |
前端 47 红分布(全部为 S-cfc-132/133/134 预期 RED):health-plan-summary(组件未落地,8)、consignee-edit(13)、growthHistory.dayGroupView(10)等 6 套件。
langgraph 5 红(全 C 环境,非代码回归)
| 用例 |
断言 |
根因 |
test_auto_tag::content_relevance / short_content / empty_content |
500 == 200 |
RateLimitError 429 (AgnesAI_error: free-tier rate limit) |
test_intent::classify_analysis / classify_recommend |
CHAT == ANALYSIS/RECOMMEND |
429 后 intent_classifier.py:62 静默兜底 chat(掩盖配额错误,B-134-4 同源) |
附:chat_graph.py:148 召回记忆失败: 401 api key ****ab12 invalid(记忆召回凭据失效,非阻塞主链路)。
4.3 线上可达性与鉴权(POST 口径)
| 目标 |
结果 |
判定 |
https://cfc.iwintrue.com/admin |
200(52ms,跟随后 200) |
✅ |
https://cfc.iwintrue.com/frontend |
200(246ms) |
✅ |
https://cfc.iwintrue.com/(站点根) |
502(62ms) |
⚠️ B-141-3 新增 |
/api/mind/fortune、/api/energy/overview、/api/health/plan/list、/api/huawei-health/status、/api/xiaomi-health/status |
5/5 → 401 |
✅ G8(B-69 维持销号第 6 轮) |
/api/health/data-sources/bridge/{list,sync-status} |
首探 502 → 复探 404 / 404 |
502 为网关瞬抖;404 = 部署滞后(B-DX-1 第 4 轮) |
192.168.16.251:9000/health |
200(10.6ms) |
✅ |
251 /api/v1/chat(user_id:1) |
200 / 728B / 100.03s |
⚠️ 时延劣化(B-141-2) |
251 /api/v1/analyze(report_id:1,user_id:1) |
200 / 923B / 46.99s |
⚠️ 同 |
251 传 user_id:"r141"(字符串) |
422(int_parsing) |
契约口径:user_id 必须为整数 |
4.4 节点与派发
| 节点 |
端口/通道 |
结果 |
| 189 |
:4090 OPEN,Basic 认证通过 |
admin-desktop 5/5(1.2m,78s 取回 stdout);HEAD 2f74afb23@feature/s-cfc-70-star-digest,未执行 git reset(保护 175 处他人未提交改动) |
| 251 |
:4096 OPEN、:9000 OPEN |
pytest 51 例(137.10s);HEAD d4626e5f1 = 本地 HEAD |
| 204 |
:4090 |
CLOSED(B-95 第 12 轮) |
| 本机 |
— |
后端全量 + Jest×3 + 浏览器 4 套 |
G10 判定:✅ 双节点派发通过(189 承载 admin、251 承载 langgraph,符合「每节点单浏览器任务」与「langgraph 派 251」要求)。派发方式:POST /api/shell?location[directory]=<dir> → setsid nohup ... > LOG kick 分离 → 本地等待后单次读日志(避免 B-125「轮询建 shell 杀进程」复发)。
5. 覆盖缺口清单
| # |
缺口类型 |
现状 |
风险 |
建议测试设计 |
优先级 |
闭环方式 |
| G-141-1 |
前端契约 RED 未 GREEN |
47 红(3 组件未落地) |
组件级回归盲区 |
3 组件实现后由 jest 自动转绿 |
P0 |
研发 GREEN 后跑 cfc-frontend 全量,0 红即闭环 |
| G-141-2 |
langgraph 错误传播 |
5 红:429/401 静默兜底 |
配额错误伪装成业务失败 |
① intent_classifier.py:62 抛错而非默认 chat;② 记忆召回 401 显式告警 |
P0 |
修后复跑 test_intent/test_auto_tag,要求 5/5 绿 |
| G-141-3 |
langgraph 测试套件不可收集 |
tests/qna/test_graph.py 缺 src.qna → 0 例执行 |
CI 直接红、覆盖率假象 |
补 src/qna/ 或给该文件 pytest.importorskip/collect_ignore |
P0 |
去除 --ignore=tests/qna 后能收集到 51+N 例 |
| G-141-4 |
LLM 链路时延 |
chat 100s / analyze 47s |
用户端超时、AI 功能不可用感 |
为 chat/analyze 设 P95 时延断言(如 ≤30s)+ 429 重试上限 |
P1 |
连续 3 轮 P95 达标 |
| G-141-5 |
dx 桥接端点未部署 |
404/404(TR-24 47d203981 pending) |
D/X 域桥接能力无法验证 |
部署后 dx 2 例自动由 skip 转 401 断言 |
P1 |
部署批次落地后复跑 --project=dx-bridge |
| G-141-6 |
根级黑盒全环境红 |
16/23 ECONNREFUSED 9082 |
长期占用 G2 名额、噪声 |
改 webServer 自启或 test.skip 化 |
P2 |
该项 0 红或全 skip 并注明 |
| G-141-7 |
SRS 场景锚点 |
严格锚点 64/366 = 17.5%(宽口径 325/366=88.8%,含生成物 tests/e2e/api/generated) |
需求→用例不可追溯 |
在用例标题内嵌 TC-ID,禁用生成物计数 |
P1 |
锚点率 ≥60%(严格口径) |
| G-141-8 |
CI 全量门禁 |
无 .github/workflows/ |
回归只能靠人工轮次 |
建 CI:后端全量 + fe/web Jest + pytest(含 qna 修复后) |
P1 |
CI 上出现 blocking 全量 job |
| G-141-9 |
覆盖率/变异 |
后端无 JaCoCo、无 PIT |
无法量化测试有效性 |
接 JaCoCo(行/分支)+ PIT 抽样 1 模块 |
P2 |
报告可复算行覆盖 ≥60% |
| G-141-10 |
无障碍/多浏览器/UAT |
单 Chromium、无 axe、无 UAT 记录 |
体验与合规风险 |
axe-core 扫描 + Firefox/WebKit project + UAT 脚本 |
P2 |
三引擎 0 阻断 + WCAG A 0 violation |
6. 域结论表
| 审查维度 |
负责专家 |
结论 |
关键证据 |
| 单元·组件级 |
苏雅 |
⚠️ 有条件通过 |
后端 2937 例 99.11%、346/346 XML;fe 616(47 预期 RED);web 116/116 |
| 集成·接口级 |
柯砚 |
⚠️ 有条件通过 |
集成红 8(EnergySystem 6 / DimensionRegistryMap 3 / GuideModule 1E 跨桶);dx 端点 404 |
| 系统·验收级 |
白樾 |
✅ 通过(可达面) |
admin 5/5、frontend 6/6、shop 4/4、health 13/13;UAT/BDD 无资产(待核实) |
| 测试保障级 |
闻朔 |
✅ 通过 |
冒烟面 3773 例可执行;回归零漂移(后端存量 17 红逐例一致);探索性无 charter |
| 性能·可靠性 |
骆骋 |
❌ 不通过(可靠性缺陷) |
langgraph 收集期中断整轮(B-141-1);chat 100s/analyze 47s(B-141-2);后端 62:00 无中断 |
| 安全 |
关屿 |
⚠️ 有条件通过 |
线上 5/5 匿名 POST → 401;SAST/DAST/SCA 未授权未执行;@GetMapping 8 处 |
| 兼容·体验 |
阮清 |
⚠️ 待核实 |
单 Chromium(1440×900 / 375×812);无 axe/WCAG |
| 流程·度量·代码 |
何序 |
❌ 不通过 |
无 CI 全量(G11);锚点严格 17.5%(G9);SRS 窗口零变更(G12 ✅) |
7. 五要素问题清单
问题 1|langgraph 测试套件在收集期整体中断(P0)
- 问题描述:251 上执行
pytest -q --ignore=tests/test_chat.py,输出仅 55 行即 Interrupted: 1 error during collection,一个用例都没跑(用时 0.53s)。
- 测试 bug 点:
tests/qna/test_graph.py:7 → from src.qna import schemas, graph, prompts,而仓库无 src/qna 包(ModuleNotFoundError: No module named 'src.qna')。
- 最优修改方案:二选一并落码——① 补
cfc-langgraph/src/qna/(含 schemas/graph/prompts)使用例可执行;② 若 qna 图尚未实现,则在 conftest.py 增 collect_ignore = ["tests/qna/test_graph.py"] 或该文件首行 pytest.importorskip("src.qna"),并登记为已知缺口。
- 修改目的:恢复「langgraph 全量可一键执行」,消除 CI 必然红。
- 闭环:去除
--ignore=tests/qna 后命令能收集到 ≥51 例且无 Interrupted;连续 2 轮通过即闭环。
问题 2|上游 429/401 被静默兜底,错误不可观测(P0)
- 问题描述:
test_intent 2 例、test_auto_tag 3 例红;日志 6 次 RateLimitError 429 (AgnesAI_error),但接口返回 500(auto_tag)或「分类为 chat」(intent)。
- 测试 bug 点:
cfc-langgraph/app/agents/intent_classifier.py:62(意图分类失败 → 默认 chat);后端 LangGraphErrorPropagateContractTest 3 例断言 AiGateway.chat()/chatForAnalysis() 不得返回 null。
- 最优修改方案:①
intent_classifier 捕获 429/401 后向上抛出 ExternalServiceError(保留 HTTP 状态码);② AiGateway 不再 catch → null,改为返回带 error 标记的结构并在编排层降级;③ 配额类错误统一映射为 503 + Retry-After。
- 修改目的:让「配额耗尽」与「业务失败」在监控与告警上可区分,避免 AI 能力静默降级(B-134-4/B-82 同源)。
- 闭环:
test_intent 5/5、test_auto_tag 5/5、LangGraphErrorPropagateContractTest 3/3 全绿,且在 429 注入下仍能断言错误被传播。
问题 3|LangGraph 调用链线程非 daemon,进程无法退出(P0)
- 问题描述:
LangGraphExitHangContractTest 2 例红——cfc-async-1 isDaemon=false、cfc-scheduler-4 isDaemon=false;历史 B-126 曾出现 43 passed but PYTEST_EXIT=124。
- 测试 bug 点:
cfc-backend 线程池 bean 定义(taskExecutor / taskScheduler)未注入守护线程工厂。
- 最优修改方案:为
taskExecutor、taskScheduler 显式设置 setThreadFactory(new CustomThreadFactory(true))(daemon=true),并保留优雅停机 setWaitForTasksToCompleteOnShutdown(false)。
- 修改目的:保证 JVM 在 LLM 长调用挂起时仍可正常退出,CI 不被挂死。
- 闭环:该契约 2/2 绿;
mvn test 与 pytest 均以 EXIT=0 收尾,连续 3 轮无 124。
问题 4|LLM 接口时延劣化(P1)
- 问题描述:251 线上
chat 200 但耗时 100.03s(728B),analyze 46.99s(923B);R138 同接口为 12.2s / 10.2s。
- 测试 bug 点:无超时断言——测试只校验
status_code == 200,不校验时延(tests/test_auto_tag.py、test_intent.py 同)。
- 最优修改方案:① 服务侧设 LLM 调用超时(如 30s)+ 429 指数退避上限 2 次;② 测试侧新增
assert resp.elapsed < 30 的 P95 守卫用例(3 次采样取中位数)。
- 修改目的:把「能返回」升级为「可接受时延内返回」,防止用户端超时。
- 闭环:连续 3 轮 251 线上 chat/analyze P95 ≤30s,且时延断言用例绿。
问题 5|dx 桥接端点未部署(P1,第 4 轮)
- 问题描述:匿名
POST /api/health/data-sources/bridge/list、/sync-status → 404/404(首探曾 502,复探 404)。
- 测试 bug 点:
tests/e2e-live/dx-health-bridge-auth.spec.js TC-DX-U01/U02 因 404 判 skip(设计正确,未假绿)。
- 最优修改方案:将 TR-24
47d203981 部署至 cfc.iwintrue.com 对应后端实例,随后 dx 用例自动转 401 断言。
- 修改目的:D/X 域桥接(S-cfc-130 契约 16/16 已绿)在线上可被验证,避免「契约绿、线上缺」。
- 闭环:dx 2 例由
skipped 转 passed(断言 401/403)。
问题 6|站点根路由 502(P2,新增)
- 问题描述:
https://cfc.iwintrue.com/ 返回 502,而同域 /admin、/frontend 均 200。
- 测试 bug 点:无——本轮 curl 巡检发现,不属既有用例覆盖(建议补 TC-R-U01 站点根可达)。
- 最优修改方案:openresty 侧为
/ 配置明确落地(302 → /frontend 或静态页),或移除该 location 的上游代理。
- 修改目的:对外可达性巡检不被单点 502 误判为「全站故障」。
- 闭环:
/ 返回 2xx/3xx,新增 TC-R-U01 纳入 health 契约套件。
问题 7|根级黑盒 16 红长期占位(P2,第 37 轮)
- 问题描述:
tests/jest.config.js 23 例中 16 红,全部 ECONNREFUSED 127.0.0.1:9082。
- 测试 bug 点:
tests/integration/*.spec.js 依赖本机常驻后端,无 webServer 自启。
- 最优修改方案:jest 配置增
globalSetup 启停后端,或改用 test.skip(!process.env.CFC_LIVE) 条件跳过。
- 修改目的:消除环境型红对 G2 的长期污染,使红例数真实反映产品缺陷。
- 闭环:该项 0 红;或全 skip 且在报告中显式标注「未实测」。
问题 8|SRS 场景锚点不足(P1,度量)
- 问题描述:15 份用例台账含 366 唯一 TC,仅 64 个在测试源码中被引用(严格口径 17.5%);宽口径 88.8% 系
tests/e2e/api/generated/cases.json 生成物虚高。
- 测试 bug 点:用例标题未内嵌 TC-ID,代码与台账无稳定锚点。
- 最优修改方案:在 jest/pytest/MockMvc 用例标题(
it('TC-XX-YY ...'))内嵌 TC-ID;度量脚本排除 generated/ 目录。
- 修改目的:实现「需求条款 → 用例 → 执行结果」可追溯,支撑变更影响分析。
- 闭环:严格口径锚点率 ≥60%,且
test_report_metrics.py 输出可复算。
问题 9|无 CI 全量门禁(P1)
- 问题描述:仓库无
.github/workflows/,141 轮全靠人工轮次执行;后端全量 62 分钟无法在提交粒度承载。
- 测试 bug 点:不存在 CI 配置(缺失即缺陷)。
- 最优修改方案:建两档 job——① PR:
mvn -o -B test -Dtest=*Contract* + fe/web Jest(≤10min);② 夜间:后端全量 + pytest + 浏览器(allow_failure=false 逐步收紧)。
- 修改目的:把「轮次发现」提前到「提交发现」。
- 闭环:CI 出现 blocking job 且连续 3 次全绿。
8. 门禁结论
| 门禁 |
阈值 |
本轮实测 |
判定 |
| G1 全量通过率 |
≥98% |
97.14%(剔 skip 97.60%) |
❌ |
| G2 红例数 |
≤5 |
90(预期 RED 52 + 装置 16 + 环境 5 + 根级 16 + 业务 1) |
❌ |
| G3 前端 |
0 红 |
47 红(全部预期 RED) |
⚠️ |
| G4 管理端 |
0 红 |
116/116 |
✅ |
| G5 编译/产物完整性 |
0 错、无沉默 |
testCompile 352 源 0 错;346/346 XML |
✅ |
| G6 浏览器 E2E |
28/28 |
28/28(+2 skip) |
✅ |
| G7 langgraph |
0 红 |
5 红(429/401 环境) |
❌ |
| G8 鉴权 |
全部 401 |
5/5 → 401 |
✅ |
| G9 SRS 锚点 |
≥60% |
17.5%(严格)/ 88.8%(含生成物) |
❌ |
| G10 节点派发 |
双节点 |
189 ✅ + 251 ✅ |
✅ |
| G11 CI 全量门禁 |
存在 blocking job |
无 .github/workflows/ |
❌ |
| G12 SRS 变更→用例同步 |
变更即更新 |
窗口零变更 → 零新增(合规) |
✅ |
结论:不通过(有条件)
理由:G1/G2/G7/G9/G11 未达阈值。但无回归——后端存量 17 红与 R138 逐类逐例一致,新增 5 红全部为研发侧新契约(S-cfc-135/136)的预期 RED;langgraph 5 红全为 LLM 配额/凭据环境问题;前端 47 红全为未落地组件的预期 RED。
转「通过」的最小条件:① 3 个前端组件 GREEN(47→0);② langgraph 5 例随 429/401 治理与错误传播修复转绿;③ S-141-1 tests/qna 收集期缺陷修复(恢复一键执行);④ G9 严格锚点 ≥60%。后端 17 存量红与根级 16 环境红可另立专项,不阻塞本轮结论升级。
「全部用例覆盖并通过」目标达成度:本轮 3773 例中 3665 通过(97.14%),未达「全部通过」;失败 90 例已完成 100% 归因,其中 52 例为研发侧预期 RED(待 GREEN)、37 例为装置/环境、1 例为真库数据缺陷。SRS 覆盖:201 份规格 / 15 份用例台账 / 366 唯一 TC,严格锚点 17.5% → 覆盖不完整,缺口见 §5。
9. 窗口内增量复验(研发 GREEN 落地后,HEAD cfc6f8334)
跑测期间(08:35 前后)研发合入 4 个 GREEN 实现并推进远端,本轮在推送报告后立即做增量复验,避免下轮再从零判断:
| 提交 |
内容 |
复验方式 |
结果 |
0a01a0e8a |
S-cfc-137 healthPlanSummary 组件落地 |
cfc-frontend npx jest --ci |
8 红 → 0 |
f6590c89f |
S-cfc-138 consigneeEditor 组件落地 |
同上 |
13 红 → 0 |
a1ead33a1 |
S-cfc-140 AsyncConfig 守护线程工厂 |
定向 mvn test -Dtest=LangGraphExitHangContractTest |
2 红 → 0(2/2 绿) |
a8cda0169 |
S-cfc-141 AiGateway 429/401 传播 |
定向 mvn test -Dtest=LangGraphErrorPropagateContractTest |
3 红 → 0(5/5 绿) |
复验实测
| 项 |
本轮基线(d4626e5f1) |
增量复验(cfc6f8334) |
变化 |
| 前端 Jest |
616:557 过 / 47 红 / 12 跳(6 套件) |
616:590 过 / 14 红 / 12 跳(3 套件) |
红 −33 |
| 后端定向契约 |
5 红 / 9 例 |
0 红 / 9 例(5+4 全绿,BUILD SUCCESS) |
红 −5 |
| 前端残留 14 红 |
— |
growthHistory.dayGroupView 12(S-cfc-134 未实现)+ signature.consignee 2(AC-R1/R2 契约未满足) |
仍为预期 RED |
按增量推算的全量口径(估算,非全量重跑):3773 例 / 3703 过 = 98.14% / 红 52 / 跳 18。
标注:前端与 2 个契约类为本轮实测;后端其余 344 类沿用 d4626e5f1 全量结果(a1ead33a1/a8cda0169 仅改 AsyncConfig/AiGateway,未触及其余红类)。未做全量重跑,故 G1 仍以实测 97.14% 记录,98.14% 仅作趋势参考。
附录 A · SRS 与研发侧变更登记(窗口 abdb2d6de..d4626e5f1)
| 类型 |
对象 |
变更 |
测试侧动作 |
| 规格 |
docs/superpowers/specs(201 份)、test-cases(15 份)、api/API_REFERENCE.md |
零变更(git log/find -newermt 双空) |
不新增用例;G12 ✅ |
| 契约(研发侧) |
S-cfc-132 family.signature.healthPlanSummary |
前端 8 红(组件未落地) |
已纳入执行集,转绿即闭环 |
| 契约(研发侧) |
S-cfc-133 family.signature.consigneeEditor |
前端 13 红 |
同上 |
| 契约(研发侧) |
S-cfc-134 growth.history.dayGroupView |
前端 10 红 |
同上 |
| 契约(研发侧) |
S-cfc-135 langgraph intent.errorPropagate |
后端 3 红 + langgraph 5 例(tests_contract/test_growth_report_contract.py 8 例) |
已实跑 |
| 契约(研发侧) |
S-cfc-136 langgraph pytest.exitHang |
后端 2 红 |
已实跑 |
前端另有 16 红(R139/R140 已登记)与本轮 47 红同源,未新增。
附录 B · 本轮命令清单(可复算)
# 1) 环境探针
JAVA_HOME=/d/jdk1.8.0_25; /d/maven/apache-maven-3.6.1/bin/mvn -v; df -h /d
# 2) 后端全量
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
# 3) Jest
(cd cfc-web && npx jest --ci)
(cd cfc-frontend && npx jest --ci)
npx jest -c tests/jest.config.js --ci
# 4) 浏览器(必须在 tests/ 内执行,避免 @playwright/test 双版本)
(cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --reporter=list)
(cd tests && npx playwright test -c playwright.config.live.js --project=shop-api --project=dx-bridge --reporter=list)
(cd tests && npx playwright test -c playwright.config.health.js --reporter=list)
# 5) 189 admin(opencode shell 通道,不 reset)
node _r141_189.cjs
# 6) 251 langgraph(kick 分离 + 单次读日志)
MSYS_NO_PATHCONV=1 ./_r141_sh250.sh http://192.168.16.251:4096 /sc-data/cfc/cfc-langgraph \
"cd /sc-data/cfc/cfc-langgraph && rm -f /tmp/r141_pytest2.log && setsid nohup timeout 1500 .venv/bin/python -m pytest -q --ignore=tests/test_chat.py --ignore=tests/qna > /tmp/r141_pytest2.log 2>&1 < /dev/null & echo KICKED2"