- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 16,6 тыс.
- Подписчиков на Modrinth
- 21
- версий
- 45
- Обновлён
- 20 сентября 202620 сент.
- Опубликован
- в 2023
Коротко о моде
Ставится только на сервер; игрокам ставить не нужно
PackTest
PackTest позволяет писать игровые тесты в датапаке. Тесты — это файлы *.mcfunction в папке test. Их можно использовать для проверки собственных датапаков.
Пример
data/example/test/foo.mcfunction
#> Summons an armor stand and finds it
# @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 `: запускает все тесты из указанного пространства имён
- `test run `: запускает тест с указанным именем
test runfailed: запускает все ранее проваленные тестыtest runthis: запускает ближайший тестtest runthese: запускает все тесты в радиусе 200 блоков
Автоматический тестовый сервер
Тесты можно запускать и автоматически, например в CI. Если задан параметр -Dpacktest.auto, игровой тестовый сервер запустится сам с загруженными тестами. Процесс завершится, когда все тесты закончатся, а код выхода будет равен числу проваленных тестов.
Установка -Dpacktest.auto.annotations включает вывод аннотаций GitHub для всех провалов тестов и ошибок загрузки ресурсов.
Следующий пример можно адаптировать в workflow GitHub Actions.
on: [push, pull_request]
env:
# Make sure to update these links!
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: Download and prepare files
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 tests
run: |
java -Xmx2G -Dpacktest.auto -Dpacktest.auto.annotations -jar server.jar noguiКоманды
fail
- `fail `: проваливает текущий тест и выходит из функции
succeed
succeed: всегда завершает текущий тест успешно и выходит из функции
assert
- `assert `: если условие не выполняется, проваливает текущий тест и выходит из функции
- `assert not `: если условие выполняется, проваливает текущий тест и выходит из функции
await
- `await `: похоже на assert, но проверяет условие каждый тик, пока тест не истечёт или условие не выполнится
- `await not `: проверяет условие каждый тик, пока оно не перестанет выполняться
- `await delay `: ждёт указанное время с единицей измерения
Условия
- `block `: проверяет, соответствует ли блок в указанной позиции предикату блока
data ...: проверяет NBT-данные с тем же синтаксисом, что иexecute if score- `entity `: проверяет, соответствует ли селектор какой-либо сущности (также может находить сущности за пределами границ структуры)
- `predicate `: проверяет предикат в датапаке
score ...: проверяет счета с тем же синтаксисом, что иexecute if score- `chat []`: проверяет, было ли отправлено сообщение в чат за прошлый тик, соответствующее регулярному выражению
Dummies
Фейковых игроков можно создавать с помощью команды /dummy. Dummies не сохраняют и не загружают свои данные с диска, а также не загружают свой скин.
- `dummy spawn`: создаёт нового dummy
- `dummy respawn`: возрождает dummy после того, как его убили
- `dummy leave`: заставляет dummy покинуть сервер
- `dummy jump`: заставляет dummy прыгнуть, если он сейчас на земле
- `dummy sneak [true|false]`: заставляет dummy зажать shift или отпустить его (не то же самое, что присесть)
- `dummy sprint [true|false]`: заставляет dummy бежать или перестать бежать
- `dummy drop [all]`: заставляет dummy выбросить текущий предмет в основной руке — либо один предмет, либо весь стак
- `dummy swap`: заставляет dummy поменять местами предметы в основной и второй руке
- `dummy selectslot`: заставляет dummy выбрать другой слот хотбара
- `dummy use item`: заставляет dummy использовать предмет в руке — в основной или во второй
- `dummy use block []`: заставляет dummy использовать предмет в руке на позиции блока
- `dummy use entity `: заставляет dummy использовать предмет в руке на сущности
- `dummy attack `: заставляет dummy атаковать сущность предметом в основной руке
- `dummy mine `: заставляет dummy добыть блок
Директивы
Тесты можно настраивать, размещая определённые директивы в виде особых комментариев в начале функции теста.
@template: ресурсная локация шаблона структуры, используемого для теста, по умолчанию — пустая структура 1x1x1@timeout: целое число, задающее тайм-аут, по умолчанию100@optional: разрешено ли этому тесту провалиться, по умолчаниюfalse; если после директивы нет значения, считаетсяtrue@dummy: создавать ли dummy в начале теста и назначать@sэтому dummy, принимает позицию, по умолчанию~0.5 ~ ~0.5@batch: имя пакета для этого теста, по умолчаниюpacktestBatch@beforebatch: команда для выполнения перед этим пакетом, может быть только одна на пакет@afterbatch: команда для выполнения после этого пакета, может быть только одна на пакет
Частые вопросы
Как установить PackTest?
Установите Fabric под свою версию Minecraft, скачайте PackTest под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть PackTest?
У PackTest есть сборки для Minecraft 1.20.4–26.3.
Нужен ли PackTest на сервере?
Ставится только на сервер; игрокам ставить не нужно