文件树操作测试用例
本文用于文件树的手工回归与自动化补充。以下是待执行用例,不代表本次已逐项运行。 功能依据以 FEATURES.md 的“文件整理与导航”和“删除与未保存保护”为准。
1. 测试准备
1.1 环境与数据
- 使用可丢弃的独立笔记库,不要在真实笔记库或含重要文件的系统回收站中执行删除用例。
- 每个用例从下列初始目录重新开始,除非用例明确要求沿用上一操作的状态。
A/child.md含相对图片,其余 Markdown 文件内容彼此不同,便于核对复制和恢复。A/extra.txt和A/assets/raw.bin用于验证未显示文件;按需加入隐藏文件、符号链接和只读文件。- 记录每次操作后的文件树、磁盘内容、系统回收站、打开的标签、焦点、选区和收藏或最近文件状态。
测试库/
├── alpha.md
├── beta.md
├── A/
│ ├── child.md
│ ├── extra.txt
│ └── assets/raw.bin
├── B/
│ └── beta.md
├── Empty/
└── assets/p.png
1.2 操作约定
- “主修饰键”在 macOS 为
Cmd,在 Windows/Linux 为Ctrl。 - 文件树聚焦时,撤销为主修饰键加
Z,重做为主修饰键加Shift+Z。 - 删除快捷键在 Windows/Linux 为
Delete;macOS 为Cmd+Backspace,也可使用Delete。 - 用例中的“同一步”指一次多选操作产生的一组文件树历史记录。
- 跳过失败项意味着永久移除该项在这组操作中的历史记录;不应删除或覆盖磁盘上的其他文件。
2. 选择、焦点与入口
2.1 选择范围
- FT-S01 单选与切换
- 操作:单击
alpha.md,再单击beta.md。 - 预期:选区分别只有当前文件;文件可正常打开。
- 操作:单击
- FT-S02 增减多选
- 操作:单击
alpha.md,按主修饰键单击beta.md,再按主修饰键单击alpha.md。 - 预期:选区从一项变两项,再变为仅
beta.md。
- 操作:单击
- FT-S03 可见范围选择
- 操作:展开
A,选中alpha.md,按Shift单击另一个可见节点。 - 预期:仅按当前可见文件树顺序选择连续范围;折叠或过滤隐藏的节点不被范围选中。
- 操作:展开
- FT-S04 父子节点同时选中
- 操作:按主修饰键同时选中
A与A/child.md,执行复制或删除。 - 预期:实际操作只提交父文件夹一次;子文件不会被重复处理。
- 操作:按主修饰键同时选中
- FT-S05 折叠与筛选
- 操作:选中
A/child.md后折叠A;随后设置不匹配child的文件名筛选。 - 预期:单纯折叠保留选区;筛选隐藏条目后,隐藏条目从选区移除。
- 操作:选中
- FT-S06 右键与空白处
- 操作:多选后右键其中一项,再右键未选项;最后单击文件树空白处。
- 预期:右键已选项保留整组选区,右键未选项改为单选;空白处将焦点移入文件树。
- FT-S07 单项命令限制
- 操作:多选文件与文件夹,检查重命名和收藏入口,再改为单选。
- 预期:重命名等单项命令在多选时不可用;剪切、复制、粘贴和删除处理整组选项。
2.2 键盘与焦点
- FT-S08 键盘导航
- 操作:聚焦文件树,使用方向键、
Home、End、Enter和空格。 - 预期:方向键按树结构移动或展开折叠;
Home、End定位首尾可见项;文件可打开,焦点行为符合当前文件树设置。
- 操作:聚焦文件树,使用方向键、
- FT-S09 操作后的焦点
- 操作:分别完成重命名、新建文件夹、粘贴、删除、撤销和重做。
- 预期:焦点留在文件树及可见结果节点;原节点消失且树为空时,文件树容器仍可聚焦。新建文件按现有行为聚焦新文档。
- FT-S10 历史作用域
- 操作:在文件树聚焦时执行撤销,再在编辑器聚焦时执行撤销。
- 预期:前者作用于文件树操作,后者作用于当前文档正文,不交叉撤销。
- FT-S11 菜单与路径复制
- 操作:对文件及文件夹分别用鼠标右键和
Shift+F10打开菜单,复制绝对路径与笔记库相对路径。 - 预期:入口和快捷键提示正确;剪贴板文本指向所选项目,复制路径不改变文件内容或文件树历史。
- 操作:对文件及文件夹分别用鼠标右键和
- FT-S12 文件管理器定位与引用
- 操作:对文件树节点执行“在文件管理器中显示”;对 Markdown 文件执行“复制引用”和“复制引用(大纲)”。
- 预期:文件管理器定位正确;复制的引用使用测试库根相对地址,大纲不存在时退化为文件引用。
3. 新建、重命名与移动
3.1 新建与重命名
- FT-M01 新建文件与文件夹
- 操作:分别在根目录和
A中新建 Markdown 文件、文件夹。 - 预期:目标位于所选文件夹内;选中文件时,目标位于其父文件夹;未输入扩展名的 Markdown 文件获得
.md。
- 操作:分别在根目录和
- FT-M02 取消与非法名称
- 操作:取消新建或重命名;再尝试空名称、非法字符和已存在的同名目标。
- 预期:取消不改磁盘和历史;非法名称或同名冲突被拒绝,不覆盖原文件。
- FT-M03 重命名文件及目录
- 操作:重命名
alpha.md和A,分别执行撤销、重做。 - 预期:树、磁盘、已打开标签和历史路径同步;每次重命名可撤销及重做。
- 操作:重命名
- FT-M04 未保存正文下的重命名
- 操作:打开
A/child.md并修改但不保存,然后重命名文件或父目录。 - 预期:标签路径更新,未保存正文仍在;不出现外部删除恢复提示。
- 操作:打开
3.2 移动
- FT-M05 文件与目录移动
- 操作:将
alpha.md移至B,将B移至A,再分别撤销、重做。 - 预期:源路径消失、目标路径出现;目录内容完整;撤销和重做恢复对应路径。
- 操作:将
- FT-M06 移动约束
- 操作:尝试把文件移到原目录,把
A移到自身或其子目录,把文件移到已有同名文件处。 - 预期:无效操作被拒绝,原文件和目标文件均不变。
- 操作:尝试把文件移到原目录,把
- FT-M07 相对图片引用
- 操作:将
A/child.md移到根目录或B,再复制到另一层级。 - 预期:本地相对图片路径仍指向原图片;绝对路径与远端 URL 不被误改。
- 操作:将
- FT-M08 未保存正文下的移动
- 操作:修改
A/child.md但不保存,剪切并粘贴到B。 - 预期:移动完成且标签继续显示未保存正文;涉及该文档的历史撤销若被未保存保护阻止,应显示失败路径并保留可重试记录。
- 操作:修改
4. 复制、剪切与粘贴
4.1 复制
- FT-C01 复制到同目录
- 操作:复制
alpha.md后在根目录粘贴两次。 - 预期:依次产生
alpha-副本.md、alpha-副本-2.md;原文件内容不变。
- 操作:复制
- FT-C02 复制到其他目录
- 操作:复制
alpha.md并粘贴到A;再次粘贴同一来源。 - 预期:首次保留原文件名,第二次使用副本后缀;不覆盖已有内容。
- 操作:复制
- FT-C03 文件与文件夹作为目标
- 操作:以
B为粘贴目标,再以B/beta.md为目标。 - 预期:文件夹目标复制到其内部;文件目标复制到其父目录。
- 操作:以
- FT-C04 复制目录及附件
- 操作:复制
A到根目录和B,检查child.md、extra.txt、附件与相对图片。 - 预期:目录内容完整;附件不因文件树未显示而丢失;源目录保留。
- 操作:复制
- FT-C05 多选复制与单步历史
- 操作:同时复制
alpha.md、A与A/child.md,粘贴到B,撤销一次再重做一次。 - 预期:只复制两个顶层选中项;一次撤销移除整组副本,一次重做恢复整组。
- 操作:同时复制
- FT-C06 复制源的稳定性
- 操作:仅执行复制而不粘贴;切换树焦点后再粘贴,重复粘贴。
- 预期:复制本身不改变磁盘;每次粘贴生成独立副本并形成自己的历史步骤。
4.2 剪切与失败恢复
- FT-C07 剪切显示与目标
- 操作:剪切
alpha.md和beta.md,观察树中样式,再粘贴到A。 - 预期:剪切前不移动磁盘文件;待移动项半透明;粘贴成功后源路径消失。
- 操作:剪切
- FT-C08 多选剪切的部分失败
- 操作:让
B已有beta.md,同时剪切alpha.md、beta.md并粘贴到B。 - 预期:提示已完成数量;已移动项保留在目标,仅未移动项留在待粘贴队列;已完成部分可撤销、重做。
- 操作:让
- FT-C09 首项失败与重试
- 操作:先制造首个目标同名冲突并粘贴;移除冲突后再次粘贴。
- 预期:首次完成数为零,剪切队列不减少;第二次只执行尚未移动的项目。
- FT-C10 跨笔记库剪贴板
- 操作:在测试库复制或剪切项目,切换到另一笔记库后尝试粘贴。
- 预期:切库清除旧笔记库的待粘贴队列;切回后也不能把旧队列粘贴到任一笔记库。
5. 拖放
- FT-D01 默认移动与主修饰键复制
- 操作:拖动
alpha.md到B,再按住主修饰键拖动A到B。 - 预期:默认移动,按键时复制;复制后源目录仍在。
- 操作:拖动
- FT-D02 静止指针时切换修饰键
- 操作:拖动项目并停在目标上,不移动鼠标,只按下或松开主修饰键,然后放开鼠标。
- 预期:目标提示立即切换复制或移动,实际操作与释放时的修饰键状态一致。
- FT-D03 混选拖放
- 操作:多选文件、目录及该目录子项,拖到
B。 - 预期:只操作顶层选中项;同组操作可一步撤销、重做。
- 操作:多选文件、目录及该目录子项,拖到
- FT-D04 文件、文件夹与根部落点
- 操作:分别拖到
B/beta.md、B和文件树根部。 - 预期:文件落点取其父目录,文件夹落点取自身,根部落点取测试库根目录。
- 操作:分别拖到
- FT-D05 无效落点与部分失败
- 操作:尝试移动目录到自身或子目录、移动文件到原目录,并制造多项拖放中的名称冲突。
- 预期:无效落点不执行;批量失败时显示完成数,已完成部分保留且可撤销。
6. 删除与系统回收站
6.1 确认与保护
- FT-T01 单文件删除入口
- 操作:分别通过工具按钮、右键菜单和平台删除快捷键删除
alpha.md。 - 预期:每次均先确认;确认后文件从树与磁盘消失并进入系统回收站。
- 操作:分别通过工具按钮、右键菜单和平台删除快捷键删除
- FT-T02 取消第一次确认
- 操作:选中
alpha.md后触发删除并取消;对话框打开期间刷新或重绘文件树后再取消。 - 预期:磁盘、选区和历史不变;焦点回到原条目。
- 操作:选中
- FT-T03 显示与未显示文件的二次确认
- 操作:删除仅含可见 Markdown 的目录,再删除含
extra.txt或附件的A。 - 预期:前者只确认一次;后者在首次确认后提示未显示文件并要求二次确认。
- 操作:删除仅含可见 Markdown 的目录,再删除含
- FT-T04 取消第二次确认
- 操作:多选
A与beta.md,通过第一次确认,在第二次确认时取消。 - 预期:整组选项均未删除,系统回收站不新增该组项目。
- 操作:多选
- FT-T05 父子混选与目录完整性
- 操作:同时选中
A和A/child.md后确认删除。 - 预期:只删除
A一次;目录内的 Markdown、非 Markdown 文件和附件均进入回收站。
- 操作:同时选中
- FT-T06 已打开标签与未保存保护
- 操作:先删除已打开但无未保存修改的文件,再尝试删除有未保存修改的文件或其父目录。
- 预期:成功删除关闭对应标签;未保存情形阻止删除,不丢失正文。
- FT-T07 删除后的焦点与树空态
- 操作:删除当前聚焦节点,最后删除测试库中仅剩的可见节点。
- 预期:焦点仍在文件树的其他可见节点;空树时容器可聚焦。
6.2 回收站恢复
- FT-T08 删除、撤销与重做
- 操作:删除文件和目录,各执行撤销、重做、再撤销。
- 预期:内容与路径按序恢复、再删除;目录内附件一同恢复;收藏与最近文件状态按该操作记录恢复。
- FT-T09 多选删除历史
- 操作:一次删除
alpha.md和A,撤销一次并重做一次。 - 预期:整组按一步处理;两项并发进入或离开系统回收站,完成后文件树统一刷新;撤销时两项均恢复,重做时两项均再次删除。
- 操作:一次删除
- FT-T10 无法建立回收站记录
- 操作:在能复现系统回收站无法返回唯一项目的受控环境中删除测试文件。
- 预期:界面说明该项目不能通过文件树撤销恢复;不伪造可用的历史记录。
- FT-T11 批量删除的部分失败
- 操作:让多选删除中的后一项因受控权限或外部占用失败。
- 预期:提示已完成数量;已删除项进入回收站且可撤销,失败项及其磁盘内容保留。
7. 文件树历史与失败处理
7.1 正常历史
- FT-H01 新建历史
- 操作:新建文件和文件夹,各撤销、重做。
- 预期:撤销新建时项目进入系统回收站;重做从回收站恢复,不依赖应用副本。
- FT-H02 复制历史
- 操作:复制并粘贴文件或目录,撤销、重做。
- 预期:只撤销副本;源项目保持;副本从回收站恢复后内容不变。
- FT-H03 重命名与移动历史
- 操作:连续重命名、移动同一项目,逐步撤销,再逐步重做。
- 预期:每步恢复对应路径,不覆盖相邻步骤;已打开标签跟随最终路径。
- FT-H04 新操作清空重做
- 操作:执行操作并撤销,再执行新的文件树操作,尝试重做旧操作。
- 预期:旧重做分支失效;新操作仍可撤销。
- FT-H05 历史生命周期
- 操作:记录文件树历史后切换笔记库、重新打开窗口或重启应用。
- 预期:历史仅在当前窗口和当前笔记库会话内有效,不跨库或跨重启执行。
7.2 冲突、外部操作与选择分支
- FT-H06 回收站项目仍在但原路径被占用
- 操作:删除
alpha.md,在原路径新建另一个不同内容的文件,再尝试撤销。 - 预期:弹窗列出
alpha.md与占用原因;原路径文件不被覆盖,回收站项目仍在,历史可重试。
- 操作:删除
- FT-H07 默认取消
- 操作:在 FT-H06 的失败弹窗中按
Enter或Esc,再显式按“取消”。 - 预期:默认焦点在“取消”;三种取消方式都不继续操作,保留当前组的进度和失败项历史。
- 操作:在 FT-H06 的失败弹窗中按
- FT-H08 重试当前项
- 操作:在 FT-H06 中移除占用文件,选择“重试”。
- 预期:仅重新执行失败的项目;本组已经成功的项目不重复执行。
- FT-H09 跳过当前项
- 操作:多选删除后只让其中一项恢复失败,选择“跳过”。
- 预期:仅该项历史被移除;同组其他项目继续撤销或重做;提示含失败项相对路径。
- FT-H10 Explorer 已恢复原项目(Windows)
- 操作:在应用删除
alpha.md,从 Explorer 撤销或从系统回收站恢复,再在文件树撤销。 - 预期:应用检测回收站项目已消失,刷新文件树并移除该项历史;提示列出
alpha.md,后续撤销不重复报同一错误。
- 操作:在应用删除
- FT-H11 回收站项目被移走(Windows)
- 操作:在应用删除
alpha.md后,从回收站将它恢复到别处,再在文件树撤销。 - 预期:该历史失效并提示相对路径;不会把别处的文件移动回测试库,也不会删除其他文件。
- 操作:在应用删除
- FT-H12 外部恢复与同名占用并存
- 操作:删除后移走回收站项目,并在原路径另建同名文件,再尝试撤销。
- 预期:按回收站项目已失效处理;现有同名文件不被覆盖,失效历史被移除。
- FT-H13 多项历史中的取消与部分进度
- 操作:让组内后一个项目先成功、下一个项目失败,在弹窗中取消,然后再次撤销。
- 预期:已完成项目不重复执行;重新开始时只处理未完成项目。
- FT-H14 相关文档有未保存修改
- 操作:在可撤销的重命名或移动后修改相关文档而不保存,再尝试撤销。
- 预期:弹窗显示对应相对路径和未保存原因;取消后正文与历史均保留,保存后可重试。
8. 安全边界与平台差异
8.1 文件系统边界
- FT-P01 路径和名称安全
- 操作:通过界面或受控 IPC 输入尝试路径穿越、库外目标、无效名称和同名覆盖。
- 预期:操作被拒绝;库外内容和现有目标不变。
- FT-P02 符号链接
- 操作:在支持的测试环境中,让源文件或目录包含指向库外的符号链接,再复制或移动。
- 预期:不跟随链接写入库外;复制目录跳过链接项,直接操作不安全链接时拒绝。
- FT-P03 只读与权限失败
- 操作:限制测试目录写权限,分别尝试新建、复制、移动、删除和恢复。
- 预期:显示实际失败原因与已完成数量;不把失败操作记为成功;恢复权限后可按历史状态重试。
- FT-P04 中文、空格与短路径(Windows)
- 操作:在包含中文与空格的目录中删除、撤销、重做文件和文件夹,并测试 Windows 短路径目录。
- 预期:文件名不乱码;回收站记录正确匹配;恢复到原路径且内容一致。
8.2 平台快捷键与系统回收站
- FT-P05 平台快捷键
- 操作:在 Windows/Linux 与 macOS 分别检查重命名、删除、剪切、复制、粘贴、撤销和重做快捷键。
- 预期:按各平台约定生效;提示文字只显示当前平台的修饰键名称。
- FT-P06 系统回收站集成
- 操作:在 Windows、macOS 和 Linux 的支持环境中删除测试文件,并从系统文件管理器确认回收站与恢复。
- 预期:删除进入该系统的回收站;应用内撤销不会覆盖已被外部恢复或移动的项目。
9. 现有自动化入口
下表仅说明现有测试可辅助覆盖的范围;本文件的人工步骤仍需逐项执行并记录结果。
| 测试入口 | 主要范围 |
|---|---|
npm run test:smoke:tree-multiselect |
多选、拖放、复制粘贴、批量删除、部分失败及组历史 |
npm run test:smoke:workspace-trash |
删除确认、取消、焦点和标签关闭 |
npm run test:smoke:workspace-trash-unicode |
Windows 中文文件与目录的回收站删除、恢复及冲突 |
node scripts/run.mts node --test test/tree-history.test.js |
历史失效、取消、重试、跳过及组内进度 |
node scripts/run.mts node --test test/workspace-manager.test.js |
文件管理、回收站句柄恢复、路径冲突和外部恢复 |
node scripts/run.mts node --test test/file-tree-navigation.test.mjs |
文件树导航规则 |
执行时为每个用例记录:用例 ID、操作系统、应用版本、结果、实际路径、回收站状态和失败截图或日志。
