PowerToys FancyZones 编辑器发布回归清单:手工用例向 UI 自动化测试迁移的完整覆盖指南
PowerToys FancyZones 编辑器发布回归清单手工用例向 UI 自动化测试迁移的完整覆盖指南【免费下载链接】PowerToysMicrosoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows项目地址: https://gitcode.com/GitHub_Trending/po/PowerToysFancyZones 是 Microsoft PowerToys 中负责窗口分区布局的核心模块其编辑器支持模板布局、画布/网格自定义布局、多显示器分配与快捷键切换等能力。本篇文章以仓库内 FancyZonesEditor.UITests/release-test-checklist.md 为骨架完整讲解这份发布前回归测试清单如何把原本由人手工执行的编辑器测试用例逐步转化为可在 CI 与 Release pipeline 中自动运行的 UI 测试并结合同目录下的测试源码说明每一项清单背后的自动化落点、测试数据模型与运行前提。读完本文你将掌握 FancyZones 编辑器 UI 自动化回归的完整场景集、每个场景对应的测试文件以及如何在本机用 WinAppDriver MSTest 复跑这些用例。一、清单文档的定位与阅读方式这份文档存放在测试工程目录src/modules/fancyzones/FancyZonesEditor.UITests/下是一份迁移进度跟踪清单其核心目标在文档开头写得非常明确凡是此前由 PowerToys 维护者手工执行的 FancyZones 编辑器测试用例都要转换为 UI 测试转换后的 UI 测试要在 CI 与 Release pipeline 中持续运行替代发布前人工点一遍的回归方式文档通过一组可勾选的- [ ]条目记录每个用例的迁移状态。文档内容分为两大部分第一部分是由前维护者执行过的既有手工用例覆盖启动、新建、复制、删除、编辑、分配、默认布局等编辑器主流程第二部分是补充的 UI 测试场景粒度更细聚焦保存/取消语义、删除副作用、UI 初始化状态、数据文件持久化与首次启动等边界行为。值得注意的是清单条目例如Launch Host File Editor显然沿用了通用回归清单模板的措辞实际被测对象是FancyZones 编辑器——对照同目录测试类名与文档上下文即可确认。因此阅读本清单时应以编辑器功能维度理解各条目的真实意图。二、被测核心FancyZones 编辑器与其配置数据模型要读懂回归清单先要理解编辑器所操作的对象。围绕本清单以下几个概念是反复出现的高频词2.1 布局类型与模板编辑器内置的模板布局类型在 TestConstants.cs 中被逐一列出测试用固定名称索引这些模板卡片布局类型界面显示名称BlankNo layoutFocusFocusRowsRowsColumnsColumnsGridGridPriority GridPriority Grid模板布局是参数化的可调参数见LayoutTemplates.TemplateLayoutWrapper包括Type布局类型ZoneCount分区数量ShowSpacing/Spacing是否启用并设置分区间距SensitivityRadius拖动窗口靠近分区时高亮命中相邻分区的灵敏度半径清单中写作 distance to highlight adjacent zones。模板基础上用户还能通过基于模板创建自定义布局得到一份可独立编辑的副本而自定义布局按编辑方式分为两类清单对它们分别出用例Canvas画布布局自由放置、缩放、新增与删除分区zoneGrid网格布局对分区做拆分split、合并merge、拖动分隔条调整大小resize/move splitter。2.2 配置数据文件清单反复断言的对象编辑器的所有状态都持久化为 JSON 文件路径集中定义在 FancyZonesEditorCommon/Data/FancyZonesPaths.cs位于%LOCALAPPDATA%\Microsoft\PowerToys\FancyZones下applied-layouts.json各显示器/虚拟桌面当前应用的布局与参数custom-layouts.json用户自定义布局集合layout-templates.json内置模板布局的当前参数配置layout-hotkeys.json布局切换快捷键default-layouts.json横向/纵向显示器各自的默认布局editor-parameters.json编辑器启动参数由调用方写入含显示器枚举信息。测试辅助类 FancyZonesEditorFiles.cs 为上述每个文件外加应用分区历史各持有一个IOTestHelper读写器并提供Restore()在用例执行前统一还原初始数据——清单中applied-layouts.json 保留未连接设备信息首次启动时不存在各类 json等条目正是围绕这些文件展开的持久化回归场景。2.3 编辑器由外部参数驱动编辑器本身是独立进程由 PowerToys 主程序按需拉起并通过editor-parameters.json传入本次会话的显示器快照。测试中常见的EditorParameters.ParamsWrapper字段见 EditorParameters.cs包括ProcessId、SpanZonesAcrossMonitors以及每个显示器条目的MonitorInstanceId、MonitorSerialNumber、MonitorNumber、VirtualDesktop、Dpi、屏幕与工作区坐标尺寸、IsSelected等。UI 测试正是通过预先写入带 1~2 台显示器含不同 DPI、不同选中状态的参数文件来驱动编辑器渲染出可点击的Monitor 1 / Monitor 2卡片从而自动化验证为每台显示器分配布局等回归场景。三、第一部分既有手工回归用例及其自动化落点清单第一部分把维护者以往发布前手工验证的编辑器主流程拆成十余条以下逐组说明每条的真实含义以及在FancyZonesEditor.UITests工程中对应的测试落点。3.1 启动编辑器从设置入口与快捷键Open editor from the settings在 PowerToys 设置中打开窗口管理器 → 自定义布局进入编辑器Open editor with a shortcut通过快捷键默认Win Ctrl \呼出编辑器。这两条在自动化中统一收敛为以带参数方式启动编辑器进程并验证主窗口出现。典型实现见 RunFancyZonesEditorTest.cs 与 FirstLunchTest.cs测试在TestInitialize中先写入editor-parameters.json、六类模板、空的自定义/默认/快捷键/已应用布局数据再调用RestartScopeExe()重启编辑器作用域随后用Session.Find断言主窗口AccessibilityId.MainWindow MainWindow1存在。3.2 布局生命周期新建、复制与删除清单中的布局 CRUD 用例集中在几个测试类中清单条目自动化落点Create a new layout (grid and canvas)CreateLayoutTests.cs 中的CreateGrid、CreateCanvas、CreateWithCustomName以及取消路径CancelGridCreation、CancelCanvasCreationDuplicate a template and a custom layoutCopyLayoutTests.cs覆盖模板在编辑窗口内复制CopyTemplate_FromEditLayoutWindow、复制后成为默认布局CopyTemplate_DefaultLayout自定义布局经编辑窗口CopyCustomLayout_FromEditLayoutWindow、右键菜单CopyCustomLayout_FromContextMenu、默认布局CopyCustomLayout_DefaultLayout与保留快捷键CopyCustomLayout_Hotkey等路径Delete layoutDeleteLayoutTests.cs覆盖删除未应用布局、删除已应用布局、取消删除、右键菜单删除、删除默认布局与删除后释放快捷键其中复制操作有两种 UI 形态在Templates模板分区点击Create custom layout或在Custom自定义分区使用Duplicate。测试代码中这两种形态分别通过编辑窗口内的复制按钮AccessibilityId.CopyTemplate/DuplicateLayoutButton和右键上下文菜单实现最终断言的共同点是新布局确实存在、数据正确。3.3 布局编辑模板参数、画布分区与网格结构编辑模板分区数、间距、高亮灵敏度并验证重启后设置保持不变对应 TemplateLayoutsTests.cs 中的ZoneNumber_Cancel、HighlightDistance_Initialize/Save/Cancel、SpaceAroundZones_*一组用例。由于模板参数同样写入layout-templates.json重开编辑器后设置不变正是通过改参数 → Save → 重启编辑器 → 回读界面状态来断言的。编辑画布布局分区大小与位置、新建/删除分区对应 EditLayoutTests.cs 中Canvas_AddZone_Save/Cancel、Canvas_DeleteZone_Save/Cancel、Canvas_MoveZone_Save/Cancel、Canvas_ResizeZone_Save/Cancel。画布编辑窗口的类名为Canvas layout editor见 FancyZonesEditorHelper.cs 中的ElementName常量分区控件类名为CanvasZone新增分区按钮AccessibilityId.NewZoneButton。编辑网格布局拆分、合并、缩放分区对应同一文件中的Grid_SplitZone_Save/Cancel、Grid_MergeZones_Save/Cancel、Grid_MoveSplitter_Save/Cancel。网格编辑窗口类名为Grid layout editor合并操作经由Merge zones按钮完成。值得注意上述几乎每个编辑动作都同时存在Save 与 Cancel 两种收尾这正对应清单中的专门条目Check Save and apply and Cancel buttons behavior after editing——UI 测试用取消后回读断言编辑未生效、保存后断言数据已写入的方式把事务性语义固化为回归保障。3.4 显示器分配、默认布局与切换快捷键Assign a layout to each monitor为每台显示器分别指定布局。对应 RunFancyZonesEditorTest.cs 的ClickMonitor验证显示器卡片可切换选中态以及 ApplyLayoutTests.cs 的ApplyLayoutsOnEachMonitor。Assign keys to quickly switch layouts (custom layouts only), Win Ctrl Alt number仅自定义布局可绑定切换快捷键。对应 LayoutHotkeysTests.cs 的HotKey_Assign_Save、HotKey_Assign_Cancel、HotKey_Assign_AllPossibleValues。Assign horizontal and vertical default layouts设置横向/纵向显示器的默认布局。对应 DefaultLayoutsTest.cs 的Default_Assign_Save、Default_Assign_Cancel。该用例会在每个布局的编辑窗口中点击SetLayoutAsHorizontalDefaultButton/SetLayoutAsVerticalDefaultButton再以 Save/Cancel 两个分支分别断言默认布局是否被改写并会用Default_Initialize校验预置数据横向默认 Grid、纵向默认某自定义布局在编辑器界面上的勾选状态。3.5 右键复制焦点行为清单第一部分的最后一条专门描述了一个交互细节在 Templates/Custom 区域左键选中布局 X再右键布局 Y 并执行复制期望结果是Y 被复制而非当前选中的 X——即复制动作的焦点是右键点击的对象。这在 UI 自动化中对应右键点击 → 弹出ContextMenu→ 点击菜单项的标准链路helper 中封装的ClickContextMenuItem并在CopyLayoutTests/OpenEditLayoutDialog_ByContextMenu_*等用例中以右键方式触发复制与编辑来持续守护该行为。四、第二部分补充 UI 测试场景的增量要点清单第二部分没有沿用手工用例的叙事而是直接按可自动化的场景枚举了更细的断言点这些场景多数已经在上述测试类中落地理解它们能帮你把握 UI 测试工程的覆盖边界。4.1 前置数据注入与 UI 初始状态Add test data and start → verify data is correct (custom layouts, template layouts, defaults, shortcut keys)这是所有测试类的共同模式——先在TestInitialize中用序列化器把预置数据写入对应 json自定义布局、六类模板、横向/纵向默认布局、快捷键再启动编辑器最后逐项核对界面。UI Init: assigned layouts selected / applied default / assigned custom layout but id not found用于验证编辑器启动后已分配布局与默认布局能正确回显当applied-layouts.json引用了已不存在的自定义布局 UUID用户删除了该布局但分配记录仍在时编辑器不应崩溃UI 状态应合理。此类脏数据兼容逻辑集中在 UIInitializeTest.cs 中。4.2 新建与复制的完整断言闭环清单为新建/复制单列出带校验的条目创建画布/网格后要verify the layout exists取消后要doesnt exist复制模板/自定义布局后还要额外检查副本是否继承了快捷键与默认布局身份。对应到测试就是每个动作的 Save 分支断言数据文件或界面中新增了实体、Cancel 分支断言无残留。4.3 删除的副作用语义删除类补充场景在 DeleteLayoutTests.cs 中被自动化得相当完整删除未应用布局不影响任何显示器删除已应用布局验证applied-layouts.json中的分配随之失效取消删除布局保留从上下文菜单删除删除绑定了快捷键的布局 → 快捷键应被释放Delete: hotkey released即DeleteLayoutWithHotkey删除被设为默认布局的布局 → 默认布局应回退到系统默认Delete: default layout reset to default-default即DeleteDefaultLayout。4.4 编辑器启动时 UI 参数回显Assign the same template but with different params to monitors同一模板如 Grid在不同显示器上应用不同分区数/间距/灵敏度参数需要保证按显示器分别持久化对应 ApplyLayoutTests.cs 的ApplyTemplateWithDifferentParametersOnEachMonitor。Assign layout on each monitor / Assign custom / Assign template覆盖分配操作的类型分支落在ApplyLayoutTests与RunFancyZonesEditorTest。4.5 快捷键与默认布局的保存/取消Assign shortcut key and save/cancel、Reset shortcut key and save/cancel对应LayoutHotkeysTests的HotKey_Assign_Save/Cancel与HotKey_Reset_Save/Cancel——新增Win Ctrl Alt 数字绑定或重置绑定后分别验证保存生效与取消还原Set default layout verify both prev and current after reopening先记录原默认布局设置新默认并保存重启编辑器后同时验证原默认已解除、新默认已生效对应DefaultLayoutsTest。4.6 持久化兼容与首次启动applied-layouts.json keeps info about not connected devices / other virtual desktops显示器被拔出或切到其他虚拟桌面后编辑器不应丢失这些显示器/桌面已有的布局分配——即applied-layouts.json要能保存并恢复与当前未连接设备相关的记录。first launch without custom-layouts.json / default-layouts.json / layout-hotkeys.json / layout-templates.json全新机器上这些文件尚不存在时编辑器首次启动必须正常渲染出默认模板集并可用。这正是 FirstLunchTest.cs 中FirstLaunch用例的验证目标——测试将各文件预置为合法空集合后重启编辑器断言主窗口正常出现。五、驱动这些用例的测试基础设施5.1 框架与驱动链FancyZonesEditor.UITests是基于MSTestMicrosoft.VisualStudio.TestTools.UnitTesting的 Windows UI 测试工程FancyZonesEditor.UITests.csproj驱动链为MSTest 测试方法 └─ Microsoft.PowerToys.UITestSession / UITestBase 封装 └─ OpenQA.Selenium.Appium.WindowsAppium Windows Driver 客户端 └─ Windows Application Driver (WinAppDriver) └─ 目标FancyZones 编辑器 WPF 进程Init.cs 中的[AssemblyInitialize]会在整个程序集测试启动前拉起C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe[AssemblyCleanup]在结束后将其关闭——这意味着本机运行前必须安装 WinAppDriver 与已构建的 PowerToys。5.2 UI 元素定位用 AccessibilityId 对抗界面变更由于编辑器为 WPF 应用测试统一通过AutomationId / 名称 / 控件类型定位元素所有关键 ID 集中在 FancyZonesEditorHelper.cs 的三个静态类里这也是把清单条目稳定翻译成自动化脚本的契约层AccessibilityId主窗口MainWindow1、新建布局按钮NewLayoutButton、编辑按钮EditLayoutButton、画布/网格单选框CanvasLayoutRadioButton/GridLayoutRadioButton、间距滑杆Spacing、灵敏度滑杆SensitivityInput、快捷键下拉框quickKeySelectionComboBox、横向/纵向默认按钮、删除/复制按钮等ElementNameSave/Cancel、右键菜单项Edit/Edit zones/Delete/Duplicate/Create custom layout、画布与网格编辑窗口标题、Merge zones按钮ClassNameContextMenu、TextBox、Popup、CanvasZone、GridZone、Thumb等 Win32/WPF 类名。右键场景通过element.Click(true)模拟右键弹出上下文菜单再在ContextMenu内按菜单项文本定位点击——这与 3.5 节描述的复制焦点行为天然对应。5.3 测试数据文件的写入与还原每个测试类在TestInitialize阶段做四件事FancyZonesEditorHelper.Files.Restore()还原全部数据文件 → 构造内存中的EditorParameters/LayoutTemplates/CustomLayouts/DefaultLayouts/LayoutHotkeys/AppliedLayouts对象 → 用各自的Serialize方法写入对应 json →RestartScopeExe()重启编辑器。断言阶段则反向回读文件或界面状态例如DefaultLayoutsTest会在每个模板/自定义布局的编辑窗口中检查默认布局按钮的 Checked/Unchecked 态并用Cancel逐个关闭对话框。这种做法使得同一个测试类既能验证 UI 交互又能验证 json 持久化结果——清单中所有涉及重开编辑器后保持/重置取消不生效的条目本质上都依赖这套可重复注入、可精确还原的数据夹具机制。六、运行环境与本地执行前提要在本机复跑这份清单对应的 UI 测试需要满足Windows 系统FancyZones 与 WinAppDriver 均为 Windows 专属已构建并安装的 PowerToys含 FancyZones 模块路径与启动器约定保持一致安装Windows Application Driver默认路径C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe见Init.cs在 Visual Studio 的 Test Explorer 中打开含 FancyZonesEditor.UITests.csproj 的筛选解决方案并运行测试或用vstest.console.exe/dotnet test指向已构建的测试程序集。由于测试会真实拉起编辑器窗口并模拟点击运行期间请勿占用鼠标/键盘。清单中用例在迁移完成后即成为 CI 与 Release pipeline 的一部分与发布流程参考 release-process.md配合替代发布前的人工点检。PowerToys UI 测试的通用工程约定还可参考 ui-tests.md。七、迁移进度的跟踪方式与工程参考作为跟踪清单release-test-checklist.md中的- [ ]状态即代表该场景尚未/已经完成自动化。推进迁移的推荐做法与仓库现状高度一致先把清单条目按功能归类逐类阅读对应的测试类确认覆盖情况尚未覆盖的条目再补齐到对应的测试类中。从工程现状看清单第一部分几乎全部条目都已能在FancyZonesEditor.UITests中找到对应实现详见第三、四节的映射第二部分的多数据文件持久化与首次启动用例也已由FirstLunchTest、DefaultLayoutsTest、LayoutHotkeysTests等承载。若想深入某类布局的编辑逻辑或数据序列化细节可继续研读测试主体FancyZonesEditor.UITests 目录下的RunFancyZonesEditorTest.cs、CreateLayoutTests.cs、CopyLayoutTests.cs、DeleteLayoutTests.cs、EditLayoutTests.cs、TemplateLayoutsTests.cs、ApplyLayoutTests.cs、LayoutHotkeysTests.cs、DefaultLayoutsTest.cs、UIInitializeTest.cs数据模型与路径FancyZonesEditorCommon/Data 下的FancyZonesPaths.cs、EditorParameters.cs、LayoutTemplates.cs、CustomLayouts.cs、DefaultLayouts.cs、LayoutHotkeys.cs、AppliedLayouts.cs、Constants.cs测试辅助Utils/FancyZonesEditorHelper.cs、Utils/FancyZonesEditorFiles.cs、Utils/IOTestHelper.cs功能背景doc/devdocs/modules/fancyzones.md 与 FancyZones 模块源码 src/modules/fancyzones/FancyZones。总而言之这份清单的价值不在于列出要点的表格而在于它把 FancyZones 编辑器最容易被回归遗漏的行为——取消语义、默认回退、快捷键释放、脏数据兼容、断连显示器持久化、无配置文件首启——逐条固化成了可执行、可断言的 UI 自动化资产。理解清单与测试源码的对应关系你既能在发布前快速定位回归风险点也能为编辑器后续的功能演进持续补充自动化防线。【免费下载链接】PowerToysMicrosoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考