测试注解与发现

基本信息

属性 值
包路径 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)。

相关条目