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

199 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 入库) |