report-test-2026-11-11-R135.md 22 KB

测试负责人工作汇报 · 第 135 轮(2026-11-11 03:45 GMT+8,本自动化触发)

执行档:review(内网 cfc.iwintrue.com/admin + /frontend 浏览器自动化已授权;langgraph@251 实派;未联网装依赖、未启停服务、未改生产代码) 基线 HEAD:8f2d1fe97(R134 闭环)→ 远端 6c2fdef98(仅 bump/研发汇报,R134 后源码零变更)→ 本轮 langgraph 于 251 侧以 e3f80f683 实跑 节点:251:9000=404(在线无 content)|251:4096=200(opencode 在线,本轮实派 2 轮)|189:4090=200(本轮未派发浏览器,单节点串行纪律)|204:4090=000(B-95 第 9 轮)|9082=000(B-36 第 34 轮) 分工:本机=浏览器全套(admin 5 + fe 6 + shop 4 + health 13)+ Jest(web/fe/根级)|251=langgraph pytest(实派 43 例) 结论:⛔ 不通过(有条件) — 三项历史红线未变(G2/G9/G11);本轮结果有变化:① 前端 0→16 红,全部定性为预期 RED 契约态(研发 01:30–02:33 合入的 S-cfc-30/52/53 契约测试引用组件未交付),非回归;② langgraph 实测 43 例 / 39 过 / 4 红(较 R134 红例 7→4,全部为 401/429 环境,非回归;R134 的 51 例口径当前无法复现);③ 浏览器 28/28 稳、web 116/116 稳。


1. 历史审查记录(仅作对照,不作为本轮结论依据)

轮次 时间 后端全量 langgraph@251 浏览器 前端 Jest 结论
R132 11-10 夜 沿用 R130(2865 例 / 33 红,零部署) 33 绿 / 10 环境阻塞(43 例) 28/28 0 红 不通过(有条件)
R133 11-11 01:16 沿用 R130 33 绿 / 10 环境阻塞(43 例) 28/28 0 红 不通过(有条件)
R134 11-11 02:10 343 类 / 2918 例 / 17 红 = 99.28% 44 绿 / 7 红(环境)/ 51 例 28/28 0 红 / 472 过 / 3 跳 不通过(有条件)
R135(本轮) 11-11 03:45 采信 R134(源码零变更) 39 过 / 4 红(全环境)/ 43 例 28/28 ⚠️ 16 红 / 9 跳 / 557 过 / 582 总(16 红全预期 RED) 不通过(有条件)
  • 与 R134 对比的三处实质变化:
    1. 前端 Jest 0→16 红:3 套件失败(signature.healthPlan / signature.consignee / growthHistory.view),全部为研发新合入的 RED 契约测试引用未交付组件(health-plan-summary.vue / consignee-edit.vue 不存在、growth-main/index.vue 无按日期分组逻辑);测试注释自证「尚未落地 → 预期 RED」。总用例 472→582(+107,新契约合入)。
    2. langgraph 43 例 / 4 红(全环境):251 侧当前 HEAD e3f80f683 收集口径与 R130-133 一致(43 例);R134 的 51 例在当前基线无法复现,属当时 251 快照差异。红例 7→4 为 429 配额窗口抖动改善(intent 红 4→1,仅 classify_recommend 命中限流;auto_tag 红 valid_format 为当时命中限流所致)。
    3. 浏览器 28/28 与 web 116/116 零漂移;根级黑盒 7/16 与 R134 零漂移(B-36 第 34 轮)。

2. 项目画像速览

  • 业务:浠艾福 XAF —— 家庭教育 SaaS(家庭成员 / 五维能量 / 成长规划师 / 健康报告解析 / 商城分佣 / AI 管家 / 知识中心)。
  • 技术栈:cfc-backend(Spring Boot 2.7.18 + MyBatis-Plus + Java 8,9082)· cfc-web(Vue2 + ElementUI,8082)· cfc-frontend(uni-app H5/小程序)· cfc-langgraph(FastAPI + LangGraph + Chroma,9000,部署 192.168.16.251)· dan/danshop(独立商城 8888)。
  • 关键路径:登录/家庭邀请 → 五维测评 → 成长任务审批 → 健康报告上传解析 → 商城下单分佣 → AI 对话 → 知识中心标签筛选(S-cfc-131)→ 食材推荐/今日食谱(新增 PRD 2026-11-10,测试资产已由研发 181e830be 合入)。
  • 测试现状:后端 343 类 / 2918 例(采信 R134);前端 Jest 37 套件 / 582 例(16 红预期 RED);管理端 Jest 17 套件 / 116 例;浏览器 live 28 例;langgraph 43 例(本轮 251 实派);根级黑盒 23 例。
  • 质量目标:20 类全覆盖、G1≥95%、G2≤10 红、G6 28/28、G7 0 红、G9≥80%。
  • 风险点:后端 17 红(产品/契约待裁决:EnergySystem 6×500、DimensionRegistryMap 3、Orchestration 2、WechatLogin 2、MembershipPay/PaymentORD/TeamProfitCron 各 1);前端 16 红为实现未交付的预期 RED(待研发交付组件即转绿);langgraph 凭据 401 + 配额 429 未解(B-74 / B-134-4 → 本轮延续 6 例环境红)。

3. 20 类测试覆盖矩阵(三态:已实测 / 未发现 / 待核实)

# 测试类型 状态 证据
1 单元测试 ✅ 已实测 后端 2918 例(采信 R134);web 116;fe 582(其中 16 例预期 RED 契约)
2 组件测试 ✅ 已实测 Vue shallowMount 组件用例(fe 37 套件 / web 17 套件)
3 接口 API 测试 ✅ 已实测 后端控制器 MockMvc/直调;ArticleTagFilterContractTest 10/10(R134);diet 契约新合入 536 行
4 集成测试 ✅ 已实测 integration.* 实跑(R134:GrowthRecordSync 10/10 等)
5 系统/端到端 E2E ✅ 已实测 浏览器 live 28/28(本机串行 workers=1)
6 冒烟测试 ✅ 已实测 浏览器 28 例 + Jest 698 例体现冒烟面
7 回归测试 ✅ 已实测 浏览器 28/28、web 116/116、根级零漂移;前端 16 红定性非回归(预期 RED)
8 探索性测试 ⚠️ 待核实 —
9 验收 UAT / BDD ⚠️ 待核实 无 cucumber/gherkin 执行证据
10 性能测试 ⛔ 未授权未执行 压测需联网授权
11 可靠性测试 ⚠️ 待核实 本轮新增可观测项:langgraph pytest 收尾挂起(EXIT=124,见 G-135-5)
12 安全测试(SAST/DAST/SCA/渗透) ⛔ 未授权未执行 仅静态项 + 鉴权契约
13 兼容性测试 ⚠️ 待核实 仅 Chromium 单浏览器
14 可用性测试 ⚠️ 待核实 无真实用户可用性证据
15 无障碍测试 ⚠️ 待核实 无 axe/WCAG 扫描
16 覆盖率度量 ⚠️ 已实测(低) web 语句 10.09% / 分支 6.12% / 函数 7.50% / 行 9.97%(沿用 R130);后端 JaCoCo 未接入
17 变异测试 ⛔ 未发现 无 PIT / mutation 资产
18 契约测试 ✅ 已实测 health 鉴权 13/13 + shop 排序 4/4 + article 标签 10/10(R134)+ 新合入 S-cfc-29~54 契约(其中 6 例预期 RED)
19 QA 流程 ⚠️ 待核实 135 轮闭环可追溯;门禁未脚本化(G11)
20 全项目代码审查 ⚠️ 待核实 仅规范扫描

4. 实测结果明细(本轮真实信号)

4.1 浏览器 live(本机,workers=1 串行)

项目 结果
frontend-mobile(375×812) ✅ 6/6
shop-api(排序契约) ✅ 4/4
admin-desktop(1440×900) ✅ 5/5
health-contract(鉴权) ✅ 13/13
合计(G6) ✅ 28/28(与 R134 一致;.live-artifacts/.last-run.json status=passed / failedTests=[])

4.2 Jest(本机)

套件 命令 结果
cfc-frontend npx jest --ci ⚠️ 3 套件失败 / 34 过;16 红 / 9 跳 / 557 过 / 582 总(29.3s)
cfc-web npx jest --ci ✅ 17 套件 / 116 过 / 0 红(40.2s)
根级黑盒 npx jest -c tests/jest.config.js --ci ⚠️ 7 过 / 16 红(全 ECONNREFUSED 127.0.0.1:9082,B-36 第 34 轮零漂移)

4.3 前端 16 红根因(全部预期 RED 契约态,非回归)

失败套件 引用组件 事实 契约键
signature/signature.healthPlan.test.js pages/signature/components/health-plan-summary.vue git ls-files pages/signature/components/ 仅 hand-signature.vue → 组件不存在 S-cfc-52
signature/signature.consignee.test.js pages/signature/components/consignee-edit.vue 测试注释明示「尚未落地(实现未交付)→ 预期 RED」 S-cfc-53
growth-main/growthHistory.view.test.js growth-main/index.vue 无按日期分组逻辑(正则 `dateGroups groupedRecords未命中、script 无groupByDate` 等)
  • 合入窗口:01:30–02:33(91711edfa / 584e0a0b2 / d6de1eba0 / 26380e100 / d91095be5 等 14 个测试文件 +2502 行)。
  • 处置:不改测试、不降级;维护 RED 契约等待研发交付组件(TDD 正常态),门禁中如实标注「预期 RED」。

4.4 后端全量(采信 R134 权威基线,原因见下)

  • 343 类 / 2918 例 / 2897 过 / 17 红 = 99.28%(R134 实跑 56:53,BUILD FAILURE 仅测试红)。
  • 采信依据:git diff 8f2d1fe97..6c2fdef98 -- cfc-langgraph 空(langgraph 零变更);8f2d1fe97..origin/cfclub 仅 bump(cfc-web 5 文件)+ 研发汇报,后端 src 零变更 → 按采信纪律沿用 R134 权威全量,不重复跑。
  • 17 红集合(承袭):EnergySystemFlowTest 6 + DimensionRegistryMapContractTest 3 + GuideModuleIntegrationTest 1E + OrchestrationEngineTest 1 + OrchestrationIntegrationTest 1 + MembershipPaySwitchTest 1 + PaymentServiceORDRoutingTest 1 + UserServiceWechatLoginTest 1 + UserServiceWechatLoginContractTest 1 + TeamProfitCronContractTest 1。

4.5 langgraph@251(本轮实派)

  • 39 过 / 4 红 / 43 例(147.04s,--ignore=tests/qna --ignore=tests/test_chat.py);251 侧 HEAD=e3f80f683。
  • 4 红全部环境(非回归):
    • test_auto_tag_valid_format:标签数量应为 3-5 个 且 len([])=0 → LLM 返回空标签(401 记忆召回失败 ****ab12 invalid + 429);
    • test_auto_tag_content_relevance / test_auto_tag_short_content:chat 端点返回 500 ← 429 RateLimit(AgnesAI free quota);
    • test_intent_classify_recommend:assert chat == recommend ← intent_classifier.py:62 捕获 429 后默认 chat。
  • 口径说明:本轮收集 43 例与 R130-133 一致;R134 记录的 51 例在当前 251 快照无法复现——不影响本轮结论(红例 7→4 为配额抖动改善,无新增产品红)。
  • 新增可观测项(G-135-5):pytest 主流程 147s 已完成(summary 完整打印),但进程收尾不退出,timeout 650 于 ~653s 强杀 → EXIT=124;疑似 JavaClient._get_client 协程未 await(RuntimeWarning)或 Chroma/线程非守护挂起。将使派发任务虚耗时 ~500s/轮。建议排查非守护线程/协程后连跑 2 轮验证。

4.6 主口径合计(本轮实测面)

3720 例 / 3654 过 / 53 红 / 13 skip = 98.23%(剔 skip 98.57%) = 后端 2918(2897 过 / 17 红 / 4 skip)+ 契约 10(全绿)+ web 116 + fe 582(557 过 / 16 红[预期 RED] / 9 跳)+ 根级 23(7 过 / 16 红)+ langgraph 43(39 过 / 4 红)+ 浏览器 28。


5. 本轮测试侧闭环明细

# 事项 类型 说明
1 前端 16 红定性 判定 3 套件失败全部为预期 RED 契约态(实现未交付)→ 不改测试、不误报回归
2 langgraph 口径校准 取证 251 实派 43 例与 R130-133 一致;红例 4 全环境;R134 51 例无法复现(快照差异),已在 §4.5 说明
3 SRS 变更 → 用例同步(G12) 核验 新 PRD《2026-11-10-食材推荐食谱需求变更》8.3 指定「需新增 DietRecommendationServiceTest」→ 已存在(181e830be 合入 536 行,覆盖 D(N) 菜数公式 / S=1 / T=D+1 / view_key 隔离 / 删除 status 不变 / regenerate 不 insert / 共餐人口径 / 降级菜单)✅;前端 recommendation.viewKeyAndDelete.test.js(494 行)+ recommendation.pagination.test.js(291 行)同步合入 ✅
4 需求文档回链附录 补录 8 个需求变更文档已加「场景与用例回链」附录(2026-11-10 测试侧补录,113 行),随 R135 提交
5 浏览器/web 零漂移 回归 28/28、116/116 与 R134 逐字段一致

6. 覆盖缺口清单

# 缺口类型 现状 风险 建议测试设计 优先级 闭环方式
G-135-1 后端 17 红(产品/契约) EnergySystem 6×500、Orchestration 2、WechatLogin 2、MembershipPay/PaymentORD/TeamProfitCron 各 1、DimensionRegistryMap 3、platform_fee 截断 真回归被淹没在固定红里 按类分批:产品类交研发修;P-9 由研发拍板口径后二选一改用例 P0 研发修完复跑该类 + 全量,连 2 轮绿销号
G-135-2 langgraph LLM 链路 251 凭据 401(****ab12)+ AgnesAI 免费额度 429;intent_classifier.py:62 兜底成 chat 配额/凭据故障被误读为分类缺陷 LLM 依赖用例标 @pytest.mark.llm 拆非门禁套件;429/401 抛外部服务异常 P0 运维换 Token + 研发改兜底语义后连跑 2 轮
G-135-3 前端 16 红(预期 RED) S-cfc-30/52/53 契约测试已合入,实现组件未交付 契约长期悬置占红 研发按契约交付 health-plan-summary.vue / consignee-edit.vue / growth-main 分组逻辑 P0 组件合入后前端 jest 连 2 轮全绿
G-135-4 CI 全量门禁 + 锚点率(G9/G11) TC 唯一编号锚点约 10%;无 CI 全量 job 回归无法自动拦截、用例→代码追溯弱 固化锚点口径 + 落地 CI(需联网建管道,未授权) P1/P2 研发/运维建 pipeline
G-135-5 langgraph pytest 收尾挂起 主流程 147s 后进程不退出,timeout 650 强杀 EXIT=124 派发虚耗 ~500s/轮、shell 易丢失 排查 JavaClient._get_client 协程未 await / 非守护线程;加 -p no:cacheprovider P1 251 侧修复后连跑 2 轮验证
G-135-6 二节点浏览器冗余 189 未派发(dispatch 器 Windows 兼容,承袭 G-134-6) 缺第二节点冗余证据 派发器补 Get-Content 分支 P2 双平台支持后复跑

7. 域结论表

审查维度 负责专家 结论 关键证据
单元·组件级 苏雅 ⚠️ 有变化但非回归 fe 16 红全为预期 RED 契约态(S-cfc-30/52/53 实现未交付);web 116 全绿;后端采信 R134 17 红
集成·接口级 柯砚 ✅ 有推进 diet 契约新合入 536 行 + viewKeyAndDelete 494 行 + pagination 291 行;article 标签 10/10(R134)
系统·验收级 白樾 ✅ 绿 浏览器 live 28/28(admin 5 / fe 6 / shop 4 / health 13);UAT/BDD 证据仍缺
测试保障级 闻朔 ✅ 定性准确 16 红根因取证(组件缺失)完整;浏览器/web/根级零漂移
性能·可靠性 骆骋 ⚠️ 新发现 langgraph pytest 收尾挂起 EXIT=124(G-135-5);压测未授权未执行
安全 关屿 ⚠️ 静态趋稳 / 动态缺失 鉴权契约 13/13;SAST/DAST/SCA 未授权
兼容·体验 阮清 ⚠️ 待核实 单 Chromium;无可用性/无障碍证据
流程·度量·代码 何序 ⚠️ 有缺口 锚点约 10%、无 CI;用例更新纪律达标(G12)
langgraph 专项(251) 陆谨汇总 ⚠️ 环境红 4 43 例 / 39 过;红例全为 401 凭据 + 429 配额(非回归,较 R134 红例 7→4 改善)

8. 五要素问题清单

问题 1 · 前端契约测试引用未交付组件致 16 红(预期 RED,持续盯办)

  • ① 问题描述:cfc-frontend jest 由 R134 的 0 红变为 16 红,3 套件失败,表象像回归。
  • ② 测试 bug 点:非测试 bug。signature.healthPlan.test.js / signature.consignee.test.js / growthHistory.view.test.js 为研发按 S-cfc-30/52/53 合入的契约级测试,断言组件文件存在性与按日期分组逻辑;但实现组件 health-plan-summary.vue / consignee-edit.vue 尚未交付(git ls-files pages/signature/components/ 仅 hand-signature.vue),growth-main/index.vue 亦无分组逻辑。
  • ③ 最优修改方案:研发按契约交付:① 新建 consignee-edit.vue(收件人编辑组件);② 新建 health-plan-summary.vue(健康计划摘要组件);③ growth-main/index.vue 增加按日期分组渲染逻辑(dateGroups/groupByDate)。测试零修改。
  • ④ 修改目的:TDD 正常 RED→GREEN 推进;契约先行、实现跟进,防止实现驸离规格。
  • ⑤ 闭环验证:组件合入后 npx jest --ci 在 cfc-frontend 连 2 轮 0 红即销号(G-135-3 / B-135-1)。

问题 2 · langgraph LLM 用例红为凭据 401 + 配额 429(待研发/运维)

  • ① 问题描述:251 实派 43 例中 4 红(auto_tag 3 + intent 1)。
  • ② 测试 bug 点:非测试 bug;app/agents/intent_classifier.py:62 捕获异常后默认 chat,把 429 伪装成分类错误(吞错点)。
  • ③ 最优修改方案:运维换有效 Token(当前 ****ab12 401);研发将 429/401 抛 ExternalServiceError 而非回落 chat;LLM 依赖用例加 @pytest.mark.llm 并从门禁套件剔除。
  • ④ 修改目的:让「分类错误」与「上游不可用」可区分,避免红线误判产品回归。
  • ⑤ 闭环验证:换 Token 后 251 连跑 2 轮 43/43 绿即销号(B-74 / B-134-4 延续)。

问题 3 · R134 langgraph 51 例口径与本轮 43 例不一致(取证澄清)

  • ① 问题描述:R134 记录「51 例 / 44 绿 / 7 红」,本轮同命令收集仅 43 例。
  • ② 测试 bug 点:非测试 bug;251 侧本轮 git reset --hard origin/cfclub 后 HEAD=e3f80f683,收集 43 例与 R130-133 一致。51 例疑为 R134 时 251 快照含额外测试文件(如当时未 ignore 的 qna/test_chat 或历史遗留),当前基线无法复现。
  • ③ 最优修改方案:以本轮 43 例为基准口径固定;如研发需复核 R134 数字,可在 251 以当时 sha 复跑并回帖结论。
  • ④ 修改目的:校准 langgraph 口径,杜绝 51/43 混用导致的误判。
  • ⑤ 闭环验证:连跑 2 轮收集数稳定为 43 即口径成立。

问题 4 · langgraph pytest 收尾挂起致 timeout 强杀 EXIT=124(新发现)

  • ① 问题描述:pytest 147.04s 打印完整 summary 后进程不退出,timeout 650 至 ~653s 强杀,shell 输出 EXIT=124。
  • ② 测试 bug 点:疑似并发协程/线程未 join:RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited;Chroma 客户端线程或 FastAPI 事件循环未关闭。
  • ③ 最优修改方案:排查 tests/conftest.py 与 app 侧非守护线程/未 await 协程;测试侧加 -p no:cacheprovider 与显式 shutdown fixture。
  • ④ 修改目的:派发任务不再虚耗 ~500s、shell 不易被服务端回收丢失(本轮首轮派发即因此丢结果)。
  • ⑤ 闭环验证:251 连跑 2 轮均在 ≤200s 内退出且 EXIT=0/1 即闭环。

问题 5 · SRS 变更触发测试资产已就位(G12 达标核验)

  • ① 问题描述:新 PRD《2026-11-10-食材推荐食谱需求变更》属 SRS 变更,须确认测试用例已更新。
  • ② 测试 bug 点:无 bug;核验结论为已达标——PRD 8.3 指定「需新增 DietRecommendationServiceTest(本次必需)」,实际已由研发 181e830be 合入 536 行(5 类覆盖:菜数公式 / normalizeMenu 补齐截断 / 降级菜单 / generate|regenerate 三路径 / view_key 隔离 / update 删除 status 不变),前端 viewKeyAndDelete 494 行 + pagination 291 行同步合入。
  • ③ 最优修改方案:无需修改;后续研发实现交付后跑该模块回归(现有 recommendation.*.test.js 覆盖)。
  • ④ 修改目的:确保 SRS 变更→用例同步链路闭环。
  • ⑤ 闭环验证:181e830be 在基线链内且 8.3 指定测试齐全 → G12 ✅。

9. 门禁结论

门禁 指标 阈值 本轮 判定
G1 主口径通过率 ≥95% 98.23%(3654/3720;剔 skip 98.57%) ✅
G2 红例数 ≤10 53(后端 17 + 根级 16 + 前端 16[预期 RED] + langgraph 4) ❌
G3 cfc-web Jest 全绿 116/116 ✅
G4 cfc-frontend Jest 全绿 16 红(预期 RED)/ 9 跳 / 557 过 ❌
G5 编译 + XML 完整性 0 错 / 无沉默 编译 0 错 / 343 类无沉默(采信 R134) ✅
G6 浏览器 live 28/28 28/28 ✅
G7 langgraph 0 红 39/43(4 全环境 401/429) ❌
G8 鉴权契约 全 401/403 13/13 ✅
G9 SRS/TC 锚点率 ≥80% ≈10% ❌
G10 节点分派 251 + 浏览器节点 251 ✅ / 189 未派发 ⚠️
G11 CI 全量门禁 存在 无 ❌
G12 SRS 变更→用例同步 合规 合规(食材推荐 PRD 指定测试已合入 536+494+291 行) ✅

总裁决:⛔ 不通过(有条件) —— G2/G4/G7/G9/G11 未达标;G4 的 16 红与 G7 的 4 红全部为预期 RED 契约态 / 环境红(401+429),均非回归;G2 中 36/53 红属环境或预期 RED。本轮属方向性观察轮:无新回归、口径校准(langgraph 43 例)、SRS 变更用例已同步。 复评条件:① 研发交付 S-cfc-30/52/53 组件使前端 16 红转绿;② 251 换 Token + 429 配额恢复使 langgraph 43/43;③ 后端 17 红按批修复或口径裁决;④ CI 落地全量 job + TC 锚点补齐。


10. 附录 · 本轮命令

# 浏览器(必须在 tests/ 目录内,B-52)
cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile --project=shop-api
npx playwright test -c playwright.config.health.js
npx playwright test -c playwright.config.live.js --project=admin-desktop
# 前端/管理端/根级
cd cfc-frontend && npx jest --ci ; cd ../cfc-web && npx jest --ci ; cd .. && npx jest -c tests/jest.config.js --ci
# langgraph(251 实派,本轮 dispatch_251_shell_v2.cjs;首轮 shell 丢失,次轮成功 43 例)
OPENCODE_SERVER_PASSWORD=... node docs/tdd/tools/dispatch_251_shell_v2.cjs
# 251 只读取证(collect-only + HEAD)
node /tmp/r135_collect.cjs