完成 StellarX 核心重构、缺陷修复与测试收口

This commit is contained in:
Codex
2026-09-30 01:23:18 +08:00
parent 9155a86a8a
commit 568ffc40eb
85 changed files with 5011 additions and 645 deletions
+119
View File
@@ -0,0 +1,119 @@
# StellarX 自动化测试
## 依赖
- Visual Studio 2022 MSVC v143、Windows SDK、Native Unit Test Framework。
- EasyX 已安装到当前 MSVC 环境。
- UI 套件需要已解锁的交互式 Windows 桌面,会短暂切换前台窗口并移动鼠标,结束后恢复鼠标位置。
默认工具路径为 `D:\vs2022`。其他安装位置可设置:
- `STELLARX_MSBUILD`:`MSBuild.exe` 的完整路径。
- `STELLARX_VSTEST`:`vstest.console.exe` 的完整路径。
## 命令
```powershell
.\scripts\test.ps1 -Suite Unit -Configuration Debug -Platform x64
.\scripts\test.ps1 -Suite NonUI
.\scripts\test.ps1 -Suite Render
.\scripts\test.ps1 -Suite UI
.\scripts\test.ps1 -Suite All
.\scripts\test.ps1 -Suite CI
```
- `Unit`:构建核心静态库并运行 VS Native Unit Test。
- `NonUI`:运行 Debug x64、Debug x64 ASan、Release x64、Debug Win32 和 KEY1 至 KEY6 编译,不启动或操作任何窗口。
- `Render`:运行确定性 EasyX fixture 和关键像素断言;当前与单轮 UI fixture 共用实现。
- `UI`:使用 `SendInput` 驱动 ownership、geometry、tooltip、tab、table、dialog 六类真实窗口场景。
- `All`:Debug x64、Debug x64 ASan、Release x64、Debug Win32、KEY1 至 KEY6 编译、UI 连续三轮。
- `CI`:默认运行 Debug x64、Release x64 和 Debug Win32;设置 `STELLARX_UI_TESTS=1` 后增加单轮 UI。
Windows MSVC AddressSanitizer 不支持 LeakSanitizer,因此脚本使用 `detect_leaks=0:halt_on_error=1`。ASan 产物独立写入 `build\x64\Debug-asan`,不会污染普通 Debug 构建。
`scripts/test.ps1` 使用 UTF-8 BOM 保存,确保 Windows PowerShell 5.1 能正确读取中文注释,不会把注释后的语句误判为注释内容。
## 覆盖范围
逻辑测试覆盖:
- 稳定句柄与回调期间 self/sibling/add/remove/clear 所有权变更。
- Tab 延迟新增、失败返还所有权、重复标题和页面激活状态。
- 字体名拥有权与内容比较。
- MBCS 密码掩码、非法尾字节容错。
- Tooltip 单调时钟 tick、禁用和移出清理。
- 1000 条消息的 128 条批处理上限、空闲休眠和关闭顺序。
- 日志配置原子切换与滚动行完整性。
UI/像素测试覆盖:
- 回调删除自身后旧区域恢复。
- Button、Label、TextBox、Canvas 的移动、缩放和隐藏残影。
- 静止 Tooltip 到期显示及移出清除。
- 同名页签唯一选中、唯一页面可见。
- 极窄 Table 的最小宽度和 coverage 外像素不变量。
- 两层异步 Dialog 先后关闭、下层可见且可继续交互。
## 诊断产物
所有产物位于未跟踪的 `TestResults\`:
- 单元测试:TRX。
- UI 成功:场景 JSON、`screen.png`、fixture 标准输出和错误日志。
- UI 失败:`driver-error.json`、`failure.png`,以及已生成的场景中间截图。
UI fixture 按 PID 和精确标题枚举 `EasyXWnd`,使用 `PrintWindow(PW_CLIENTONLY)` 获取不受遮挡影响的客户区像素,不使用 DPI 和字体敏感的全图 golden image。
## 人工 UI 验收
本轮收口不自动启动 UI。发布或推送前,由人工依次验证 KEY1、KEY2、KEY4、KEY5、KEY6;KEY3 只做启动兼容性冒烟。
### 构建与启动
推荐双击仓库根目录的 `Run-Key-Test.cmd`,输入 `1` 至 `6` 后,脚本会重新构建并启动对应场景。关闭测试窗口后会返回选择菜单,输入 `0` 退出;脚本只负责构建和启动,不会自动操作 UI。
也可以从 PowerShell 直接启动指定场景:
```powershell
.\scripts\run-key.ps1 -Key 5
```
若启动器不可用,将下面命令中的 `KeyScenario` 改为待测编号。每次构建完成后手动启动生成的程序:
```powershell
$msbuild = 'D:\vs2022\MSBuild\Current\Bin\MSBuild.exe'
& $msbuild .\imGui-easyX.vcxproj /m /t:Rebuild /p:Configuration=Debug /p:Platform=x64 /p:KeyScenario=1 /p:EnableAsan=false /v:minimal
.\build\x64\Debug\imGui-easyX.exe
```
### 通用通过标准
- 窗口可正常启动、缩放、最大化、还原和关闭,无崩溃、卡死或断言。
- Hover、按下、释放和 Tooltip 状态及时变化,鼠标移出后不残留高亮、文字或浮层。
- 切页、分页、移动或缩放后无旧像素、黑块、重影、错层和控件穿透。
- 一次点击只触发一次结果;禁用控件不触发回调;模态对话框阻止底层交互。
### 必测场景
| 场景 | 操作 | 通过标准 |
|---|---|---|
| KEY1 | 进入页签 1,点击页内“按钮”重置表格,不移动鼠标立即观察分页区;连续重置三次并执行上一页、下一页;点击外部 `test` 多次激活同一页,再依次切换三个页签 | 重置后的首帧立即完整显示“第1页/共2页”,不依赖 hover 或后续重绘恢复;重复激活不闪烁;Table 超出页面区域的内容在切页后完全清除;无残影或层级错乱 |
| KEY2 | 拉宽、缩窄、最大化并还原窗口;点击多个位按钮,执行位取反、左移、右移、一键置 0/1 和有符号切换 | 32 位“位号 + 按钮”始终对齐;五个区块铺满且不重叠;十六进制、十进制、上次值、本次值立即同步 |
| KEY4 | 打开非模态对话框,在顶部按钮、页签和分页区快速移动鼠标;再打开模态对话框并拖动窗口,随后关闭 | 遮挡区不发生 Hover/Tooltip 穿透;标题、关闭按钮和底层背景无残影;关闭后底层 Hover 立即恢复 |
| KEY5 | 在三层 Canvas、两个页签及其页内按钮间移动和点击;触发各处 Tooltip;操作 Table 分页按钮并观察粉色浮层 | 深层按钮状态正常;Tooltip 出现和清除完整;页签与页面层级正确;Table 重绘不会擦除或覆盖上层浮层 |
| KEY6 | 点击圆形和椭圆按钮的内部及外接矩形角落;点击禁用按钮;切换右侧页签并操作页内控件;分别验证 YesNo、RetryCancel、AbortRetryIgnore | 形状外区域不误触发;禁用按钮不改变状态;右侧页签布局稳定;消息框结果正确,非模态关闭后无残留且底层 Hover 恢复 |
| KEY3 | 启动后完成登录页和旧业务页的基本切换 | 能正常进入和切换,无明显布局或交互倒退 |
### 本轮验收记录
- 验收日期:2026-09-30
- 验收方式:用户按上述清单手工执行 KEY1 至 KEY6。
- 验收结论:全部场景已完成,当前快照暂未发现明显问题。
- 自动复验:2026-09-30 使用 Windows PowerShell 5.1 执行 `NonUI`,四种配置均为 15/15 通过,KEY1 至 KEY6 编译链接成功。
- 说明:该结论代表本轮人工回归通过,不等同于对所有运行环境和未覆盖路径作无缺陷保证。
### 失败留证
- 记录 KEY 编号、窗口尺寸、操作顺序和实际现象。
- 截取包含整个客户区的截图;闪烁或延迟问题录制短视频。
- 若崩溃,保留 Visual Studio 调用栈和当次日志,不继续把该快照标记为 UI 通过。