Files
Pre_Seg_Server/doc/09-test-plan.md
admin 4c21de02f8 feat: 完善标注删除、AI 框选与视频传播交互
功能增加:

- 在工作区增加按范围传播和传播全部可达入口,支持选中区域或当前帧全部 mask 作为 seed,并按前后帧范围调用 SAM2 传播后刷新已保存标注。

- 在 AI 智能分割中接入框选提示,支持 box prompt 以及 box + 正/反向点的 interactive prompt 细化流程。

- 在 AI 智能分割中增加提示点删除、最近锚点删除、清空锚点、选中 AI 候选删除和 Delete/Backspace 快捷删除。

- 在项目库删除项目后同步清理当前项目、帧、mask 与选区状态,避免删除后工作区残留旧数据。

- 将时间进度条上的已编辑帧提示改为覆盖在进度条上的琥珀色竖线,并保留已编辑帧计数。

- 将 AI 参数文案调整为局部专注模式(自动裁剪无锚区域)和严格除杂模式(自动清理干涉点),仅改善可读性,不改变内部字段。

Bugfix:

- 修复 AI 框选工具无实际 prompt 输出的问题。

- 修复多次执行 AI 高精度语义分割时旧候选 mask 叠加显示的问题,改为替换本页 AI 候选。

- 修复删除 AI 候选后选区仍引用已删除 mask 的状态残留。

- 修复进度条当前帧提示与已编辑帧提示颜色/语义混淆的问题,当前帧继续由播放进度和缩略图高亮表达。

测试与文档:

- 补充 AI 分割框选、候选替换、提示点删除和快捷删除相关测试。

- 补充工作区传播范围、传播全部可达、编辑区域删除和项目删除状态清理测试。

- 更新 README、AGENTS 和 doc 下需求冻结、设计冻结、接口契约、前端审计、实施计划、测试计划,记录当前真实功能和测试覆盖。
2026-05-02 00:56:13 +08:00

11 KiB
Raw Blame History

当前测试计划

本文档把 doc/07-current-requirements-freeze.md 中的冻结需求映射到测试。测试目标是覆盖当前真实行为和明确占位行为。

测试分层

层级 工具 覆盖范围
前端单元/组件 Vitest + Testing Library API 封装、store、组件交互、Mock/UI-only 状态
后端路由 pytest + FastAPI TestClient Auth、Projects、Templates、AI、Export、Media 的接口契约
静态契约 TypeScript / py_compile 类型和 Python 语法

覆盖矩阵

需求 测试文件 覆盖点
R1 登录与会话 src/components/Login.test.tsx, backend/tests/test_auth.py 成功登录、失败提示、后端 401
R2 项目管理 src/lib/api.test.ts, src/components/ProjectLibrary.test.tsx, backend/tests/test_projects.py 前端字段映射、PATCH 更新、项目卡片删除、DELETE 契约、后端 CRUD、删除级联、帧列表
R3 媒体上传与拆帧 src/components/ProjectLibrary.test.tsx, backend/tests/test_media.py, backend/tests/test_tasks.py 视频导入不自动拆帧、显式生成帧 FPS 选择、扩展名校验、自动建项目、关联项目、创建异步任务、标准帧序列参数、帧时间戳/源帧号、任务序列元数据、worker 注册帧、取消任务、重试任务、取消后 worker 停止
R4 工作区与帧浏览 src/components/VideoWorkspace.test.tsx, src/components/FrameTimeline.test.tsx 加载帧、无帧项目不自动解析并提示生成帧、回显已保存标注时保留本地未保存 draft mask、缩略图/range/已编辑帧进度条竖线标记、当前帧由进度条末端和缩略图高亮表达/左右方向键切帧、播放、按项目 FPS 显示当前/总时长
R5 工具栏 src/components/ToolsPalette.test.tsx, src/components/CanvasArea.test.tsx, src/store/useStore.test.ts 工具切换、调整多边形工具、AI 跳转、矩形/圆/线/点/多边形手工 mask 绘制、点工具在已有 mask 上落点、多边形 Enter/首节点闭合、polygon 顶点拖动/删除、边中点插点、双击边界按位置插点、整块 mask 删除、区域合并/去除、内含去除 hole 渲染、合并模式隐藏编辑手柄、工作区 SAM 提示点点击删除且不冒泡新增点、撤销/重做历史栈
R6 AI 推理 src/lib/api.test.ts, src/components/CanvasArea.test.tsx, src/components/AISegmentation.test.tsx, src/components/VideoWorkspace.test.tsx, src/components/ModelStatusBadge.test.tsx, backend/tests/test_ai.py, backend/tests/test_sam2_engine.py SAM 2.1 变体选择、点/框/interactive 契约、semantic 禁用、SAM 3 入口隐藏和后端拒绝、SAM 2.1 最高分候选去重、SAM 2.1 框选后正负点细化同一候选 mask、AI 页框选发送 box prompt、AI 页框选后加点发送 interactive prompt、AI 页重复执行替换旧候选、SAM 2.1 反向点启用背景过滤且空结果移除旧候选、AI 页不渲染工作区已有 mask、AI 页可在候选 mask 上继续添加正/反点、AI 页可单点删除提示点并删除最近锚点、AI 页可删除选中候选且不删除工作区 mask、AI 页清空只移除本页候选、AI 页参数开关可读性文案且 options 字段不变、AI 页遮罩清晰度只改预览 opacity、AI 页生成 mask 自动选中并可通过分类树换标签、AI 页推送到工作区编辑保留选择、SAM 2.1 视频按选中/全量 seed 和起止帧范围传播、传播全部可达、空提示/空结果反馈、GPU/SAM2.1 状态、AI 参数 options、局部裁剪推理、背景过滤、状态徽标、坐标归一化、正负点 labels、polygons 转 path、后端 fake registry
R7 标注保存 src/components/VideoWorkspace.test.tsx, src/components/CanvasArea.test.tsx, src/lib/api.test.ts, backend/tests/test_ai.py 保存标注、保存后用后端 saved annotation 替换已提交 draft、加载回显、更新 dirty 标注、清空删除已保存标注、GT mask 多类别导入、seed point 回显/归一化、项目不存在、帧不存在
R8 模板库 src/components/TemplateRegistry.test.tsx, src/lib/api.test.ts, backend/tests/test_templates.py 前端模板加载/新建/编辑/删除、JSON 分类导入、mapping_rules 解包/打包、后端模板 CRUD
R9 本体检查面板 src/components/OntologyInspector.test.tsx, src/components/CanvasArea.test.tsx, src/store/useStore.test.ts 模板选择、分类展示、具体分类选择、Canvas 选区同步、点击分类给已选 mask 换标签、自定义分类本地添加
R10 Dashboard 与 WebSocket src/lib/api.test.ts, src/lib/websocket.test.ts, src/components/Dashboard.test.tsx, backend/tests/test_dashboard.py, backend/tests/test_main.py, backend/tests/test_progress_events.py, backend/tests/test_tasks.py 后端概览接口、任务表驱动进度区、最近完成任务保留显示、任务取消/重试/详情、cancelled 事件、Redis 进度事件 payload/发布、地址推导、消息订阅、连接状态回调、队列更新、heartbeat
R11 导出 src/components/VideoWorkspace.test.tsx, src/lib/api.test.ts, backend/tests/test_export.py COCO/PNG 按钮下载、导出前自动保存、导出路径、JSON 结构、mask ZIP、zIndex 语义融合
R12 配置 src/lib/config.test.ts env 优先、hostname 推导、WS 推导
R13 文档与测试 doc/09-test-plan.md 测试覆盖矩阵

逐功能点追踪

需求 功能点 对应测试 当前状态
R1 登录页、默认开发凭证、token 写入、失败提示、后端 401 Login.test.tsx, test_auth.py 已覆盖
R2 项目列表/创建/选择、视频导入、DICOM 导入、后端项目和帧 CRUD ProjectLibrary.test.tsx, api.test.ts, test_projects.py 已覆盖
R3 文件类型校验、自动/指定项目上传、视频导入与生成帧分离、显式 FPS 生成帧、视频/DICOM 拆帧任务、parse_fps/max_frames/target_width、标准帧序列 metadata、任务查询、取消、重试、worker 取消停止 ProjectLibrary.test.tsx, test_media.py, test_tasks.py 已覆盖
R4 工作区加载帧、无帧项目不自动解析、后端标注回显保留本地未保存 draft mask、Canvas 底图、缩略图/range/已编辑帧进度条竖线标记、当前帧由进度条末端和缩略图高亮表达/左右方向键切帧、播放、按 FPS 显示时间 VideoWorkspace.test.tsx, FrameTimeline.test.tsx, CanvasArea.test.tsx 已覆盖
R5 工具切换、调整多边形入口、AI 跳转、矩形/圆/线/点/多边形绘制、已有 mask 上继续绘制 ToolsPalette.test.tsx, CanvasArea.test.tsx 已覆盖
R5 顶点编辑、边中点插点、双击边界按位置插点、顶点删除、整块删除、工作区 SAM 提示点删除优先级、撤销/重做、区域合并、区域去除、hole even-odd 渲染 CanvasArea.test.tsx, useStore.test.ts 已覆盖
R6 SAM 2.1 变体选择、点/框/interactive、semantic 禁用、SAM 3 入口隐藏和后端拒绝、SAM 2.1 最高分候选去重、AI 页框选/框选后加点、AI 页重复执行替换旧候选、AI 页不渲染工作区已有 mask、AI 页可在候选 mask 上继续添加正/反点、AI 页可删除提示点、AI 页可删除选中候选、AI 页清空只移除本页候选、AI 页遮罩清晰度只改预览 opacity、AI 页生成 mask 自动选中并可换标签、AI 页推送到工作区编辑保留选择、SAM 2.1 视频按范围/全部可达传播、GPU/模型状态、参数 options、polygons 转 mask api.test.ts, CanvasArea.test.tsx, AISegmentation.test.tsx, VideoWorkspace.test.tsx, ModelStatusBadge.test.tsx, test_ai.py, test_sam2_engine.py 已覆盖
R7 保存、保存后替换已提交 draft、查询、更新、删除标注、工作区回显、清空已保存标注、GT mask 导入和 seed point 回写 VideoWorkspace.test.tsx, CanvasArea.test.tsx, api.test.ts, test_ai.py 已覆盖
R8 模板加载、新建、编辑、删除、JSON 分类导入、mapping_rules 映射、后端 CRUD TemplateRegistry.test.tsx, api.test.ts, test_templates.py 已覆盖
R9 模板选择、分类展示、分类选择、已选 mask 换标签、自定义本地分类、占位状态 OntologyInspector.test.tsx, CanvasArea.test.tsx, useStore.test.ts 已覆盖
R10 Dashboard 概览、任务进度区、最近完成任务保留显示、活动日志、WebSocket progress/complete/error/status/cancelled、取消/重试/详情、连接状态回调、heartbeat Dashboard.test.tsx, websocket.test.ts, test_dashboard.py, test_main.py, test_progress_events.py, test_tasks.py 已覆盖
R11 COCO/PNG ZIP 导出、导出前保存、路径和 JSON/ZIP 结构、zIndex 融合 VideoWorkspace.test.tsx, api.test.ts, test_export.py 已覆盖
R12 API/WS 地址 env 优先和 hostname 推导 config.test.ts 已覆盖
R13 文档测试矩阵与功能点追踪 doc/09-test-plan.md 已覆盖

本轮补齐记录

  • R5补充 CanvasArea.test.tsx 中圆形和线段手工绘制测试,明确验证 metadata、segmentation、bbox/area 和草稿状态。
  • R6补充 AISegmentation.test.tsx 中 SAM 2.1 变体选择测试,验证前端不展示 SAM 3 入口、选择 small 后请求携带对应模型,且未放置点提示时不发起推理。
  • R6补充 SAM 2 纯文本提示拦截、SAM 2 多候选只保留最高分、SAM 2 engine 单候选请求测试,避免多个重叠候选 mask 被同时叠加。
  • R6补充 Canvas 工作区 SAM 2 反向点背景过滤测试,覆盖请求 options 和过滤为空时清除旧候选 mask。
  • R6补充 ModelStatusBadge.test.tsx 中 SAM 3 不展示测试,避免禁用入口重新出现在前端。
  • R6补充后端 selected_model=sam3 拒绝测试和 semantic 禁用测试,避免后端继续暴露 SAM 3 产品能力。
  • R6补充 POST /api/ai/propagate 后端测试,验证 seed mask 传播结果会保存为后续帧标注并保留 class 元数据。
  • R6补充 propagateMasks() API 封装和 VideoWorkspace 传播按钮测试,验证当前选中区域会发送到后端视频传播接口。
  • R6backend/tests/test_sam3_engine.py 已标记跳过,仅作为历史保留实现的参考测试,不计入当前产品功能覆盖。
  • R3补充 parseMedia() 查询参数和后端拆帧任务 payload 测试,验证 parse_fpsmax_framestarget_width 会进入任务。
  • R3补充 worker 注册标准帧序列测试,验证帧 timestamp_mssource_frame_numberresult.frame_sequence 元数据。
  • R8补充 TemplateRegistry.test.tsx 中模板编辑、删除测试,验证前端调用真实 API 封装并更新全局 store。
  • R9补充 Canvas 选中 mask id 全局同步、本体树点击分类给已选 mask 换标签的测试,验证已保存 mask 会进入 dirty 状态。

运行命令

npm run test
npm run test:run
npm run lint
npm run build

pip install -r backend/requirements-dev.txt
pytest backend/tests
python -m py_compile backend/routers/ai.py backend/routers/templates.py backend/schemas.py

当前不做的测试

  • 不启动真实 PostgreSQL、MinIO、Redis 或 SAM 模型。
  • 不做真实视频大文件拆帧性能测试。
  • 不用浏览器 E2E 验证视觉细节。
  • 不把当前明确 Mock/UI-only 的按钮当成真实业务成功路径测试。