测试注解与发现
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | com.gtnewhorizons.horizonqa.api.annotation |
| 注解数量 | 5(GameTest / GameTestHolder / BeforeBatch / AfterBatch / MethodSource) |
| 保留策略 | RUNTIME(可被 ASM 数据表扫描) |
| 发现入口 | GameTestRegistry.discoverTests(asmData)(CommonProxy.java:104) |
| 日志标记 | 启动时输出 Discovering tests...(CommonProxy.java:103) |
功能
Horizon-QA 用运行时注解 + FML ASMDataTable 发现测试,不需要任何中心注册表。
被 @GameTestHolder 标注的类里的 @GameTest 静态方法会自动被发现。
@GameTestHolder(类级)
标注持有测试方法的类(GameTestHolder.java):
| 成员 | 类型 | 默认值 | 说明 |
|---|---|---|---|
value() |
String |
必填 | 模板命名空间,通常是 mod id |
templatePrefix() |
String |
"" |
模板名前缀 |
requiredMods() |
String[] |
{} |
必需 mod 列表;任一缺失则该 holder 全部测试标记为跳过,且不加载 holder 类(GameTestHolder.java:20-25) |
@GameTest(方法级)
标注静态测试方法,签名为 void testName(GameTestHelper helper);若同时标注 @MethodSource,
可在 GameTestHelper 之后声明参数化参数(GameTest.java:8-10)。
| 成员 | 类型 | 默认值 | 说明 |
|---|---|---|---|
template() |
String |
"" |
结构模板名,相对 holder 命名空间解析 |
timeoutTicks() |
int |
100 |
最终 END 阶段之后允许观察的完整服务端 tick 数(GameTest.java:16-17) |
batch() |
String |
"" |
批次名;同批次测试与 @BeforeBatch / @AfterBatch 一起运行 |
required() |
boolean |
true |
为 false 时本测试失败不影响整体运行结果(GameTest.java:20-21) |
rotation() |
int |
0 |
结构旋转:0 不旋转、1 顺时针 90°、2 180°、3 顺时针 270°(Y 轴),遵循 Minecraft 结构放置约定(GameTest.java:23-27) |
批次注解
@BeforeBatch/@AfterBatch:在同批次测试运行前 / 后各执行一次@MethodSource:为测试方法提供参数化入参
发现结果
GameTestRegistry.discoverTests 返回 GameTestCatalog,其中包含:
tests()— 全部有效测试testIds()— 有效测试 id(run的 Tab 补全来源)selectorCandidates()— 选择器候选(runall的 Tab 补全来源)templateNames()— 可加载模板名(load的 Tab 补全来源)findTest(id)/findInvalidTest(id)/matchingTests(selector)— 查询入口
用法(HorizonQACommand.java:146-165、239、251)。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 注解数量 | 5 | api/annotation/ 目录(5 个 .java) |
@GameTest.timeoutTicks() 默认 |
100 | GameTest.java:17 |
@GameTest.rotation() 范围 |
0–3 | GameTest.java:26 |
@GameTest.required() 默认 |
true | GameTest.java:20 |
@GameTestHolder.requiredMods() 默认 |
空数组 | GameTestHolder.java:23 |
交互
发现发生在 FMLServerStartingEvent 阶段(CommonProxy.java:92-105):
asmData 在 preInit 中捕获(CommonProxy.java:76),到 serverStarting 才用于发现。
若选中测试为空且不允许空跑,会生成一条 noSelectedTests 基础设施问题
(CommonProxy.java:112-118),日志级别为错误(HorizonQACommand.java:170-179)。
对被排除的测试,/horizonqa run <id> 会通过 findInvalidTest 找到并报告具体原因
(HorizonQACommand.java:189-194、957-981)。
相关条目
- GameTestHelper API - 测试方法体内可用的断言与世界操作
- GTNH 多方块 API - 面向 GregTech 机器的扩展 helper
- 结构模板与导出 -
template()与rotation()指向的模板 - 测试执行与状态机 - 注解发现的测试如何被调度运行