7.9.0 QA 测试用例集:容器内 App 手动排序
1. 测试目标
验证用户可以在同一容器内拖动 App 改变显示顺序,并确保顺序在刷新、重启、语言切换、导入导出、恢复、SmartStart 等路径中保持一致,同时不破坏现有跨容器拖动改标签行为。
2. 测试范围
- 数据模型兼容性。
- 同容器拖动排序。
- 旧拖拽行为回归。
- 多显示模式和标签位置。
- 导入导出、恢复、重置、SmartStart。
- macOS 14 兼容性。
3. 测试环境
- macOS 14 Apple Silicon 真机。
- 当前开发机最新 macOS。
- 干净用户数据一份。
- 旧版
tags.json fixture 一份。
- 含多标签 App、未分类 App、Apple 内置 App、已卸载 path 的测试数据一份。
4. 自动化用例
| ID |
优先级 |
类型 |
用例 |
期望结果 |
| DATA-001 |
P0 |
自动 |
旧 tags.json 无 containerAppOrder 字段时解码 |
加载成功,默认顺序与旧版本一致 |
| DATA-002 |
P0 |
自动 |
新 tags.json 含 containerAppOrder 字段时解码 |
加载成功,顺序字段保留 |
| DATA-003 |
P0 |
自动 |
导出后再导入含顺序的分类与布局 |
导入后每个容器顺序一致 |
| DATA-004 |
P0 |
自动 |
CategorySchemeFingerprint 包含顺序字段 |
只改变顺序也能触发上一方案快照 |
| DATA-005 |
P0 |
自动 |
恢复上一方案 |
标签、App 归属、容器内顺序都恢复 |
| DATA-006 |
P0 |
自动 |
重置为未分类 |
清空旧普通标签归属,并按既定策略清理旧容器顺序 |
| DATA-007 |
P0 |
自动 |
SmartStart replace |
新方案顺序可预测,不复用旧容器顺序 |
| DATA-008 |
P1 |
自动 |
tag rename/delete/relocalize |
顺序 key 正确迁移或清理 |
| DATA-009 |
P1 |
自动 |
卸载 App path 出现在顺序字段 |
不显示空位,不崩溃,必要时懒清理 |
| DATA-010 |
P1 |
自动 |
新 App 不在顺序字段内 |
已排序 App 保持,新增 App 追加并按默认名称排序 |
5. 手工功能用例
| ID |
优先级 |
用例 |
步骤 |
期望结果 |
| UI-001 |
P0 |
同容器拖动到最前 |
在某容器中把第 3 个 App 拖到第 1 个位置 |
App 顺序立即改变,不启动 App |
| UI-002 |
P0 |
同容器拖动到中间 |
把最后一个 App 拖到中间位置 |
插入位置正确,顺序保存 |
| UI-003 |
P0 |
跨行/跨列拖动 |
在网格容器中跨行拖动 App |
目标位置正确,无错位 |
| UI-004 |
P0 |
拖回原位 |
长按拖动后放回原位置 |
不写入无意义变更,不闪烁 |
| UI-005 |
P0 |
松手未移动 |
长按 App 后直接松手 |
不启动 App,不改变顺序 |
| UI-006 |
P0 |
多标签 App 独立顺序 |
App 同时在 A/B 容器,重排 A |
A 顺序改变,B 顺序不变 |
| UI-007 |
P0 |
重开 App Grid |
排序后关闭再打开 App Grid |
顺序保持 |
| UI-008 |
P0 |
重启 App |
排序后退出并重启 TagLauncher |
顺序保持 |
| UI-009 |
P1 |
语言切换 |
排序后切换中英文/日文 |
顺序保持,显示名变化不影响位置 |
| UI-010 |
P1 |
新安装 App |
排序后新增一个 App 并刷新 |
旧顺序保持,新 App 按默认规则追加 |
6. 旧拖拽行为回归
| ID |
优先级 |
用例 |
步骤 |
期望结果 |
| DRAG-001 |
P0 |
跨容器移动标签 |
从 A 容器拖 App 到 B 容器 |
App 获得/移动到 B 标签,旧逻辑保持 |
| DRAG-002 |
P0 |
Option 复制标签 |
按住 Option 从 A 拖到 B |
App 同时保留 A/B 标签 |
| DRAG-003 |
P0 |
拖到空白移除来源标签 |
从容器拖到空白区域 |
继续出现现有确认逻辑 |
| DRAG-004 |
P0 |
拖到未分类 |
拖到未分类目标 |
继续走未分类确认与记忆逻辑 |
| DRAG-005 |
P0 |
拖到 Apple 内置组 |
拖到 Mac 自带 / Apple 内置组 |
继续被保护,不改变标签 |
| DRAG-006 |
P1 |
标签栏拖拽排序 |
拖动顶部/侧边标签排序 |
不受 App 排序拖拽影响 |
7. 显示模式矩阵
| ID |
优先级 |
displayMode |
验收 |
| MODE-001 |
P0 |
flat |
顺序读取一致;是否允许拖动按产品最终边界验收 |
| MODE-002 |
P0 |
container |
可同容器排序 |
| MODE-003 |
P0 |
coloredContainer |
可同容器排序,颜色填充不遮挡插入提示 |
| MODE-004 |
P0 |
gridContainer |
可同容器排序,跨行插入正确 |
| MODE-005 |
P0 |
coloredGridContainer |
可同容器排序,跨行插入正确 |
8. 标签位置矩阵
| ID |
优先级 |
标签位置 |
验收 |
| NAV-001 |
P1 |
左侧 |
App 排序和标签导航互不冲突 |
| NAV-002 |
P1 |
右侧 |
App 排序和标签导航互不冲突 |
| NAV-003 |
P1 |
顶部 |
App 排序和标签导航互不冲突 |
9. 尺寸与显示矩阵
| ID |
优先级 |
条件 |
验收 |
| VIEW-001 |
P1 |
hide app names 开 |
拖动排序时不因名称隐藏误触发气泡 |
| VIEW-002 |
P1 |
hide app names 关 |
名称不遮挡插入提示 |
| VIEW-003 |
P1 |
icon size 40 |
小图标可拖动,命中正确 |
| VIEW-004 |
P1 |
icon size 64 |
默认尺寸可拖动 |
| VIEW-005 |
P1 |
icon size 80 |
大图标可拖动,布局不重叠 |
10. 异常与取消
| ID |
优先级 |
用例 |
期望结果 |
| EDGE-001 |
P0 |
拖出窗口后松手 |
状态清理干净,不残留拖拽影子 |
| EDGE-002 |
P1 |
拖动中按 Esc |
取消拖动,顺序不变 |
| EDGE-003 |
P1 |
拖动中滚动 |
不出现错位插入;若暂不支持滚动拖拽,边界表现明确 |
| EDGE-004 |
P1 |
拖动中切换 Space/窗口 |
不崩溃,不残留 hover/bubble 状态 |
| EDGE-005 |
P1 |
拖动中打开 Quick Search/Settings |
拖动状态清理,窗口行为正常 |
11. 现有 QA 脚本
实现完成后至少运行;本轮 7.9.0 (20260611.2212) 已按下列脚本回归:
cd /Users/ar/Projects/Taglauncher/src
bash Scripts/app_ordering_data_qa.sh
bash Scripts/macos14_availability_typecheck_qa.sh
bash Scripts/macos14_build_metadata_qa.sh
bash Scripts/quick_search_app_name_qa.sh
bash Scripts/quick_search_system_app_qa.sh
bash Scripts/smartstart_catalog_resource_qa.sh
bash Scripts/window_logic_qa.sh
自动化覆盖说明:
Scripts/app_ordering_data_qa.sh 覆盖排序字段兼容、JSON roundtrip、分类方案 fingerprint、导入导出、备份恢复、SmartStart 清理、ContentView wiring、AppGrid 同容器 payload 和 AppDragCoordinator 解析。
Scripts/window_logic_qa.sh 覆盖 Dock 重开、Quick Search、Settings、文件面板、全屏/Split View、隐藏 Dock 场景下的窗口行为回归。
- macOS 14 专项脚本覆盖
arm64-apple-macosx14.0 typecheck 和构建 metadata。
12. 发布阻断条件
- 顺序在刷新、重启、语言切换、导入导出、恢复上一方案任一路径丢失。
- 同容器排序破坏跨容器移动、Option 复制、拖空白移除、Apple 内置保护。
- 旧数据无法加载或升级后默认顺序改变。
- macOS 14 typecheck/build metadata/window logic 任一失败。
- 手工发现拖拽残影、误启动 App、窗口关闭、UI 重叠或插入位置不可理解。