19 KiB
19 KiB
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. 遗留问题与风险
- L5 生信 E2E 无仓库 spec:tests/e2e/ 仅有既有 RAG 9 个 spec;TC-BIO-E2E 108 条(九主线×三档)无 Playwright 落地。本轮以 curl 端到端(15 项)+ 2 个 /tmp 临时 spec(dev/生产入口 TAB 显隐+探活)等价覆盖关键冒烟。建议下轮起按主线逐条落 spec。
- 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 补齐标注或补测试。
- 行覆盖率双辅门禁未达标:后端 79%(低点:params.py 0%、llm.py 23%、reports.py 63%、kernel.py 75%、bioflow.py 71%、biojobs.py 77%);前端 75.93%。本轮仅报告不达标,不视为缺陷派发。
- 探活显隐 E2E 未执行:TC-BIO-E2E-06 需停/启 8098(TL 部署的在用服务),按纪律不触碰;以 L4 panes 测试「探活失败 TAB 不渲染/恢复显示」(pass)与真实 health 探活冒烟替代。
- SSE 心跳保活(TC-BIO-API-080)未定量验证:代码含 KEEPALIVE_INTERVAL 注释帧机制;8 秒观察窗口内首帧+回放正常但未跨足 2×心跳间隔定量断言。
- 仓库未跟踪文件:bioflow_service/bioflow.log(8098 运行日志,TL 部署产物)与 bioflow_data/(运行数据)位于仓库树内,建议 TL 加 .gitignore。
- 报告路径说明:本报告落 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 入库) |