功能新增: - 新增 POST /api/ai/analyze-mask 后端接口,基于 mask polygon、bbox、points 和 score 返回置信度来源、面积、拓扑锚点和后端分析提示。 - 前端新增 analyzeMask API 封装,并在本体检查面板读取选中 mask 的后端几何属性和重新提取拓扑锚点结果。 - 右侧语义分类树点击分类时,会给当前选中 mask 换标签、更新 class 元数据,并将选中 mask 移到前端渲染最上层,方便继续编辑。 - 分割工作区画布新增上下文操作提示,覆盖多边形 Enter 完成、Esc 取消、首节点闭合、拖拽图形、点区域、SAM 点/框提示、区域合并/去除选择顺序和多边形编辑。 - AI 智能分割画布新增正向点、反向点、边界框选和视口控制的上下文提示。 - 自动传播交互收敛为参考帧加起止帧范围加单个“自动传播”按钮,默认使用当前参考帧全部 mask 作为 seed。 - 时间轴改为用浅蓝色进度条区段标记自动传播生成的帧,而不是已编辑帧竖线提示。 Bugfix: - AI 分割页无当前帧时移除外部演示背景图,改为明确空状态提示,避免误以为外部图片可参与真实推理。 - 工具栏魔法棒文案改为“打开 AI 智能分割”,避免误导为直接触发 SAM 推理。 - Canvas 底部当前图层信息改为显示真实选中 mask 标签和 annotation id,不再使用固定占位文本。 - 已保存标注回显时保留 mask metadata 中的传播来源、score 等字段,供时间轴和属性面板识别。 - 清理 server.ts 中遗留的 /api/login、/api/projects、/api/templates 内存 mock API,避免和 FastAPI 真实后端混淆。 测试: - 补充 analyze-mask 后端测试,覆盖后端几何属性和锚点返回。 - 补充 api.analyzeMask 前端契约测试,覆盖 normalized polygon、bbox、points 和 extract_skeleton payload。 - 补充本体面板测试,覆盖后端属性读取、自定义分类写回后端模板、选中 mask 换标签和置顶显示。 - 补充 Canvas 测试,覆盖上下文提示、多边形完成提示、布尔选择顺序提示、当前图层真实显示和编辑优先级。 - 补充 AI 分割测试,覆盖无帧空状态和提示工具上下文提示。 - 更新 Konva 测试 mock,支持拖动过程、stroke/dash/fillRule 等渲染断言。 文档: - 更新 README 和 AGENTS,说明 server.ts 不再保留业务 mock API。 - 更新 doc/02、doc/03、doc/04、doc/05、doc/07、doc/08、doc/09,记录后端属性分析、分类置顶显示、上下文提示、自动传播按钮、传播帧标记、测试覆盖和当前剩余限制。
12 KiB
12 KiB
当前测试计划
本文档把 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/首节点闭合、上下文提示提示 Enter/Esc/首节点闭合、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 页提示工具上下文提示、AI 页重复执行替换旧候选、SAM 2.1 反向点启用背景过滤且空结果移除旧候选、AI 页不渲染工作区已有 mask、AI 页可在候选 mask 上继续添加正/反点、AI 页可单点删除提示点并删除最近锚点、AI 页可删除选中候选且不删除工作区 mask、AI 页清空只移除本页候选、AI 页参数开关可读性文案且 options 字段不变、AI 页遮罩清晰度只改预览 opacity、AI 页生成 mask 自动选中并可通过分类树换标签、AI 页推送到工作区编辑保留选择、SAM 2.1 视频以当前参考帧全部 mask 和起止帧范围自动传播、传播来源 metadata 回显、空提示/空结果反馈、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, backend/tests/test_ai.py |
模板选择、分类展示、具体分类选择、Canvas 选区同步、点击分类给已选 mask 换标签并移动到前端渲染最上层、自定义分类 PATCH 后端模板、选中 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 页重复执行替换旧候选、AI 页不渲染工作区已有 mask、AI 页可在候选 mask 上继续添加正/反点、AI 页可删除提示点、AI 页可删除选中候选、AI 页清空只移除本页候选、AI 页遮罩清晰度只改预览 opacity、AI 页生成 mask 自动选中并可换标签、AI 页推送到工作区编辑保留选择、SAM 2.1 视频按参考帧全部 mask 和范围自动传播、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, test_ai.py |
已覆盖 |
| 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自动传播按钮测试,验证当前参考帧全部 mask 会按范围发送到后端视频传播接口。 - R6:
backend/tests/test_sam3_engine.py已标记跳过,仅作为历史保留实现的参考测试,不计入当前产品功能覆盖。 - R3:补充
parseMedia()查询参数和后端拆帧任务 payload 测试,验证parse_fps、max_frames、target_width会进入任务。 - R3:补充 worker 注册标准帧序列测试,验证帧
timestamp_ms、source_frame_number和result.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 的按钮当成真实业务成功路径测试。