8.8 KiB
8.8 KiB
新增功能模块 / 模块重构
适用场景:新增模块、重大模块重构、核心架构能力演进。 不适用场景:小接口或轻量功能变更,请使用“功能变更”模板。
基本信息
- 模块 ID:Module-20260915-0001
- 模块名称:StellarX 核心库与自动化测试基础设施
- 状态:非 UI 与人工 UI 已验证,待提交
- 类型:模块重构 / 架构演进
- 所属系统 / 子系统:StellarX Core / Unit Test / UI Regression
- 版本 / 分支:当前工作区
- 环境:Windows + Visual Studio 2022 + MSVC v143 + EasyX
- 负责人:Codex 协作修改
背景与目标
- 背景:
- 原应用工程同时承担框架实现、示例入口和回归验证职责,框架代码与测试代码之间缺少明确边界。
- 本次全量缺陷修复涉及控件生命周期、重绘、事件循环、MBCS 文本和日志等多个核心模块,需要让应用、单元测试和真实 UI Fixture 复用完全相同的实现。
- 当前痛点:
- 核心框架源文件分散在应用工程中,难以单独复用和验证。
- 仅依赖手工启动窗口,无法稳定覆盖回调期间所有权变化、ASan 内存安全和多配置构建。
- UI 控件基于 EasyX 绘制,不是原生子窗口,UIA/WinAppDriver 无法直接按控件语义定位。
- 目标:
- 将框架实现集中编译为
StellarX.Core静态库。 - 建立纯逻辑单元测试、真实 EasyX Fixture 和外部 Win32 UI 驱动三层验证。
- 让 Debug、Release、Win32、x64 和 x64 ASan 使用统一的核心实现。
- 将框架实现集中编译为
- 非目标:[可选]
- 不在本次工作中将静态库改为 DLL。
- 不迁移到 Unicode,不改变 GUI 只能在主线程使用的约束。
- 不将 UI 测试改造成依赖 DPI 或字体的全图 golden image 测试。
模块边界
- 职责:
StellarX.Core.vcxproj编译Window、Control、Canvas、各类控件、Dialog、TabControl 和日志实现。- 主应用、Native Unit Test 和 UI Fixture 通过
ProjectReference使用同一份核心实现。 scripts/test.ps1统一组织 Unit、Render、UI、All 和 CI 测试入口。scripts/run-ui-tests.ps1负责启动 Fixture、注入鼠标输入、等待结果并保存诊断文件。
- 不负责什么:
- 不负责最终应用资源、业务示例和安装包制作。
- 不把
StellarX.Core.lib作为普通 GUI 应用用户的运行时 DLL。 - 不替代 EasyX、Visual C++ Runtime 等外部依赖的发布判断。
- 外部依赖:
- Visual Studio 2022、MSVC v143、Windows SDK。
- EasyX 图形库。
- Visual Studio Native Unit Test Framework。
- UI 套件需要可交互的 Windows 桌面,并会短暂切换前台窗口和移动鼠标。
- 对外能力 / API:
- 核心库对外 API 通过
StellarX.h汇总。 StellarX.Core本身是构建期静态库,不新增运行时动态加载接口。- 测试入口通过 PowerShell 参数和 Fixture 场景提供,不属于框架公共 API。
- 核心库对外 API 通过
- 关键数据 / 状态:
StellarX.Core.lib:框架实现的静态链接产物。StellarX.Tests.dll:Native Unit Test 产物。StellarX.UiFixture.exe:真实 EasyX UI 场景进程。TestResults/:TRX、JSON、PNG 和日志诊断产物。
设计说明
- 核心流程:
StellarX.Core.vcxproj编译框架头文件和源文件。imGui-easyX.vcxproj通过ProjectReference链接核心静态库,应用入口保留在z-testDome.cpp。StellarX.Tests和StellarX.UiFixture同样引用核心工程,避免测试复制另一份框架代码。- Release 构建将核心代码静态链接进目标可执行文件;运行时不要求单独加载
StellarX.Core.dll。
- 关键对象 / 类关系:
StellarX.Core.vcxproj:核心实现的构建边界。Window / Canvas / Control:窗口托管、控件所有权、事件和重绘基础。SxEventLoopInternal.h:批量事件处理测试辅助。SxTextInternal.h:MBCS 字符边界和密码掩码测试辅助。StellarX.Tests:不创建窗口的逻辑测试。StellarX.UiFixture:创建确定性 EasyX 窗口并导出状态和像素证据。
- 生命周期:
- 核心库在构建阶段生成,静态链接进应用或测试可执行文件。
- Unit 测试进程独立运行;涉及 UAF 的回归可在 ASan 配置中隔离执行。
- UI Fixture 按场景创建和关闭图形上下文,失败时由脚本保存证据并发送
WM_CLOSE。
- 事件 / 渲染 / 数据流:
- 逻辑测试使用 FakeControl、假时钟、假消息源和临时目录验证状态转移。
- UI 驱动程序通过
SendInput注入鼠标事件,通过SetWindowPos驱动窗口变化。 - Fixture 导出 JSON 状态和 EasyX 后备缓冲像素,脚本按关键像素不变量判断结果。
- 关键不变量:
- 应用、逻辑测试和 UI Fixture 必须链接同一份核心实现。
- ASan 产物与普通 Debug 产物使用独立目录。
- UI 场景串行执行,避免多个 EasyX 图形上下文争用桌面。
- UI 断言不依赖 DPI、字体抗锯齿和完整截图的像素一致性。
- 降级 / 回退策略:[可选]
- 没有交互桌面时,CI 只运行逻辑测试;设置
STELLARX_UI_TESTS=1且环境满足条件时才执行 UI。 - 全局 resize、Dialog 开关等场景保留整场景重绘兜底。
- 没有交互桌面时,CI 只运行逻辑测试;设置
实现与影响
- 关键实现点:
- 新增
StellarX.Core静态库工程和解决方案项目引用。 - 新增
StellarX.Tests、StellarX.UiFixture、PowerShell 测试脚本和诊断输出约定。 - 新增
SxEventLoopInternal.h、SxTextInternal.h两个仅供内部实现和测试使用的头文件。 - 核心控件采用稳定句柄、延迟变更事务和统一 geometry/coverage 处理。
- 新增
- 涉及文件 / 类 / 函数:
- 工程:
StellarX.Core.vcxproj、imGui-easyX.vcxproj、imGui-easyX.sln。 - 核心:
Control、Window、Canvas、Button、Label、TextBox、Table、Dialog、TabControl、SxLogger。 - 测试:
tests/StellarXTests.cpp、tests/UiFixture.cpp、scripts/test.ps1、scripts/run-ui-tests.ps1。
- 工程:
- 兼容性影响:
- 工程内部从直接编译框架源文件调整为引用
StellarX.Core。 - 本阶段同时包含破坏性公共 API 调整,迁移方式见
MIGRATION.md。
- 工程内部从直接编译框架源文件调整为引用
- 性能影响:
- 事件循环单轮最多处理 128 条消息,活动轮不固定休眠,空闲轮短暂休眠。
- 静态库不引入运行时动态分发开销;托管重绘仍按覆盖范围选择性提交并保留全局兜底。
- 风险点:
- EasyX UI 测试依赖前台交互桌面,不能作为无桌面 CI 的默认测试。
- 当前
Render入口复用 UI Fixture,尚未形成完全独立的进程内 Native Render 测试类别。 - 编译仍存在 EasyX
C4201、未使用变量和名称遮蔽等非阻断警告。
测试与验证
- 测试范围:
- 所有权事务、空 TabControl、Tab 索引、字体拥有权、MBCS 掩码、Tooltip tick、事件批处理和日志配置。
- Button、Label、TextBox、Canvas、Table、Dialog、TabControl 的真实 EasyX 重绘和 coverage 不变量。
- Debug x64、Debug x64 ASan、Release x64、Debug Win32,以及 KEY1 至 KEY6 编译。
- 验证步骤:
- 使用
scripts/test.ps1 -Suite NonUI验证四套逻辑配置、ASan 和 KEY1 至 KEY6 编译。 - 按
TESTING.md的人工 UI 清单验证 KEY1、KEY2、KEY4、KEY5、KEY6。 - 检查 TRX 和人工验收记录;只有明确允许自动 UI 时才使用
scripts/test.ps1 -Suite All。
- 验证结果:
- 2026-09-29 的 Debug x64、Debug x64 ASan、Release x64、Debug Win32 均为 15/15 通过。
- x64 ASan 未报告内存错误;KEY1 至 KEY6 均编译、链接通过。
- 2026-09-30 为
scripts/test.ps1补充 UTF-8 BOM 后,Windows PowerShell 5.1 下的NonUI全矩阵复验通过。 - 本轮未启动自动 UI Fixture;用户于 2026-09-30 手工完成 KEY1 至 KEY6,暂未发现明显问题。
- 2026-07-22 的 UI 六类场景三轮通过记录保留为历史证据;当前快照以 2026-09-30 的人工验收结果为准。
- 已知限制 / 遗留问题:[可选]
Render当前复用单轮真实 UI Fixture;后续可单独建立进程内渲染测试类别。- UI 自动化仍需要已解锁的交互式桌面。
- 本次未清理已有非阻断编译警告。
落地信息
- 关联功能变更 ID:[可选]
Feature-20260915-0001
- 关联 BUG / Fix:[可选]
- 本次以全量缺陷修复矩阵统一记录,未为每个历史问题重新创建重复 BUG/Fix 文档。
- Commit:
- 当前工作区未提交
- PR:[可选]
- 发布版本:[可选]
- 相关文档:[可选]