- Reference docs: known issues, user journey, location redesign, mission merge plan - Scripts: fill_location_state, merge_missions, migrate_location, migrate_state - Tests: e2e test suite, asset entries unit tests - Demo: location board, hifi prototypes, test screenshots - Data backup: asset log entries and state nodes - Update .gitignore Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
10 KiB
10 KiB
KSP 管理后台重构测试计划 v2
生成日期:2026-05-31
1. 项目与重构摘要
本项目是一个 Flask + SQLAlchemy 的 KSP 数据管理后台,数据来源包括引擎/通信/燃料箱/载具 Excel,以及任务资产日志。早期能力集中在数据中心:引擎目录、通信部件、燃料箱规格、载具成本、燃料换算和导入脚本。
draft_board.md 描述的重构重点是“任务运营”:
- 资产当前位置、当前任务、当前状态由
AssetLogEntry按simulation_time派生,不应直接编辑位置结果。 - 资产列表、任务总览、状态板、任务列表、时间线和地点板都应围绕同一套资产日志快照计算。
- 日志支持 state interval / event point,并支持 state nodes;节点应按时间排序。
- 对接关系应是时间敏感模型,需求中规划了
docking_events表,并要求已有资产对接时双向写入日志。 - 地点板应提供 Canvas 星图、天体层级导航、缩放/拖拽和 scope 面板。
- 时间线应提供只读时间轴、搜索、预设、类型/位置/状态/日期范围/资产选择等筛选。
- 数据中心保持现有结构,重构不应破坏 CRUD、筛选、排序和详情页。
当前实现与 draft_board.md 的明显差距:
- 模型和迁移中尚未实现
docking_events表;当前/api/v1/assets/<id>/dock只给当前资产新增一条 state 日志,没有真实父子对接关系、分离流程或双向日志。 - Location 仍是日志自由文本字段,尚未落成结构化层级选项。
- 地点板已接入 Canvas 和轨道数据,但当前模板使用程序绘制的渐变天体,没有使用
demo/textures/的真实纹理。 - 时间线模板渲染了筛选控件,但未发现
tlPreset、搜索/筛选控件事件处理脚本;这些控件需要被测试明确捕获。 - 资产详情日志搜索/类型筛选控件存在 DOM,但未发现对应前端过滤脚本。
2. 对现有 docs/test_plan.md 的评估
现有计划覆盖面大体方向正确,但不能直接作为验收依据:
- 文档称“12 个测试模块”,实际只写了 10 个模块。
- 大量断言只验证元素存在,例如按钮、表格、canvas,而没有验证数据来源、交互结果、URL 参数、数据库派生逻辑或副作用。
- 多个用例与当前实现不一致:日志编辑实际是跳转到编辑页,不是打开 modal;对接功能没有
docking_events;时间线筛选控件缺少脚本;地点板没有真实纹理切换。 - 测试脚本
tests/test_e2e.py只有 36 个轻量断言,且结果名称编码损坏;它没有执行关键 CRUD 写入、分离、双向日志、时间敏感对接、筛选功能有效性,也没有隔离数据库。 - 测试环境写“真实 PostgreSQL”,但计划包含新增/删除/对接写入,这会污染生产式数据。写入类测试必须切换到隔离测试库或事务回滚。
3. 测试策略
测试分三层执行。
A. 非破坏性冒烟回归
目标:确认服务可达、页面主结构存在、关键数据表可渲染、API 基本可用。
适用环境:当前真实 PostgreSQL 或只读数据环境。
执行方式:
- HTTP GET 页面检查。
- API GET/错误输入检查。
- 静态模板/脚本契约检查。
- 不新增、不编辑、不删除、不调用会持久写入的对接接口。
B. 浏览器交互回归
目标:确认 JS 交互真的工作,而不是只存在 DOM。
适用环境:可运行 Playwright/Browser 的本地环境。
执行方式:
- 点击主题切换、时间 modal、侧边栏、地点板 canvas、时间线筛选控件。
- 检查 URL、DOM、canvas 像素和 console error。
- 只执行不写库的交互,除非已切到测试库。
C. 写入与业务验收
目标:验证重构核心的业务正确性。
适用环境:隔离 PostgreSQL/SQLite 测试库,或每个测试事务回滚。
执行方式:
- 使用固定 fixture 创建资产、日志、节点、对接事件。
- 测试完成后清理或回滚。
- 严禁在真实数据环境直接执行新增/删除/对接/导入。
4. v2 测试矩阵
| 模块 | 优先级 | 用例 | 类型 | 预期 |
|---|---|---|---|---|
| 服务/API | P0 | /api/v1/health |
冒烟 | HTTP 200,status=ok,service 名正确 |
| 服务/API | P0 | 燃料列表 API | 冒烟 | 返回 8 个燃料因子 |
| 服务/API | P1 | 燃料换算 API mode=volume/mass |
冒烟 | 返回每种燃料的换算结果 |
| 服务/API | P1 | 燃料换算非法输入 | 冒烟 | HTTP 400,错误信息明确 |
| 基础框架 | P0 | 首页可达 | 冒烟 | HTTP 200,显示任务总览 |
| 基础框架 | P0 | 侧边栏 | 冒烟 | 显示任务运营、数据中心、燃料换算、API 健康检查 |
| 基础框架 | P1 | 主题切换 | 浏览器 | data-theme 在 dark/light 间切换,localStorage 持久化 |
| 基础框架 | P1 | 模拟时间 modal | 浏览器 | 可打开/关闭/ESC 关闭,Apply 后 URL 写入 sim_time |
| 任务总览 | P0 | 指标与状态板渲染 | 冒烟 | Tracked Assets / Active Missions / Upcoming / Status Board 存在 |
| 任务总览 | P1 | 模拟时间影响 | 业务 | 同一 fixture 在不同 sim_time 下派生状态和 upcoming 变化正确 |
| 资产列表 | P0 | /assets 可达 |
冒烟 | 表格有数据行,显示当前位置/当前事件/日志数 |
| 资产列表 | P0 | 搜索路由 | 冒烟 | q=ST-01 返回匹配资产 |
| 资产列表 | P1 | 类型/排序 | 浏览器 | 下拉改变后请求参数正确,结果排序/过滤正确 |
| 资产列表 | P1 | 退役资产默认隐藏 | 业务 | 默认不显示 retired,显式开关后显示 |
| 资产详情 | P0 | 从列表进入详情 | 冒烟 | 显示信息卡、Docking Target、Docked Vehicles、Log Entries |
| 资产详情 | P1 | 当前状态/位置派生 | 业务 | state interval 覆盖当前时间时取 active state;无 active 时取最近日志或 home_region |
| 资产详情 | P1 | 日志分页 | 浏览器 | 多页日志翻页后保留 sim_time |
| 资产详情 | P2 | 日志搜索/类型筛选 | 浏览器 | 输入/选择后列表实际收缩;若控件无脚本应失败 |
| 日志 CRUD | P0 | 新增 state interval | 写入 | 写入后列表出现,state nodes 按 at_time 升序 |
| 日志 CRUD | P0 | 新增 event point | 写入 | event 无 end/state/nodes 字段要求,保存后可见 |
| 日志 CRUD | P0 | 编辑日志页 | 写入 | GET 预填原值,POST 修改后持久化,失败时保留输入并显示 validation dialog |
| 日志 CRUD | P1 | 删除日志 | 写入 | 删除后 entries 计数减少,关联 nodes 级联删除 |
| 对接功能 | P0 | 需求级数据模型 | 静态/迁移 | 存在 docking_events 表和模型字段;当前应失败 |
| 对接功能 | P0 | 已有资产对接 | 写入 | parent/child 关系可按时间查询,双方日志/节点按需求写入 |
| 对接功能 | P0 | custom name 对接 | 写入 | 只影响当前 asset,保留 child_label |
| 对接功能 | P0 | 分离 | 写入 | undocked_at 写入,当前时间晚于分离时不再显示 docked |
| 状态板 | P0 | /mission-preview/status-board 可达 |
冒烟 | 显示状态分组、筛选栏、upcoming |
| 状态板 | P1 | 筛选 | 浏览器 | 资产类型/地点/记录范围筛选后卡片数量和 URL 参数正确 |
| 任务列表 | P1 | /missions 可达 |
冒烟 | 显示任务/日志聚合列表 |
| 任务列表 | P1 | 筛选 | 浏览器 | 类型/地点/记录范围筛选正确 |
| 地点板 | P0 | /mission-preview/location-board 可达 |
冒烟 | canvas、Scope、Assets in Scope、Ongoing Missions 存在 |
| 地点板 | P0 | canvas 非空 | 浏览器 | 截图或像素采样证明非空,console 无错误 |
| 地点板 | P1 | 层级导航 | 浏览器 | 点击 Jupiter 进入 Jupiter System,点击 Io 进入 Io,Back 返回 |
| 地点板 | P1 | 缩放/拖拽 | 浏览器 | wheel 改变缩放,拖拽改变视图偏移 |
| 地点板 | P1 | 资产 scope | 业务 | 不同 scope 下 Assets in Scope 与日志 location 派生一致 |
| 地点板 | P2 | 真实纹理 | 视觉/静态 | 使用真实纹理资源或明确降级;当前实现应标记未达 draft 目标 |
| 时间线 | P0 | /mission-preview/timeline 可达 |
冒烟 | 时间线行和刻度渲染 |
| 时间线 | P1 | scale 切换 | 浏览器 | Year/Month/Day 改变 URL 或刻度 |
| 时间线 | P1 | 搜索/类型/地点/状态筛选 | 浏览器 | 控件实际改变可见行;当前缺少脚本时应失败 |
| 时间线 | P1 | 日期范围 | 浏览器/业务 | 手动范围生效,segment 裁切百分比正确 |
| 数据中心 | P0 | 四个列表页 | 冒烟 | /engines /communications /tanks /vehicles 均 HTTP 200 且有数据 |
| 数据中心 | P1 | 筛选/排序 | 浏览器 | 查询参数生效,表格结果正确 |
| 数据中心 | P1 | CRUD | 写入 | 新增/编辑/删除后数据库一致,失败时 validation 明确 |
| 导入 | P1 | workbook inspect/import dry run | 业务 | 能识别表结构、自然键冲突、导入统计 |
| 可访问性/前端质量 | P1 | console error | 浏览器 | 主路径无 JS error |
| 可访问性/前端质量 | P2 | 响应式 | 视觉 | 1440x900、390x844 下无严重重叠 |
5. 自动化建议
- 保留一个
smoke套件:只读、可在真实库跑,覆盖 P0 冒烟项。 - 新增一个
e2e套件:Playwright + 测试库,覆盖 P1 浏览器交互。 - 新增一个
business套件:Flask test client + fixture + 事务回滚,覆盖日志派生、对接、时间敏感状态。 - 测试报告必须输出 Markdown 与机器可读 JSON;失败项保留 URL、参数、截图或最小复现步骤。
- 所有写入测试统一使用唯一前缀,例如
TEST_E2E_20260531_,并在 teardown 校验清理完成。
6. 本轮建议的验收门槛
- P0 冒烟:100% 通过。
- P0 业务:对接模型完成前允许标记为“未实现”,但不能误报通过。
- P1 浏览器交互:主路径无 console error,地点板 canvas 非空,时间线筛选可实际生效。
- 写入测试:只允许在隔离库执行;真实库环境下报告为 skipped,而不是 pass。