Files
PlantAI-rag-new/docs/team/report_bioflow_test2.md

19 KiB
Raw Permalink Blame History

report_bioflow_test2.md —— T2 生信编排测试 R1 全量测试报告

轮次 R1 | 测试 agent T2 | 2026-09-06 | 模板依据 TEST_PLAN §8(+§12 生信追加项) 任务书:docs/team/brief_bioflow_test2.md;用例唯一来源:docs/TEST_CASES.md §6(749 条 TC-BIO)

1. 轮次信息

项 值
被测版本 feature/bioflow-conversation-orchestration @ 35bf688(fix: 部署期 P1 双缺陷修复)
运行环境 服务器 8.163.92.8:26518(xzq);venv plantai-rag-new-venv py3.12.13
部署形态 同部署:BFF 8090(BIOFLOW_ENABLED=true 反代)+ 生信服务 8098(源码树直跑,health ok)+ QA 金标 8091(零改动)+ flow_docs 724 块
L1/L2 运行 cd bioflow_service && venv/bin/python -m pytest tests/ -q(-m bioflow_unit / -m bioflow_api 分层)
L3/L4 运行 cd ui && npx vitest run(vitest 2.1.8;27 文件 373 用例)
L5 运行 Playwright 1.49.1 + chromium-1148(三档视口可用);生信 E2E 无仓库 spec,本轮以 curl 端到端 + /tmp 临时 spec(不进仓库)等价覆盖
L2s 运行 BIOFLOW_DATA=/home/xzq/5090/teamWorkspace/zh/bioflow-data bash bioflow_kernel/tests/smoke_golden.sh bioflow-gf:dev
轮次纪律 只跑测试与写报告;产品代码零改动(git diff 空,见 §6);未 commit/push;未停/重启任何生产服务;jobs 冒烟仅 422 校验与 created 态创建(未 confirm、未触发真实 docker)

2. 首页统计

2.1 分层执行结果

层 总数 Pass Fail Skip 说明
L1 生信单元(pytest -m bioflow_unit) 127 127 0 0 runner 状态机/manifest/db 三表/事件帧/意图词典(mock docker)
L2 生信接口(pytest -m bioflow_api) 39 39 0 0 端点 SSE 直调 + ASGITransport(mock LLM/vstore/docker)
L1+L2 后端全量 166 166 0 0 pytest tests/ -q,与开发 agent 自测一致
L3+L4 前端(vitest 全量) 373 373 0 0 27 文件;生信子集 tests/frontend/unit/bioflow 9 文件 200 用例
L5 Playwright(既有 E2E 冒烟三档) 6 6 0 0 smoke.spec 2 条 × 3 视口(TC-BIO-REG-014 既有链路语义)
L5 生信冒烟(/tmp 临时 spec,不进仓库) 2 1 1 0 dev 链路(5180→8090)TAB 可见 pass;生产入口(8090)TAB 可见 pass + catalog 502 fail(BUG-R1-01)
L5 curl 端到端(已部署真实端点) 15 13 2 0 明细 §2.4;2 fail 均归因缺陷清单
L2s 金标冒烟(真实 docker) 1 1 0 0 smoke_golden.sh bioflow-gf:dev:SMOKE DONE + GOLDEN_DIFF_OK 24 IDs(diff 空、exit 0)

2.2 门禁核对

门禁项 要求 实际 结论
生信用例总数(TEST_CASES.md §6) ≥600 749(grep 计数) 达标
FR-BIO 追溯(主门禁) 每 FR ≥1 TC、无孤儿 32/32 全覆盖;无孤儿(FR 列空计数=0) 达标
UI 动作矩阵(ACT 95 条) 每元素×每动作一条 TC 用例编制 95/95;vitest 显式断言 45/95(未显式覆盖 50 条清单见 §5.2) 编制达标,执行未满
后端行覆盖(辅门禁) ≥85% 79%(bioflow_service app 2367 行,pytest-cov) 未达标
前端行覆盖(辅门禁) ≥80% 75.93%(All files,vitest --coverage) 未达标
红线文件零改动 diff 空 6 红线文件 + PipelineCard.vue git diff 空(§6) 达标
QA 金标树未动 版本仍 1.1.73-assertion-anchored 8091 /health = 1.1.73-assertion-anchored(gate_policy legacy) 达标

2.3 意图分流双跑核对(词典唯一事实源 docs/team/cases_bioflow_intent.md)

项 结果
前端 ui/src/utils/intent.js × 词典 40 用例表 40/40 MATCH
后端 bioflow_service/app/services/bioflow/intent.py × 词典 40 用例表 40/40 MATCH
复用方法名提取(INTENT-034~037 四句式) 4/4 = XXX(含《》书名号、根据/参考句式)
附加边界核对(INTENT-019/020/022/023/024/025/026/040/015/045/046) 10/10 符合(纯空白→qa、乱码→qa、大小写不敏感→bioflow、英文整句→bioflow、标点夹杂→bioflow、SPL 会议→qa、全角空白→bioflow、无上下文问方法→qa、有上下文→bioflow_qa、无状态残留)
INTENT-044 交互式补充「换玉米,重跑」 与期望不符(见 BUG-R1-05)

2.4 L5 curl 端到端明细(已部署环境,不依赖浏览器)

# 端点 结果 对应 TC
1 GET 8090 /api/bioflow/health 200,响应体=直连 TC-BIO-API-100
2 GET 8098 /api/bioflow/health 200,db connected TC-BIO-API-099
3 GET 8098 /api/bioflow/catalog 200,75 阶段 TC-BIO-API-021(数值差异→BUG-R1-02)
4 GET 8090 /api/bioflow/catalog 502 UPSTREAM_DOWN FAIL→BUG-R1-01
5 GET 8098 /api/bioflow/catalog?chain=gene_family 200,21 阶段 TC-BIO-API-022(数值差异→BUG-R1-02)
6 GET 8090 /api/bioflow/jobs 200 空列表 TC-BIO-API-032
7 POST jobs 空 stages 422 校验 TC-BIO-API-028
8 POST jobs 未知阶段 422 UNKNOWN_STAGE 信封 TC-BIO-API-030
9 POST jobs 合法 identify 201 created(未 confirm 未触发 docker) TC-BIO-API-027
10 GET jobs/{id}/events snapshot 首帧 + job_created/stage_await_files 回放 TC-BIO-API-017/078(snapshot 结构瑕疵→BUG-R1-04)
11 POST chat/stream 非生信句 message_done kind=qa(不建任务) TC-BIO-API-005
12 POST chat/stream 空 message 422 TC-BIO-API-006
13 POST chat/stream flow_qa(ctx=true) citations 空 degraded=true FAIL→BUG-R1-03
14 POST ask 流程咨询 citations 空 degraded=true FAIL→BUG-R1-03
15 DELETE job(冒烟任务清理) 204 TC-BIO-API-037

3. 缺陷清单(BUG-R1 系列)

编号 级别 TC 归属 agent 现象 预期 证据路径
BUG-R1-01 阻断 TC-BIO-API-021/022、TC-BIO-FLOW-001/002 反代功能、FlowProgressCard 改参数重跑 A2 BFF 反代非 SSE 大响应体 502:bioflow_proxy.py _proxy 在 async with httpx.AsyncClient 退出后才调用 upstream.aread();生产事件循环(uvicorn+uvloop)下大响应体(全量 catalog 55,905B)连接已随 client 关闭,抛 httpx.ReadError → 502「生信服务响应中断」信封。小响应体(health 80B / jobs 65B / catalog?stage 2,607B)因首读已缓冲而幸存。实测:经 8090 全量 catalog 5/5 次 502(直连 8098 稳定 200);生产入口浏览器 fetch 同样 502。影响:catalog 类接口经反代不可用;FlowProgressCard 改参数重跑 schema 加载全部降级为空表单 反代后 200 且响应体=直连 /home/xzq/5090/teamWorkspace/zh/t2_work/evidence/uvloop_probe.py(100% 复现)、bff.log.sample、prod_l5.spec.js、repro2.py
BUG-R1-02 一般 TC-BIO-API-021/022 T1(用例修订)/TL 裁决 catalog 阶段总数 75 ≠ 用例预期 73;gene_family 链 21 ≠ 用例预期 18。实现由 stage_image_map.json v2.0.0(A1 交付、TL 认可的事实源)驱动,含 genome_prepare/identify_refine/karyotype/pep/ortholog/kaks/ppi 等扩展阶段。用例按 dev 旧树 73/18 冻结 用例期望与权威数据一致 curl 实测:GET :8098/api/bioflow/catalog = 75 阶段;chain=gene_family = 21 阶段;map json stages=75/family_chain=21
BUG-R1-03 严重 TC-BIO-API-012、TC-BIO-FLOW-009、TC-BIO-SMOKE-017 A4(P6 接入)/A2(部署接线) 已部署 8098 的 ask 与 chat/stream flow_qa 引用块恒空(citations=[]、degraded=true)。根因:init_flow_store 已实现(vstore 缺失/失败降级 None),但生产启动链未接线——init_context→build_context 不传 flow_store,恒 None。flow_docs 724 块已在 vstore/data/flow_docs 且手动实例化 FlowStore 检索 8 hits 正常,证明库与检索器完好,仅服务未挂载 答案含引用块(来源文件+章节);L2 测试以注入 FakeFlowStore 通过,部署态失效 curl 实测 ask/chat-stream 响应 citations=[];context.py init_flow_store 全库 grep 无调用点(仅定义)
BUG-R1-04 一般 TC-BIO-SSE-022/030、TC-BIO-API-017 A2 events.py snapshot() 对 job_created 载荷的 stages 元素直接 str(s):当 s 为 dict(runner 发布的 {stage, status} 对象)时,快照首帧出现 stage 字段为 dict repr 串的脏结构。前端 applySnapshot/patchBioflowSnapshot 以 s.stage 为键 → 进度卡出现乱串阶段名,直到后续回放事件覆盖。单测 test_events.py 用字符串列表 stages 未触发 快照 stages 逐阶段为干净 {stage, status} 结构 curl 实测两任务 events 首帧(冒烟任务 ec00c7ed…/470bfdc9…);events.py snapshot() 对 job_created stages 的 str() 处理
BUG-R1-05 轻微 TC-BIO-INTENT-044 A2/A3(实现)或 T1(用例修订)/TL 裁决 「换玉米,重跑」(会话上文已有生信任务)返回 qa。实现无交互式补充目标对象机制;且冻结词典(唯一事实源)未含交互式补充规则,实现与词典一致 返回 bioflow 且目标对象=玉米 脚本实测 route("换玉米,重跑")=qa;intent.py 全库 grep 无交互式补充逻辑

4. 上轮缺陷修复确认表(BUG-R0 系列——TL 部署期修复,commit 35bf688)

BUG 编号 内容 是否修复 本轮复测证据
BUG-R0-1 context 值导入脱钩:init_context 重绑定,路由层动态取模块全局 已修复 8098 health 200 且 db.connected=true;jobs/ask/catalog/chat-stream 直连全部正常路由(本报告 §2.4 直连侧全通)
BUG-R0-2 BFF 反代非 SSE 透传 bytes 500(改纯透传 Response) 已修复(同时暴露新缺陷) 小响应体经反代 200 且响应体=直连(health 80B / jobs 65B / catalog?stage 2,607B ×5 次稳定);但大响应体在修复后的同一函数另一分支(aread 在 client 退出后)触发 httpx.ReadError → 502,记为 BUG-R1-01

5. 遗留问题与风险

  1. L5 生信 E2E 无仓库 spec:tests/e2e/ 仅有既有 RAG 9 个 spec;TC-BIO-E2E 108 条(九主线×三档)无 Playwright 落地。本轮以 curl 端到端(15 项)+ 2 个 /tmp 临时 spec(dev/生产入口 TAB 显隐+探活)等价覆盖关键冒烟。建议下轮起按主线逐条落 spec。
  2. UI 动作矩阵 vitest 显式覆盖 45/95:未显式覆盖 50 条:ACT-001,004,006,009,013,014,015,018,019,022,023,024,025,026,028,029,030,033,035,041,042,046,047,049,053,054,055,056,057,059,060,061,062,065,066,069,071,072,073,074,075,078,081,082,086,089,091,092,093,095。其中多为悬停/视觉态(CSS 断言类)与次要键盘态,部分语义被相近用例以行为断言覆盖但未标注编号。建议 A3 按 §10.3 补齐标注或补测试。
  3. 行覆盖率双辅门禁未达标:后端 79%(低点:params.py 0%、llm.py 23%、reports.py 63%、kernel.py 75%、bioflow.py 71%、biojobs.py 77%);前端 75.93%。本轮仅报告不达标,不视为缺陷派发。
  4. 探活显隐 E2E 未执行:TC-BIO-E2E-06 需停/启 8098(TL 部署的在用服务),按纪律不触碰;以 L4 panes 测试「探活失败 TAB 不渲染/恢复显示」(pass)与真实 health 探活冒烟替代。
  5. SSE 心跳保活(TC-BIO-API-080)未定量验证:代码含 KEEPALIVE_INTERVAL 注释帧机制;8 秒观察窗口内首帧+回放正常但未跨足 2×心跳间隔定量断言。
  6. 仓库未跟踪文件:bioflow_service/bioflow.log(8098 运行日志,TL 部署产物)与 bioflow_data/(运行数据)位于仓库树内,建议 TL 加 .gitignore。
  7. 报告路径说明:本报告落 docs/team/report_bioflow_test2.md(与 T1 的 report_bioflow_test1.md 并列)。任务书写作 docs/TEST_REPORT_R1.md,但该文件已存在(RAG M1 轮测试报告,2026-08-25),为避免覆盖既有文档未写入,请 TL 裁决是否需要移动/合并。

6. 红线核验(终验前置项)

项 结果
git diff(modes.js / labels.js / bench.js / qa.js / parser.js / PipelineCard.vue) 空(git diff --stat HEAD -- 六文件 无输出)
整个仓库工作树 仅未跟踪运行日志 bioflow_service/bioflow.log(非产品代码;T2 冒烟产生的 coverage 产物已清理)
QA 金标树 8091 /health = 1.1.73-assertion-anchored(gate_policy legacy),版本未变
PlantAI-dev 只读移植源 未写入
不 commit / 不 push 遵守(本报告与证据脚本均为未跟踪文件,交 TL 处理)

7. 证据归档

服务器 /home/xzq/5090/teamWorkspace/zh/t2_work/evidence/:

  • uvloop_probe.py —— BUG-R1-01 100% 复现脚本(真实 _proxy + uvloop + ASGITransport)
  • bff.log.sample —— BFF 日志采样(httpx 上游 200 但 BFF 502 序列)
  • prod_l5.spec.js —— 生产入口 Playwright 证据(TAB 可见 pass + catalog 502 fail)
  • bioflow_l5.spec.js —— dev 链路探活冒烟 spec
  • intent_dual_be.py / intent_extra.py —— 意图分流 40 表 + 附加边界双跑脚本
  • repro2.py —— 同代码形态 aread 在 client 上下文内成功(对照组)

R2 复测轮(2026-09-06,全量回归)

被测版本:d3110c4(fix: R1 缺陷修复)+ a3142d2(TL 用例修订)。BFF/8098 均已由 TL 重启部署;8091 QA 金标未动。

R2-1 分层执行结果(全量)

层 总数 Pass Fail Skip 说明
L1 生信单元(-m bioflow_unit) 131 131 0 0 新增 test_context_wiring.py 3 用例 + test_events.py snapshot dict 回归用例(R1 时 127)
L2 生信接口(-m bioflow_api) 39 39 0 0 与 R1 一致
后端全量 170 170 0 0 pytest tests/ -q 170 passed(与 TL 复测一致)
前端全量(vitest) 373 373 0 0 27 文件,与 R1 一致
意图双跑(词典 40 用例表) 80 80 0 0 前端 40/40 + 后端 40/40 MATCH
INTENT-044(修订后期望 qa) 1 1 0 0 route("换玉米,重跑")=qa,与修订后期望一致
L5 Playwright 既有 E2E 冒烟 6 6 0 0 smoke.spec 三档视口
L5 生产入口 spec(/tmp) 1 1 0 0 TAB 可见 + catalog 经反代 200(R1 时该断言 502 fail)
L5 curl 端到端(重点复测 + 常规冒烟) 14 14 0 0 明细 R2-2
L2s 金标冒烟 1 1 0 0 GOLDEN_DIFF_OK 24 IDs、diff 空、SMOKE DONE、exit 0

R2-2 L5 curl 端到端明细(重点复测项加粗)

# 端点 结果 对应 TC
1 GET 8090 /api/bioflow/catalog ×5(BUG-R1-01) 200 + 55905B ×5/5(R1 时 502 ×5/5) TC-BIO-API-021
2 uvloop_probe 证据脚本复跑(BUG-R1-01) catalog #0-#2 全部 200 + bodylen=55905(R1 时 502) 证据脚本留证
3 POST 8090 /api/bioflow/ask(BUG-R1-03) ok=true;citations=8(stage_contract 源,cite anchor+line 齐全);degraded=false TC-BIO-API-012
4 POST 8090 /api/bioflow/chat/stream flow_qa ctx=true(BUG-R1-03) message_done kind=flow_qa;citations[] 含 title_path/path/cite/line/text 原文 TC-BIO-API-012
5 GET 8090 jobs/{id}/events 首帧(BUG-R1-04) snapshot stages=[{"stage":"identify","status":"await_files"}] 干净结构,无 dict repr 串 TC-BIO-SSE-022/030
6 GET 8090 catalog 阶段数(BUG-R1-02 修订后) 75 阶段;?chain=gene_family 21 项,均与 stage_image_map.json v2.0.0 逐数一致 TC-BIO-API-021/022(修订后)
7 GET 8090/8098 health 200 响应体一致 TC-BIO-API-099/100
8 GET 8090 jobs 200 空列表 TC-BIO-API-032
9 POST jobs 空 stages 422 TC-BIO-API-028
10 POST jobs 未知阶段 422 UNKNOWN_STAGE TC-BIO-API-030
11 POST jobs 合法创建 + DELETE 201 created / 204(未 confirm 未触发 docker) TC-BIO-API-027/037
12 POST chat/stream 非生信句 message_done kind=qa(不建任务) TC-BIO-API-005
13 POST chat/stream 空 message 422 TC-BIO-API-006
14 生产入口 Playwright(8090 静态托管) TAB 可见 + 页面内 fetch catalog 200 TC-BIO-SMOKE-003 / TC-BIO-DEPLOY-007

R2-3 上轮缺陷修复确认表(BUG-R1 五项逐一复测)

BUG 编号 级别 修复方式(commit) 是否修复 R2 复测结论
BUG-R1-01 阻断 d3110c4:bioflow_proxy.py 手工管理 client 生命周期(非 SSE 在 client 存活期内 aread;SSE finally 中 aclose) 已修复 curl 反代 catalog 5/5 次 200+55905B(修复前 5/5 502);uvloop_probe 证据脚本复跑 3/3 200+55905B;生产入口 Playwright fetch 200;部署树与仓库 proxy 一致
BUG-R1-02 一般 a3142d2:用例期望修订为与 stage_image_map.json v2.0.0 权威数据一致(75/21) 已修复(用例修订) 复测按修订后期望判定:catalog 75 阶段、gf 链 21 项,与 map 逐数一致;TEST_CASES.md 已加修订记录节
BUG-R1-03 严重 d3110c4:init_context 接线 init_flow_store(flow_store 启动挂载) 已修复 经 8090 反代 ask 返回 8 条引用块(stage_contract 源、cite anchor 齐全、degraded=false);chat/stream flow_qa 同证;新增 3 条回归用例(test_context_wiring.py)锁定
BUG-R1-04 一般 d3110c4:events.py 增 _stage_key/_stage_entry(job_created stages dict 保真透传) 已修复 真实任务 events 首帧 snapshot stages 干净 {stage, status};test_snapshot_dict_stages_clean 锁定(含 dict 形态 fixture)
BUG-R1-05 轻微 a3142d2:用例期望修订为 qa(与冻结词典一致,交互式补充转 P7) 已修复(用例修订) route("换玉米,重跑")=qa,与修订后期望一致

R2-4 R2 新缺陷

无。R2 全量回归未发现新缺陷(后端 170/前端 373/双跑 80/E2E 7/curl 14/金标 1 全绿)。

生信缺陷清零。

R2-5 遗留问题更新(对照 R1 §5)

# R1 遗留 R2 状态
1 L5 生信 E2E 无仓库 spec 未变(仍以 curl+临时 spec 覆盖;建议下轮起落 TC-BIO-E2E)
2 UI 动作矩阵 vitest 显式覆盖 45/95 未变(其余多为 CSS 视觉态,部分语义被行为断言覆盖未标注)
3 行覆盖率后端 79% / 前端 75.93% 双辅门禁未达标 未变(仅报告,不派发)
4 探活显隐 E2E(需停 8098)未执行 未变(纪律不触碰在用服务;L4 panes 测试 + health 冒烟替代)
5 SSE 心跳跨足 2×间隔定量验证 未变
6 bioflow.log 未跟踪文件 已解决(TL 在 a3142d2 加 .gitignore)
7 报告路径(docs/team/ vs docs/TEST_REPORT_R1.md 既有文件) 已解决(TL 已采纳 docs/team/report_bioflow_test2.md 并入库)

R2-6 红线核验

项 结果
git diff(modes.js / labels.js / bench.js / qa.js / parser.js / PipelineCard.vue) 空
工作树未跟踪文件 无(.gitignore 已覆盖 bioflow.log;T2 测试产物已清理)
QA 金标 8091 /health = 1.1.73-assertion-anchored(gate_policy legacy),版本未变
不 commit / 不 push 遵守(本 R2 节为未跟踪追加,交 TL 入库)