测试
SteamWrapper 分别验证跨 Windows/Linux 的 Rust core 与独立 Runner,以及 WinUI Manager 的 C# 服务、跨语言契约、自包含发布和本地交互原生 UI 回归切片。Dioxus、其 Rust 管理服务、Native E2E 与旧打包流程已退役。Windows 最终交付仍按 阶段门槛验收。
Manager 实测比较是选型的归档证据;测量脚本与 Dioxus 源码固定在提交 ca6a09e,不再是当前开发前置条件。
按改动选择验证
章节“按改动选择验证”先读取受影响代码和测试,选择能证明本次结果的检查。无需每次编辑前运行整个 workspace,也无需为文档或纯样式调整新增匹配源码字符串的测试。
| 本次改动 | 本地验证范围 |
|---|---|
| 文档 / AGENTS / 技能 | 审核 diff、链接和指令冲突;文档/站点变更运行 pnpm docs:check 与 pnpm docs:build |
| Rust core 行为 | 先写能复现缺失行为的测试并观察预期失败,再修改实现;运行受影响 crate 测试;共享契约或跨 crate 影响时运行 workspace 检查和测试 |
| Runner 启动 / 等待 | 对应平台的真实进程回归测试;CLI / TOML / 公共模块变化再扩展到 workspace |
| WinUI / C# 服务 | Invoke-WinUI.ps1 -Action Test;配置协议或 Runner 分发变化增加 Test-WinUIContracts.ps1;发布修改后的 UI,在解锁的交互 Windows 桌面运行 Test-WinUINativeUi.ps1,其余 UI 门槛另做限定范围的人工检查 |
| 纯视觉调整 | 构建并在隔离 Desktop 预览中检查受影响界面;按影响选择现有测试,不用固定 CSS 字符串代替视觉验收 |
| 发布 / 工具链或共享构建变化 | 相关 Rust/WinUI 门禁、当前 Windows Runner staging、完整发布目录与 Test-WinUIPublish.ps1;安装器另行验收 |
CI 工作流仍执行各自完整门禁。上表限定日常本地工作量,不删减 CI。已通过的检查只在新改动、失败或未解决疑点出现时重跑;缺少工具时记录阻塞,不把未运行写成通过。
行为回归优先验证外部结果。服务或源码声明测试不能证明原生窗口、可访问性、布局或文件选择行为。现有仅用于开发的原生 UI 回归工具通过 Windows UI Automation 操作实际 WinUI 应用;首个切片不等于原生验收路线图全部完成。实际执行用例与限定范围的人工检查须分别记录。
WinUI 验收
章节“WinUI 验收”先验证 C# 配置服务与 Rust Runner 的既有文件协议,再证明 UI 和安装器。已有入口:
pwsh -NoProfile -File scripts/windows/Invoke-WinUI.ps1 -Action Testpwsh -NoProfile -File scripts/windows/Test-WinUIContracts.ps1pwsh -NoProfile -File scripts/windows/Invoke-WinUI.ps1 -Action Publishpwsh -NoProfile -File scripts/windows/Test-WinUINativeUi.ps1pwsh -NoProfile -File scripts/windows/Invoke-WinUI.ps1 -Action SandboxTest 动作同时运行 SteamWrapper.Application.Tests 与 SteamWrapper.Windows.Tests,包含配置保真/冲突/替换失败、本地 Steam、封面偏好/下载/缓存服务、稳定 Runner 安装与共享文件位置测试,以及实际 Windows 图片解码器。Windows 测试项目直接链接生产解码器源码,不加载 WinUI 或创建窗口,不属于原生 UI 自动化。Test-WinUIContracts.ps1 从共享历史 fixture 开始,C# 单字段修改后由 Rust 比较完整 TOML 和 Profile;再用受控父子进程验证 C# 新配置的精确 argv、cwd、job/root 等待差别、退出码和错误日志。详情见 契约说明。测试驱动、fixture 及生成的用户目录都不进入发布目录。
封面回归使用一次性的 Steam/设置/缓存 fixture 与注入的 HTTP handler,不请求真实账号,也不写入真实游戏库。验证自定义/本地候选优先级与哈希布局、默认关闭与偏好持久化、离线缓存复用、取消/超时/404/限流及冷却、重定向白名单、有界字节/并发、缓存配额/过期/清理及无关文件保留。Windows 解码器测试涵盖有效 PNG/JPEG、截断容器、CRC 有效但 zlib 数据损坏的 PNG、尺寸/像素/字节限制、预先取消及可用 WebP codec 行为。codec 测试不证明行图片呈现、流畅编辑、语言布局或对话框取消,这些仍需 P0 实际 WinUI 验收。
目录分离新增 AppID 关联、库外运行路径保留和真实双库安装冲突回归,该实现轮 C# 共 49/49 通过。原生隔离保存、重新扫描和歧义新建配置也已验证;详见 目录分离验证记录。这些隔离结果本身不代表真实汉化迁移或成就触发通过。
后续默认英语/完整简体中文实现通过 59/59 项 C# 测试,其中新增 10 项本地化/偏好测试。两条默认英语测试先在旧服务中文消息上失败;UTF-8 BOM 偏好读取和嵌套 JSON 重复键拒绝也先失败再修复。测试覆盖英文与中文资源键和格式参数一致、已存在嵌套状态/错误切换、诊断和用户值不变、双语扫描/Runner 消息、规范语言持久化、未知字段与 profiles 保留、损坏/重复/过大 JSON 拒绝及 BOM 兼容。跨语言/Runner 契约和最终自包含发布通过。后续语言验收记录隔离的原生切换、重启保持、输入/profile 字节保留和图标检查;这些不是干净系统或真实 Steam 证据。
原生本地化验收应使用没有 ui-settings.json 的全新隔离数据根,确认首次启动跟随已支持的 Windows 界面语言,不支持时回退英语。打开配置编辑、添加参数并触发验证/状态消息,切换到简体中文再切回英语;检查应用自有标签、参数行、等待模式、既有状态、对话框和 picker 动作按钮文案同步变化,未保存的名称、路径、参数及已生成启动项保持不变。重开沙盒 Manager 检查持久化,并检查两种语言的换行、截断、键盘操作和对话框布局;检查发布目录的 zh-CN/SteamWrapper.Application.resources.dll。服务/资源测试不能替代原生呈现或发布完整性验证。
WinUI Manager 使用与 profiles.toml 同级的 ui-settings.json,language 为 en-US / zh-CN;兼容 en / zh-SG / zh-Hans,去除首尾空白且不区分大小写。没有键时跟随支持的系统界面文化(zh-CN、zh-SG 及明确的 zh-Hans),其余文化使用英语;已保存的明确选择优先,无效明确值或无法读取的设置回退英语。读取或仅保存封面偏好不会保存识别出的语言。保存成功后刷新界面而不重载正在编辑的配置;失败保留旧语言并报告错误,损坏的设置文件原样保留。系统 picker 自有文案和外部原始诊断保持原语言。测试必须使用一次性设置目录,不修改真实 AppData 或 Steam 配置。
当前 Windows CI 运行 C# 测试、跨语言 Runner 契约和发布检查。历史提交 3d322db 的 WinUI CI已通过;这是有日期的记录,不代表最新提交。托管 Windows Server 2025 构建不是 Windows 11 干净系统或原生 UI 验收。完整验收范围如下;本机 Unity 游戏及 9-nine 五部独立汉化版已另行通过 Steam 闭环,第一部另覆盖 CHS 启动器先退场景,过程与边界见 真实 Steam 验证。
| 范围 | 有效证据 |
|---|---|
| TOML 兼容 | C# 读取 Rust fixture、只改一个字段、保存后由 Rust 断言未编辑语义;包括省略 wait_mode=root、新建 job、别名键、未知字段/版本和所有现存枚举 |
| 保存安全 | 原子替换失败、备份失败、多写者/外部修改冲突、中断与旧文件保留;不以序列化成功代替无损保存 |
| 配置到运行 | C# 保存的配置驱动真实 Rust Runner fixture,断言 argv、cwd、launcher/child 等待与错误;不能只比较 TOML 文本 |
| 共享数据位置 | 核验现存 Runner/profile 与安装候选的句柄最终路径;重定向返回非就绪,候选失败保留旧文件,真实 junction 和合法路径形式仍可用 |
| WinUI 操作 | 真实原生窗口、原生 picker、取消、中文输入、键盘、缩放及错误恢复;旧 Dioxus DOM/RSX 断言不适用 |
| Windows 发布 | 干净 Windows 11 x64 VM 上自包含安装、稳定 Runner、覆盖更新/占用/降级保护、移动 Manager、卸载后既有启动项仍可用 |
| Steam apply/restore | 脱敏多用户 VDF fixture、Steam 运行保护、备份/复读、冲突和中断恢复、保留其他设置;私有格式需先核验 |
| 最终游玩体验 | 测试者在真实 Steam 人工记录运行状态、退出和时长更新;注明游戏、launcher、系统版本,不能由 fixture 结果替代 |
常规自动化使用隔离 Steam/用户数据。真实 Steam 验收须有用户明确授权;本次用户已授权不损坏游戏文件的 galgame 测试。原启动项、文件完整性与存档保护需单独记录,未解决的云同步冲突不能由测试流程自动选择覆盖。真实用户数据、完整 Steam 配置和本机测试备份不进入提交或 CI 产物。具体配置边界见 主方案。
真实验收中的 Manager 应从正常 Windows 资源管理器打开完整发布目录中的 SteamWrapper.Manager.exe,完成配置与稳定 Runner 安装后关闭,再由 Steam 启动游戏。本机 Codex 进程环境曾把字面上的 AppData 路径映射到包的 LocalCache;shell 或 Manager 没有 package identity,并不能排除此重定向。最终文件句柄路径才揭示两种视图不同。具体步骤见 共享数据路径与真实 Steam 验收,常规自动化继续使用隔离沙盒,mise 别名是可选项。
2026-09-07 的实际记录:The NOexistenceN of you AND me(AppID 2873080)在 12:46:03 形成 Steam 4268 → Runner 4624 → 游戏 19752 → Unity 12996,从标题界面正常退出后,Steam 在 12:53:33 记录三个子进程全部 exit 0;UI 回到“开始”、云显示最新,显示时长 11.2 → 11.4 小时,启动项已恢复为空。正常 Explorer 启动同一 Manager、在真实稳定目录配置安装后,原命令格式即成功,无需改动引号或斜杠规则。最终独立核对确认 35/35 个游戏文件及 4/4 份原存档 SHA-256 与初始基线一致,存档句柄路径未被重定向。此结果限于本机该款游戏,不扩大为其他游戏、干净 VM 或安装器通过。
2026-09-08 较早的隔离目录实测:9-nine 第二、三、四部和新章分别从 Steam 经稳定 Runner 运行库外汉化版,均确认中文开场、正常退出、Steam 运行状态和显示时长更新。第一部当时从现有原始入口启动即报产品 ID 检查处理启动失败,未到标题,也未开展 Steam 路径验收。该阶段失败记录保留,后续恢复 CHS 入口后的结果独立记录。
第一部恢复后,14:06:56–14:08:31 普通文件夹直启和 14:15:53–14:18:15 Steam → Runner → CHS → 游戏均通过中文开场与普通退出;CHS 先退出后,游戏与 Runner 仍继续约 2 分 21 秒。UI 确认 job,独立观察零采样错误、零元数据失败和最终无残留,完成本机该 CHS 场景的真实 launcher 先退门槛。日志只记录 CHS 和 Runner 的 exit 0;当前 job 实现返回启动器状态,实际游戏退出码未知,不能由 UI 或进程父子关系证明 Job 成员。
本次官方 68 文件、恢复的三个文件及其余非存档文件不变;启动前已有的四个存档差异单独记录,直接启动和 Steam 阶段各仅有五个 savedata 文件自然更新,24 份原始/检查点备份副本完整。五部共享 profile 已保存,临时 Steam 启动选项均恢复为空(第一部由字段缺失变为空字符串,语义相同)。第一部云始终开启、显示最新且无冲突,时长 36 → 38 分钟;成就 0/4,但未达到触发条件,不判定兼容失败。自然成就触发、汉化存档实际云同步、更广泛的启动器兼容性仍未验证。本轮没有产品源码改动,未重复编译和自动化全门禁。
当前实现分层
章节“当前实现分层”| 层 | 命令 | 验证内容 |
|---|---|---|
| Rust core / Runner | cargo test --locked --workspace |
TOML、VDF、路径、Steam 元数据、Launch Options 与平台 Runner 行为;无 GUI 依赖 |
| C# 服务 | Invoke-WinUI.ps1 -Action Test |
配置保真和安全写入、本地发现、语言/封面设置、有界封面请求/缓存、稳定 Runner 安装与共享数据位置 |
| Windows 图片解码器 | Invoke-WinUI.ps1 -Action Test |
生产解码器及 Windows codec;有效/损坏图片、资源限制与预先取消,不创建 WinUI 窗口 |
| C# / Rust 契约 | Test-WinUIContracts.ps1 |
未编辑语义全量比对,以及真实受控 Runner 的 argv/cwd、等待、退出和错误行为 |
| Windows 发布 | Test-WinUIPublish.ps1 |
自包含 Manager/Runner 资源与发布目录替换、恢复 |
| WinUI 交互 | 发布后运行 Test-WinUINativeUi.ps1;额外人工检查使用 Invoke-WinUI.ps1 -Action Sandbox |
可丢弃数据下实际窗口的 UIA 回归;其余选择器、输入、布局和玩家门槛单独限定范围 |
原生 UI 回归
章节“原生 UI 回归”完整发布后运行 pwsh -NoProfile -File scripts/windows/Test-WinUINativeUi.ps1,或可选的 mise run winui:native-test。包装脚本验证已有完整便携目录,以锁定依赖 restore/build SteamWrapper.NativeUi.Tests,再用新的可丢弃 Steam/用户数据夹具打开实际 Manager。它不重新发布 Manager、不构建安装器、不使用真实游戏库。-PublishDirectory 可选择具体的完整便携目录;已安装的版本目录会被拒绝。
执行需要解锁的交互 Windows 桌面,套件操作夹具窗口期间应保持该桌面可用。CI 仅编译这个开发用控制台 UIA 工具。WPF 引用用于取得 Windows 自动化 API,不是另一个 Manager 实现,也不进入应用包。托管服务会话中的编译不能记为原生测试通过。
首个切片检查英语启动、现有 AppID 不可改、切换语言时保留 Unicode 编辑、取消未保存导航/关闭窗口、外部保存冲突、重启后保留中文偏好/未知设置,以及未知 Runner 失败时不替换其字节。另覆盖取消原生目标选择器、CDN 关闭时选择/筛选封面缺失或损坏的本地游戏,以及成功保存后保留未知 TOML 并生成稳定 Runner 启动项。选择检查不能证明所有封面已正确呈现或网络请求为零。证据与窗口快照保存在 target/winui/native-ui/。工具仅正常关闭自己创建的夹具 Manager;未解决的夹具窗口与诊断文件会保留。中文输入法组合输入、显示缩放、可访问性/布局、剪贴板、实际下载/网络行为及更广玩家验收仍需单独证据。
**2026-10-03 本地记录:**包装脚本针对真正编译的 0.2.2 便携目录执行,10 项原生用例全部通过。三个可丢弃夹具分别覆盖普通编辑/重启、选择器/封面/成功保存流程和未知 Runner 失败。证据记录实际发布的 EXE/DLL/Runner/清单哈希及 cleanVm=false;成功保存另保留 TOML 注释、未知字段与备份字节。这是该切片的真实交互窗口证据,不代表 CI 原生执行、输入法/缩放/剪贴板、零 HTTP 或真实 Steam 验收。W1 仍未完成。
**2026-10-03 后续系统语言记录:**新增实际窗口用例在本机 zh-CN Windows 桌面的 0.2.2 产物上先失败,因为首次启动仍显示英语。真正编译的 0.2.3 在四个可丢弃夹具中通过 11 项原生用例,包括自动中文且不保存 language 偏好,以及已有的明确英文/中文重启流程。注入文化的服务测试另覆盖未支持/繁体文化、明确无效值、损坏设置及仅保存封面偏好。这改变首次启动默认行为,不代表输入法、缩放或干净客户端验收。
**2026-10-03 聚焦 0.2.4 记录:**WinUI 排队的 TextChanged 事件曾把刚载入且未改变的字段误标为未保存,阻断后续原生添加流程。修复后,真正编译的 0.2.4 发布通过本地游戏添加、手动 AppID 验证/添加、添加/导航时保留未保存编辑,以及键盘焦点/导航四个新增流程,另通过八个受影响的已有编辑用例,共 12 项实际窗口用例;六个夹具进程均正常退出。可用 Test-WinUINativeUi.ps1 -Cases add-local、manual-appid、dirty-add、keyboard、existing-editor 或 saved-editor 选择流程。键盘检查使用 HWND 消息并观察焦点,不证明物理键盘输入、中文输入法组合输入或 100%/150%/200% DPI 验收通过。W1 仍未完成。
安装器与签名命令
章节“安装器与签名命令”Invoke-WinUI.ps1 -Action Test 也运行部署库的进程/清单/日志回归。Test-WinUIInstallerScripts.ps1 不生成应用安装包,仅测试打包保护;Test-WindowsSigning.ps1 使用政策夹具和真实 Windows 信任失败,不申请签名。Test-RunnerSigningMetadata.ps1 检查已构建 Runner 的 PE,不执行它。这些检查进入日常 Windows CI。
完整发布后,Test-WinUIProductMetadata.ps1 检查全部七个自有 EXE/DLL 产品(含中文资源)及实际 x64/GUI NativeAOT Host。发布工作流要求此门禁,它不执行文件,也不证明发布者签名。
Test-WinUIHostLanguage.ps1 在新建的隔离程序/数据夹具中单独启动发布后的 NativeAOT Host,不传 --language、不注入文化。本机 zh-CN Windows 上,缺失及未含语言键的偏好最初失败,因为 Host 发布时启用了 invariant globalization;移除该模式后,包含显式英/中选择和损坏设置回退的五项全部通过。设置、配置和独立 Runner 夹具字节保持不变。隔离路由要求既有 test-root 授权,并将程序/数据路径限定在同一 sandbox;生产偏好位置不变。这是真实本机 Host 证据,不代表另一种系统文化或干净虚拟机。
完整 Publish 并安装已验证 Inno 工具后,Test-WinUIInstaller.ps1 在隔离程序/数据根目录运行真实安装/卸载及兼容 maintenance 回滚进程。默认下一版本输入是人工构造的元数据夹具。真实版本验收需冻结旧的完整目录,并用 -UpgradePublishDirectory 指向真正编译的新数字版本;命令与证据边界见安装器指南。版本标签及手动预览工作流执行隔离门禁并单独构建安装包;普通分支 CI 不打包安装器。本地真实版本通过仍不等于干净 Windows 11、原生向导/Explorer 或注册表/快捷方式/断电验收。
磁盘准入预算包含载荷文件、清单、原子启动器副本、有界状态/日志替换和 16 MiB 余量。回归先观察到短预算被错误接受,再验证空间不足时不激活或改变旧文件。七个隔离子进程停止用例在五个安装、两个恢复检查点使用 Environment.Exit(73),验证持久化回执/日志、操作系统释放租约、恢复/隔离残留及独立数据夹具不变。这是编译部署引擎的进程停止测试,不是整机断电、真实填满磁盘或注册表/快捷方式故障。版本清理仍待完成:直接扩展严格的旧状态/根目录结构会破坏旧二进制回滚,需要独立的兼容协议。
2026-10-03 新增卸载切片:编译后的进程夹具在卸载日志创建、版本隔离、停用、清理预约、部分自有文件删除和清理完成六个检查点,使用 Environment.Exit(73) 结束自己的进程。聚焦的 14 项卸载用例通过,覆盖持久化阶段恢复、租约释放、未知/已改变字节保留、独立数据保留及隔离保护;共享夹具改变后,原有七项安装/恢复进程停止用例另行通过。测试仅触及新建且严格归属的临时目录,不终止其他程序。复现命令为 dotnet test apps/deployment-windows/SteamWrapper.Deployment.Tests/SteamWrapper.Deployment.Tests.csproj --configuration Release --filter FullyQualifiedName~ProcessStopUninstallTests,TRX 记录位于 target/winui/test-results/uninstall-process/。这个聚焦结果不替代此前完整的 99 项套件,也不宣称本机完整跑过 113 项、Inno/注册表/快捷方式中断、真实磁盘耗尽或版本保留。
首次真实 0.2.2 → 0.2.3 安装器测试发现加入原始依赖许可后,长路径导致卸载拒绝。重点真实 Win32 回归复现了自有路径在隔离时由 248 增至 281 字符。修复对已核验的删除句柄采用 Unicode 扩展路径,保留所有权、哈希、大小、reparse/只读拒绝及锁定检查。修复后卸载/重装和独立数据保留通过;最终 Deployment 套件 99/99 通过,非法 root 的显式 CLI 语言也有实际进程覆盖。未修改 Windows 路径政策或玩家数据。
Test-WinUIInstallableReleaseScripts.ps1 验证明确的第 2 版创建/下载校验,同时保留第 1 版校验器。GitHub/CNB 发布器测试分别运行默认旧输入和 -Installable,使用可丢弃 API,不写真实网络。Test-SignPathConfiguration.ps1 验证草案/声明前置条件与精确签名目标,不提交或读取凭据。申请材料区分本地准备、外部批准及真实已签名产物验收。
**2026-10-03 本地真实版本记录:**经哈希核验的冻结 0.2.1 目录与真正编译的 0.2.2 载荷完成 13 个真实进程步骤,结果符合各自预期,包括英文安装、中文修复/升级、实际 maintenance 回滚 0.2.2 → 0.2.1、Inno 再升级、占用/未知文件/迟到自有文件锁拒绝,以及卸载/重装。numericUpgradeUsesSyntheticMetadataFixture=false;回滚保留 928 个自有版本文件及 maintenance/卸载器/夹具快捷方式的哈希,六个数据夹具始终未变。两套 Setup 及项目自有 PE 产品匹配其真实数字版本;当前 C#/Rust 契约另行通过。日志与 evidence.json 保存在 target/winui/installer acceptance 中文 ' <id>/。证据明确标记 unsigned=true、cleanVm=false。没有可用的干净 VM;这不代表 W2、完整中断/注册表/快捷方式恢复、旧版本清理或认证交付完成。
**2026-10-03 后续修正后的 0.2.2 → 0.2.3 记录:**冻结 0.2.2 目录与最终编译的 0.2.3 发布完成相同的 13 个真实进程步骤,包含长路径修正后成功卸载/重装。实际 maintenance 回滚 0.2.3 → 0.2.2 保留 1,066 个自有版本文件哈希和独立 maintenance/卸载器/快捷方式所有权,随后 Inno 再升级成功。六个数据夹具保持不变;升级为真实版本、本机未签名测试,cleanVm=false。该修正结果与保留的首次失败夹具分别记录,不代表剩余 W2 门槛完成。
**2026-10-03 真实 0.2.3 → 0.2.4 记录:**经核验的冻结 0.2.3 目录与编译后的 0.2.4 发布完成 13 个符合预期的真实 Inno/maintenance 步骤。实际 maintenance 回滚 0.2.4 → 0.2.3 保留 1,204 个自有版本文件哈希及维护程序/卸载器/快捷方式,随后 Inno 再升级。迟到的自有文件锁和未知文件拒绝卸载,后续正常卸载/重装通过,六个数据夹具始终未变。证据为 target/winui/installer acceptance 中文 ' f9b299a94e654ab78a528bd1ea227c37/evidence.json,记录 numericUpgradeUsesSyntheticMetadataFixture=false、unsigned=true、cleanVm=false。当前七个自有 PE 产品版本和五项实际 NativeAOT Host 语言另行通过;跨语言契约结果位于 target/winui-contracts/8091f4314b2a4d44af031837ef6ad933/results。此前记录继续保留,这不代表干净客户端、完整中断、版本保留或签名门槛完成。
2026-10-03 公开下载记录:版本 v0.2.3-preview.1已由成功的运行 37120893907发布。从官方公开 URL 下载全部七个附件,核对 GitHub API 长度/摘要与第 2 版元数据;七个自有 PE 产品版本均匹配 0.2.3,Setup 正确识别为未签名。下载的 NativeAOT Host 在本机 zh-CN Windows 上五项实际语言用例通过。证据为 target/winui/public-download/2d644b9cc4b344a78e2fc4a0d8c10e45/evidence.json,标记 signed=false、cleanVm=false、installedPublicSetup=false:此次只检查下载的公开 Setup,没有安装它。CNB 发布凭据未配置,二进制发布实际跳过,因此不公告 CNB 二进制下载。这是下载完整性和限定范围的本机 Host 证据,不代表发布者签名或干净客户端验收。
本地命令
章节“本地命令”按自己的方式安装 Windows 工具;mise 是可选项。SDK 要求及 PowerShell 入口见 Windows 开发环境。Rust workspace 只包含 core 与 Runner,Linux 不再需要 GTK/WebKit、Dioxus CLI、Xvfb 或桌面会话。
cargo fmt --all -- --checkcargo check --locked --workspacecargo test --locked --workspaceWindows 使用上文 WinUI 命令,并用 pwsh -NoProfile -File scripts/windows/Test-WinUIPublish.ps1 验证发布及恢复。Invoke-Build.ps1 -Action Doctor 检查 .NET/Rust/MSVC/SDK;-Action RustTest 执行 cargo test --locked --workspace;-Action Verify 在 Rust 检查后依次运行 C# Test、Test-WinUIContracts.ps1 和 WinUI Publish,遇错停止。它不调用 Dioxus、pnpm Native E2E 或自动原生 UI 验收。相关行为改变时,另加发布恢复和隔离原生交互检查。
自动预览和进程 fixture 必须把 STEAM_DIR、STEAMWRAPPER_E2E_ROOT、XDG_DATA_HOME、LOCALAPPDATA 指向一次性目录,不能为了通过回归改用真实 Steam 或用户数据。
已归档的 Dioxus Native E2E 证据
章节“已归档的 Dioxus Native E2E 证据”Dioxus 与 manager-core 已从当前 workspace 移除。归档实现和测试、管理服务和历史测试指南固定在 ca6a09e。它们的命令和依赖不再是当前指导,也不验证 WinUI。
2026-09-07 Windows 本机完成当时的 Rust workspace、Runner 进程测试、Dioxus check/release build 和 3 个 spec / 6 项 Native E2E。提交 3d322db 的 v2 完整 CI还通过 Windows/Ubuntu 与 Linux AppImage 检查;工具修复与边界见 归档环境记录。
2026-09-08 语言/图标实现通过 10 次隔离 Native E2E:原有 6 项、2 项语言/状态/错误用例,以及两个进程中的语言保存/重启。当时 Windows Rust workspace 共 43 项通过;依赖 C# 输出的契约在普通运行中有意忽略,另由 winui:contracts 通过。两个旧 Manager 包占其中 30 项,覆盖未知 JSON 数值保真、嵌套重复键拒绝和共同 64 层深度限制。TypeScript、E2E 工具、Dioxus check/release build 与 scoped strict Clippy 通过。分发记录保留旧 NSIS 内容检查及其边界。这些归档结果不能作为当前 WinUI 原生 UI 自动化、安装器或干净系统通过的证据。
Runner 稳定安装验证
章节“Runner 稳定安装验证”WinUI 的 RunnerInstaller在判定就绪前核验现存 Runner 与存在的 profiles.toml,并核验安装候选与安装后文件位置;缺少 profile 不影响独立健康检查。位置检查比较文件句柄最终路径与显式文件链接解析后的逻辑路径,发现重定向时返回非就绪并提示从资源管理器重新打开 Manager。现有 UI 仅在安装服务就绪后展示可复制启动项,Launch Options 字符串契约与 ProfileStore 保存算法未修改。
本次新增 9 条 位置回归:已安装 Runner 重定向、升级候选重定向且保留旧 Runner/清单/配置、首次安装候选重定向、仅 profile 重定向、路径查询失败、普通原生句柄、真实 junction 升级、中文/大小写/扩展前缀及 DOS/UNC 前缀规范化。四种重定向场景先观察旧实现错误返回就绪,再验证修复;最终 mise run winui:test 43/43 通过,winui:contracts 通过。红/绿证据位于忽略的 target/runner-location-tests/,本轮契约结果位于 target/winui-contracts/bfad46a031ff4713b378d875f6f2f621/results。
服务测试后另行验证了新版发布产物的原生行为:受重定向的工具环境启动 Manager 后出现位置警告,保存不展示启动项或复制按钮;普通 Explorer 启动新版 Manager 后保存成功,生成完全一致的既有启动项。该原生复核与上述服务/进程证据分别记录,不替代干净 VM 或安装器验证。
当前稳定 Runner 的安装安全由 C# Application 测试和跨语言契约覆盖。退役的 Rust manager-core 与 Dioxus UI 安装测试已归档,旧结果不能替代当前服务测试。
Runner 进程测试覆盖 Linux process_group、Windows Job Object,以及两平台的 process_name 边界。process_name 仅按进程名匹配,无法判断并发同名业务归属;它不是默认等待模式。
CI
章节“CI”v2-ci.yml 定义 Windows / Ubuntu 的 Rust core/Runner 格式/检查/测试门禁及平台进程测试。winui-windows.yml 在拉取请求与 main 中运行 C# Application 和 Windows 解码器测试、C# / Rust 契约、实际 WinUI 编译及原生 UI 工具的仅编译门禁;不在托管服务会话执行 UIA。日常 CI 还使用一次性文件/API fixture 运行发布替换、发布包安全和 mock GitHub/CNB 发布器测试,不向外部 Release 写入。它上传测试证据,不生成应用包。
winui-release.yml 在版本标签或明确请求的手动预览中重新执行完整门禁,再发布自包含应用,运行全部发布/恢复回归并检查完整布局。版本标签运行先验证源码/标签/版本和双语说明,再生成明确的 schema 2 包:Setup、portable ZIP、两份本地化说明、旧 portable 描述符、安装版描述符及校验和。标签运行可公开未签名 GitHub 预发布;手动运行只上传预览产物。发布边界和可选 CNB 镜像见发布准备。
旧 Dioxus Native E2E、AppImage job 与 NSIS release 链已移除。工作流声明不等于最新运行通过,须另行核验;手动发布工作流预览运行真实隔离安装器进程,本地原生 UI 自动化现有首个回归切片。完整原生验收、干净客户端交付和启用更新后的验收仍属于路线图。
限制
章节“限制”- C# 服务/契约和发布检查不能证明原生 UI、可访问性或干净 Windows 安装;原生 UI 工具仅证明在交互桌面实际执行的夹具用例,不等于整个 W1 门槛通过。
- 常规自动化不操作真实 Steam;真实验收需要授权、记录原启动项、保护存档、校验文件并恢复。一键应用/恢复 Launch Options 仍是后续功能。
- Runner 进程 fixture 仅证明对应平台和已测生命周期场景,不证明真实 Proton、breakaway、Unix daemonize/新 session 或 Steam Deck 兼容性。
- 当前预览包含完整的 Windows 自包含目录和单独的未签名安装器;隔离安装/卸载测试不能证明干净 Windows VM、原生向导或经过认证的更新验收。
- 上述 2026-09-07–09-08 Dioxus 记录是归档历史结果,不是当前 WinUI 证据。