PackTest

PackTest

用于测试数据包的Fabric模组,支持数据包!

管理

PackTest

PackTest 允许你在数据包中编写游戏测试。测试文件是 test 文件夹中的 *.mcfunction 文件。它们可用于测试自定义数据包。

示例

data/example/test/foo.mcfunction

#> 召唤一个盔甲架并找到它
# @template example:small_platform
# @optional

summon armor_stand ~1.5 ~1 ~1.5
execute positioned ~1.5 ~1 ~1.5 run assert entity @e[type=armor_stand,dx=0]

assert predicate example:test

setblock ~1 ~1 ~1 grass_block
execute if block ~1 ~1 ~1 stone run succeed

fail "Oh no"

异步测试

测试函数可以是异步的,使用 await 关键字!

setblock ~ ~ ~ stone
summon item ~ ~6 ~

await entity @e[type=item,distance=..2]

await delay 1s

data merge entity @e[type=item,distance=..2,limit=1] {Motion: [0.0, 0.01, 0.0]}

运行测试

测试可以在游戏内使用 test 命令运行。

  • test runall:运行所有测试
  • test runall <namespace>:运行指定命名空间的所有测试
  • test run <test>:运行指定名称的测试
  • test runfailed:运行所有之前失败的测试
  • test runthis:运行最近的测试
  • test runthese:运行 200 格范围内的所有测试

自动测试服务器

测试也可以自动运行,例如在 CI 环境中。当设置了 -Dpacktest.auto 时,游戏测试服务器将自动启动并加载测试。当所有测试完成时,进程将退出,退出代码设置为失败测试的数量。

设置 -Dpacktest.auto.annotations 将为所有测试失败和资源加载错误输出 GitHub 注解。

以下示例可以改编为 GitHub 操作工作流。

on: [push, pull_request]

env:
  # 确保更新这些链接!
  TEST_FABRIC_SERVER: https://meta.fabricmc.net/v2/versions/loader/1.20.4/0.15.3/0.11.2/server/jar
  TEST_FABRIC_API: https://cdn.modrinth.com/data/P7dR8mSH/versions/JMCwDuki/fabric-api-0.92.0%2B1.20.4.jar
  TEST_PACKTEST: https://cdn.modrinth.com/data/XsKUhp45/versions/18smpIeE/packtest-1.6-mc1.20.4.jar

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'
      - name: 下载并准备文件
        run: |
          curl -o server.jar $TEST_FABRIC_SERVER
          mkdir mods
          curl -o mods/fabric-api.jar $TEST_FABRIC_API
          curl -o mods/packtest.jar $TEST_PACKTEST
          mkdir -p world/datapacks
          cp -r datapack world/datapacks/datapack
      - name: 运行测试
        run: |
          java -Xmx2G -Dpacktest.auto -Dpacktest.auto.annotations -jar server.jar nogui

命令

fail

  • fail <文本组件>:使当前测试失败并从函数返回

succeed

  • succeed:始终使当前测试成功并从函数返回

assert

  • assert <条件>:如果条件不成立,则使当前测试失败并从函数返回
  • assert not <条件>:如果条件成立,则使当前测试失败并从函数返回

await

  • await <条件>:与 assert 类似,但每 tick 持续尝试该条件,直到测试超时或条件成立
  • await not <条件>:持续尝试该条件直到其失败
  • await delay <时间>:等待指定时间(带单位)

条件

  • block <位置> <方块>:检查指定位置的方块是否匹配方块谓词
  • data ...:使用与 execute if score 相同的语法检查 NBT 数据
  • entity <选择器>:检查选择器是否匹配任何实体(也可以查找结构边界之外的实体)
  • predicate <谓词>:检查数据包中的谓词
  • score ...:使用与 execute if score 相同的语法检查分数
  • chat <模式> [<接收者>]:检查过去一个 tick 内是否发送了匹配正则表达式模式的聊天消息

假玩家

可以使用 /dummy 命令生成假玩家。假玩家不会从磁盘保存或加载数据,也不会加载皮肤。

  • dummy <名称> spawn:生成一个新的假玩家
  • dummy <名称> respawn:在假玩家被击杀后重新生成
  • dummy <名称> leave:使假玩家离开服务器
  • dummy <名称> jump:使假玩家跳跃(如果当前在地面上)
  • dummy <名称> sneak [true|false]:使假玩家潜行或取消潜行(不等同于当前蹲下状态)
  • dummy <名称> sprint [true|false]:使假玩家疾跑或取消疾跑
  • dummy <名称> drop [all]:使假玩家丢弃当前主手物品,可以是一个物品或整组物品
  • dummy <名称> swap:使假玩家交换主手和副手物品
  • dummy <名称> selectslot:使假玩家选择不同的快捷栏槽位
  • dummy <名称> use item:使假玩家使用手中的物品(主手或副手)
  • dummy <名称> use block <位置> [<方向>]:使假玩家对方块位置使用手中的物品
  • dummy <名称> use entity <实体>:使假玩家对实体使用手中的物品
  • dummy <名称> attack <实体>:使假玩家用主手攻击实体
  • dummy <名称> mine <位置>:使假玩家挖掘方块

指令

可以通过在测试函数开头放置特殊注释形式的指令来自定义测试。

  • @template:用于测试的结构模板的资源位置,默认为空的 1x1x1 结构
  • @timeout:指定超时时间的整数,默认为 100
  • @optional:是否允许此测试失败,默认为 false,如果指令后没有值则视为 true
  • @dummy:是否在测试开始时生成假玩家并将 @s 设置为该假玩家,可接受一个位置参数,默认为 ~0.5 ~ ~0.5
  • @batch:此测试的批次名称,默认为 packtestBatch
  • @beforebatch:在此批次之前运行的命令,每个批次只能有一个
  • @afterbatch:在此批次之后运行的命令,每个批次只能有一个