From a3142d2a05bc6eb2caad7fe62ce8fd329b271cf8 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 6 Sep 2026 08:18:20 +0800 Subject: [PATCH] =?UTF-8?q?test(bioflow):=20T2=20R1=20=E8=BD=AE=E6=AC=A1?= =?UTF-8?q?=E6=8A=A5=E5=91=8A+TL=20=E7=94=A8=E4=BE=8B=E4=BF=AE=E8=AE=A2?= =?UTF-8?q?=E2=80=94=E2=80=94catalog=20=E5=8F=A3=E5=BE=84=E4=B8=8E?= =?UTF-8?q?=E6=9D=83=E5=A8=81=E6=95=B0=E6=8D=AE=E4=B8=80=E8=87=B4(75/21)?= =?UTF-8?q?=E3=80=81INTENT-044=20=E4=BA=A4=E4=BA=92=E5=BC=8F=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E8=BD=AC=20P7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .gitignore | 1 + docs/TEST_CASES.md | 13 +++- docs/team/report_bioflow_test2.md | 121 ++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 docs/team/report_bioflow_test2.md diff --git a/.gitignore b/.gitignore index 471d3ea..95ed848 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ coverage/ .DS_Store tooling/build/ bioflow_data +bioflow_service/bioflow.log diff --git a/docs/TEST_CASES.md b/docs/TEST_CASES.md index 09a74ec..3046bff 100644 --- a/docs/TEST_CASES.md +++ b/docs/TEST_CASES.md @@ -729,7 +729,7 @@ mock server:`python sdk/mock/mock_server.py`(127.0.0.1:8099),场景经 | TC-BIO-INTENT-041 | FR-BIO-001 | 命中 RNA-seq | 无附件 | route("帮我跑水稻叶片 RNA-seq 差异表达分析") | 返回 bioflow | L3 | P0 | | TC-BIO-INTENT-042 | FR-BIO-001 | 命中 WGS | 无附件 | route("帮我做水稻全基因组变异检测") | 返回 bioflow | L3 | P1 | | TC-BIO-INTENT-043 | FR-BIO-001 | 命中 GWAS | 无附件 | route("帮我跑水稻产量性状 GWAS 关联分析") | 返回 bioflow | L3 | P1 | -| TC-BIO-INTENT-044 | FR-BIO-001 | 命中交互式补充:追问对象 | 会话上文为「帮我跑水稻 SPL 家族鉴定」已开任务 | route("换玉米,重跑") | 返回 bioflow 且目标对象=玉米 | L3 | P2 | +| TC-BIO-INTENT-044 | FR-BIO-001 | 交互式补充未命中(词典无此规则,漏判安全) | 会话上文为「帮我跑水稻 SPL 家族鉴定」已开任务 | route("换玉米,重跑") | 返回 qa(TL 2026-09-06 修订:与冻结词典一致;「换物种重跑」交互式补充转 P7 增强项) | L3 | P2 | | TC-BIO-INTENT-045 | FR-BIO-026 | 流程咨询在生信流内 | 会话已有生信任务 | route("identify 需要什么输入") | 返回 bioflow 内 flow_qa 路径(不新建任务) | L3 | P1 | | TC-BIO-INTENT-046 | FR-BIO-001 | 命中句不打乱 QA 流 | 无生信上下文 | 先 route("什么是 SPL 家族") 再 route("帮我跑水稻 SPL 家族鉴定") | 第 1 条=qa、第 2 条=bioflow,两者互不影响 | L3 | P2 | | TC-BIO-INTENT-047 | FR-BIO-001 | 词典同表后端一致性 | 后端 bioflow_service 已部署 | 后端对词典用例表 40+ 条输入逐一分流 | 后端判定结果与词典期望逐条一致(同表双跑) | L2 | P0 | @@ -758,8 +758,8 @@ mock server:`python sdk/mock/mock_server.py`(127.0.0.1:8099),场景经 | TC-BIO-API-018 | FR-BIO-001 | 事件包含 plan_ready 后必有确认点 | 候选路径选定 | 读事件序列 | 序列中出现 stage_await_confirm(或 plan_ready);事件顺序由 seq 严格递增 | L2 | P1 | | TC-BIO-API-019 | FR-BIO-001 | chat/stream 400 请求体非 JSON | 无 | POST body="not-json" Content-Type: application/json | 400 或 422 | L2 | P2 | | TC-BIO-API-020 | FR-BIO-001 | LLM 完全不可用 | mock LLM 连接拒绝 | 读流至第 1 个事件 | 事件 data 含 code=PLAN_UNAVAILABLE;SSE 关闭;无 job 落库 | L2 | P1 | -| TC-BIO-API-021 | FR-BIO-002 | catalog 返回 73 阶段 | 服务正常 | GET /api/bioflow/catalog | 200;data.stages 数组 length=73;每项含 name/description/params/inputs/outputs | L2 | P0 | -| TC-BIO-API-022 | FR-BIO-002 | catalog 基因家族链 18 阶段 | 无 | GET /api/bioflow/catalog?chain=gene_family | 200;返回 18 项;name 集合与 stage_image_map 的 gf 链一致 | L2 | P0 | +| TC-BIO-API-021 | FR-BIO-002 | catalog 返回全部阶段(与权威数据一致) | 服务正常 | GET /api/bioflow/catalog | 200;data.stages 数组 length 与 bioflow_kernel/stage_image_map.json v2.0.0 的 stages 数一致(TL 2026-09-06 修订:当前 75,原 73 为 dev 旧树口径);每项含 name/description/params/inputs/outputs | L2 | P0 | +| TC-BIO-API-022 | FR-BIO-002 | catalog 基因家族链全部阶段(与权威数据一致) | 无 | GET /api/bioflow/catalog?chain=gene_family | 200;返回项数与 stage_image_map.json 的 family_chain 一致(TL 2026-09-06 修订:当前 21,原 18 为 dev 旧树口径);name 集合与 family_chain 一致 | L2 | P0 | | TC-BIO-API-023 | FR-BIO-002 | catalog 参数 schema | 无 | GET /api/bioflow/catalog?stage=identify | 返回 identify 项;params[] 每项含 name/type/default/source/help;inputs 含 fasta/hmm 类 | L2 | P0 | | TC-BIO-API-024 | FR-BIO-002 | catalog 未知阶段 404 | 无 | GET /api/bioflow/catalog?stage=nope | 404 信封 code=NOT_FOUND | L2 | P1 | | TC-BIO-API-025 | FR-BIO-002 | catalog 镜像映射字段 | 无 | GET /api/bioflow/catalog?stage=identify | 该项 image 字段=bioflow-gf(与 stage_image_map.json 一致) | L2 | P1 | @@ -1566,3 +1566,10 @@ mock server:`python sdk/mock/mock_server.py`(127.0.0.1:8099),场景经 | FR-BIO-032 | KERN-012,013,021~023; GOLD-004~010,013~015; SMOKE-019,020 | > 覆盖自核:32/32 FR-BIO 全部有 TC 引用;每个 TC-BIO 均映射至少 1 个 FR(见每行「对应 FR」列);无孤儿 TC。模块计数与规模门禁见 docs/team/report_bioflow_test1.md。 + +## 用例修订记录 + +| 日期 | 修订 | 原因 | +|---|---|---| +| 2026-09-06 | TC-BIO-API-021/022 期望 73/18 → 与 stage_image_map.json v2.0.0 权威数据一致(75/21) | BUG-R1-02:实现以 A1 交付物为事实源,用例按 dev 旧树冻结属口径过期 | +| 2026-09-06 | TC-BIO-INTENT-044 期望 bioflow+目标对象 → qa | BUG-R1-05:冻结词典无交互式补充规则,实现与词典一致;「换物种重跑」交互式补充转 P7 扩展加固期实现(新 FR 追加后补 TC) | diff --git a/docs/team/report_bioflow_test2.md b/docs/team/report_bioflow_test2.md new file mode 100644 index 0000000..2871151 --- /dev/null +++ b/docs/team/report_bioflow_test2.md @@ -0,0 +1,121 @@ +# 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 上下文内成功(对照组)