测试

Rabbit 现在使用一个轻量的仓库内测试入口。测试文件按资源边界分类,入口会逐文件启动 AutoHotkey 子进程,因此一个测试文件的窗口、热键或原生资源不会污染其他文件。现有 RunTest、断言和直接运行方式仍然保留。

测试结构

位置 内容 运行边界
tests/unit/ 纯模型、配置、数据转换和可控的业务逻辑 默认套件;不依赖真实 Rime 或人工窗口
tests/component/ Rabbit 模块与 Windows 原生资源、窗口、字体或 Direct2D 的组合 独立进程;按改动选择性运行
tests/integration/ 真实 Rime、部署、持久化和跨模块流程 需要 DLL、测试数据和桌面环境
tests/packaging/ 编译资源、嵌入资源生命周期和编译后 DLL 选择 需要 Ahk2Exe、对应 base 和 Rime DLL;按 x86/x64 单独运行
tests/manual/ 候选窗和设置预览等需要人工观察的测试 不属于默认或 all 套件
tests/benchmark/ 性能探针 单独运行,不作为功能测试
tests/support/ RabbitTestPlanRabbitTestRunner 和兼容的 RabbitTestCommon 测试基础设施
Lib/*/tests/ 子模块自己的测试 保持子模块边界,由 Rabbit 入口提供可发现的适配项

tests/unit/RabbitTests.ahk 仍然是旧的聚合入口,供现有脚本和用户兼容使用;新的统一入口不会再依赖它的 include 列表。新增测试只需放入最合适的目录并使用 RunTest 注册,不需要修改聚合文件。

统一入口

查看可发现的测试:

AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --list

默认运行单元测试;也可以按套件、名称、标签筛选,并生成 CI 可消费的 JUnit 报告:

AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk
AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite component
AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite integration
AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite all --filter Settings
AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite manual --tag visual
AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite unit --junit tests\results\unit.xml

--suite all 包含 unit、component、integration 和 submodule,但排除 packaging、manual、benchmark。每个测试文件有独立的超时边界,默认 120 秒,可用 --timeout 30000 覆盖。标签可用 --tag ci--tag gui--tag visual 筛选;标签只决定选择,不改变测试的进程隔离边界。

当前标签按测试资源和运行环境表达:unit/headless/cicomponent/windowsguiintegration/rimepackaging/compiled/cimanual/visualbenchmark/performance;RimeDepot 与子模块适配项还带有 rimedepotsubmodule 等标签。

候选窗测试的参数场景仍然可以直接运行:

AutoHotkey.exe /ErrorStdOut tests\component\RabbitCandidateBoxTest.ahk factory-modern
AutoHotkey.exe /ErrorStdOut tests\component\RabbitCandidateBoxTest.ahk floating-preedit-placement

单元、组件和集成测试

单元测试适合快速验证纯逻辑。组件测试可能创建原生窗口、字体或 Direct2D 资源;集成测试还会初始化真实 Rime。运行后者前准备匹配当前 AutoHotkey 位数的 Lib\librime-ahk\rime.dll、专用 Data/ 和可写的 Rime 用户目录。GUI 测试需要交互式桌面,不能以无桌面 CI 的通过作为人工视觉回归的替代。

修改绑定层时,继续使用 librime-ahk 自己的入口:

AutoHotkey.exe /ErrorStdOut Lib\librime-ahk\tests\rime_test_main.ahk

RimeDepot 的核心和 GUI 测试也保留其子模块入口;它们不会混入 Rabbit 的 unit 聚合。

编译资源测试已迁移为 packaging 套件;生成嵌入资源的底层脚本仍然是 PowerShell,本地可这样运行:

AutoHotkey.exe /ErrorStdOut tests\RabbitTestMain.ahk --suite packaging `
    --compiler path\to\Ahk2Exe.exe `
    --base path\to\AutoHotkey64.exe `
    --rime-dll path\to\rime-x64.dll `
    --architecture x64

它会临时生成编译资源、编译探针并检查共享资源、旧版安装脚本、DLL 选择和错误路径;结束后会恢复生成的 Rabbit include 和环境变量,隔离的编译产物位于 dist/

按改动选择测试

改动范围 最小建议
配置解析、命令行、纯模型或数据转换 tests\RabbitTestMain.ahk --suite unit --filter <name>
候选布局、输入、字体或 Direct2D 对应 unit/component 测试,加上 manual 预览和人工候选窗检查
设置页面、配色、预览、词典或部署 对应 component 测试,再按需运行 integration 或 manual
librime-ahk API、结构体或回调 Lib\librime-ahk\tests\rime_test_main.ahk,以及受影响的 Rabbit 测试
编译资源、DLL 搜索、发行包目录 tests\RabbitTestMain.ahk --suite packaging ... --architecture x86/x64
仅文档 mkdocs build --strict;不需要运行应用测试

应用 CI 的 test-rabbit 作业使用统一入口运行 Rabbit 的 unit 套件和需要保留的 RimeDepot 测试;编译构建作业则在 x86/x64 矩阵中运行 packaging 套件。普通 component/integration GUI 测试不会因为 unit 通过而自动执行。修改界面、候选窗或部署流程时,不能只以 CI 的 unit 结果代替本地人工回归。

测试失败与人工验证

新增单元测试时,按现有测试文件的方式使用测试运行器 RunTest,并根据终端中的失败用例和错误信息定位问题。单元测试与集成测试分别运行,集成测试需要额外准备匹配的 Rime DLL、本地数据和窗口环境。

启动 Rabbit.ahk 或已编译程序进行人工验证时,按普通应用行为检查输入、托盘、候选窗、设置和部署流程。至少覆盖普通启动、托盘打开设置、重新部署、同步、方案切换和退出;如果改动候选窗,还要分别检查现代后端和配置/系统触发的旧版后端。自动化测试应使用测试脚本已有的隔离和清理逻辑,不要为了测试改动发布入口脚本面向用户的默认异常行为。