构建您的第一个游戏测试
游戏测试包含什么?
游戏测试是一个带有一组起始条件的微型环境,例如一组生物或物品。 当该环境在《我的世界》的世界中运行一段时间后,您可以运行条件代码来评估其是否满足您的期望。
构建游戏测试集需要通过一个行为包来构建您的游戏测试,并编写一些简单的 JavaScript 代码。
重要
游戏测试框架仍处于实验阶段。 与所有实验一样,您可能会在《我的世界》版本中看到功能的添加、删除和更改,而没有明显的高级警告。 查看《我的世界》更改日志以了解有关游戏测试框架任何更改的详细信息。
要了解有关实验功能的更多信息,请访问 《我的世界》基岩版中的实验功能
注意
由于游戏测试框架会频繁添加和更新功能,我们建议使用《我的世界》的最新测试版。 有关更多信息,请参阅《我的世界》测试版。 此示例的语法旨在与最新的测试版兼容。
要求
在开始本教程之前,建议完成以下内容。
游戏测试元素
在行为包中,每个游戏测试都包含以下几个元素:
- 一个结构,它定义了测试的物理环境以及任何起始实体。 在《我的世界》中,您可以通过设计新结构(通常在创造模式下)然后在附近放置一个结构方块来创建新结构。 然后您可以使用结构方块将结果保存到磁盘。 这将创建一个 .mcstructure 文件,您可以将其添加到您的测试中。
当游戏测试在《我的世界》中运行时,您的结构将被加载并扩展到《我的世界》。 应注意,此结构将在通常平坦广阔的世界中创建和运行,因此您需要确保所有生物都被围在您创建的结构中。
然后,游戏测试使用 JavaScript 代码来定义测试,包括:
- 测试注册:在环境中建立测试的少量代码。
- 测试设置:在已创建的结构环境中设置条件的附加代码。 通常,这将创建额外的生物。
- 测试验证:用 JavaScript 编写的附加代码片段,用于评估测试是成功完成还是失败。
建立了这个简单的基础,就可以用几行 JavaScript 代码加上一个《我的世界》结构来创建游戏测试。
开始构建自己的测试
首先,您需要从构建自己的行为包开始。 要开始构建您的行为包,请在 development_behavior_packs
文件夹中创建一个名为 startertests
的新文件夹。
重要
要构建和运行您自己的游戏测试,您必须使用《我的世界》的最新测试版(版本 1.16.230+)。 有关更多信息,请参阅《我的世界》测试版。
在 startertests
文件夹中,您还需要包含两个子文件夹:
structures
structures 用于保存 MCStructure 文件scripts
scripts 用于保存 JavaScript 文件
更新您的清单
您可以使用 startertests 文件夹中的 manifest.json 文件作为行为包清单的起点,如下所示:
{
"format_version": 2,
"header": {
"description": "Introductory tests for Minecraft GameTest Framework.",
"name": "Starter Hello World Tests",
"uuid": "1A2F42BD-98D4-4E0D-8E3F-934AB8A0C05E",
"version": [0, 0, 1],
"min_engine_version": [ 1, 14, 0 ]
}
}
行为包清单需要额外的元素来支持游戏测试。
modules
部分需要一个模块,添加在 header 部分下方,用于注册您的 JavaScript 代码入口点,如下所示:
"modules": [
{
"description": "Script that implements basic starter tests.",
"type": "javascript",
"uuid": "1A1B53FC-5653-4A75-91B7-9CDF027674AE",
"version": [0, 0, 1],
"entry": "scripts/StarterTests.js"
}
]
注意这个 module
的几个方面:
- 这个模块的类型是
javascript
。 -
`uuid` 需唯一,并专为您的项目生成。 有关用于生成新 UUID 的工具,请参阅[行为包简介](BehaviorPack.md)主题。
-
`entry` 属性指向一个 JavaScript 文件,其中包含您的游戏测试代码。
此外,您将需要建立对《我的世界》API 和游戏测试框架的依赖关系。 您可以通过在下面的 modules 部分下添加其他依赖项来执行此操作:
"dependencies": [
{
"uuid": "b26a4d4c-afdf-4690-88f8-931846312678",
"version": [ 0, 1, 0 ]
},
{
"uuid": "6f4b6893-1bb6-42fd-b458-7fa3d0c89616",
"version": [ 0, 1, 0 ]
}
]
警告
请注意,这里的 uuid
引用《我的世界》的核心组件。 您不应在 dependencies 部分中更改这些值。
重要
如您所见,游戏测试框架测试依赖于《我的世界》API 和游戏测试框架的“0.1.0”版本。 版本 0 表示这些功能仍然是实验性的。 与所有实验一样,随着时间的推移,我们将改进它们的功能,并且随着构建迭代,API 签名可能会在没有提前通知的情况下更改。 查看《我的世界》更新日志以了解更多更改历史记录。
带有游戏测试的行为包的完整清单文件如下所示:
{
"format_version": 2,
"header": {
"description": "Introductory tests for Minecraft GameTest Framework.",
"name": "Starter Hello World Tests",
"uuid": "1A2F42BD-98D4-4E0D-8E3F-934AB8A0C05E",
"version": [0, 0, 1],
"min_engine_version": [ 1, 14, 0 ]
},
"modules": [
{
"description": "Script that implements basic starter tests.",
"type": "javascript",
"uuid": "1A1B53FC-5653-4A75-91B7-9CDF027674AE",
"version": [0, 0, 1],
"entry": "scripts/StarterTests.js"
}
],
"dependencies": [
{
"uuid": "b26a4d4c-afdf-4690-88f8-931846312678",
"version": [ 0, 1, 0 ]
},
{
"uuid": "6f4b6893-1bb6-42fd-b458-7fa3d0c89616",
"version": [ 0, 1, 0 ]
}
]
}
游戏测试注册
每个游戏测试都需要一个脚本文件。 正如您在上一节中看到的,我们添加了一个带有 entry
属性的模块,该属性指向 JavaScript 文件:
"entry": "scripts/StarterTests.js"
当启用了游戏测试框架的世界打开并注册此文件时,您的游戏测试 JavaScript 文件将加载并执行。 在这里,您的代码的主要作用是注册下游的游戏测试。
请注意,当您对脚本或结构进行更改时,您将需要退出您的世界并重新加载。 如果有任何脚本错误,将在加载世界时显示。
要注册您的游戏测试脚本,需要使用 RegistrationBuilder 类。 您可以在 Registration Builder 中查看有关 Registration Builder 类的更多信息。
使用 RegistrationBuilder 的 JavaScript 示例行如下所示:
// Registration Code for our test
GameTest.register("StarterTests", "simpleMobTest", simpleMobTest)
.maxTicks(410)
.structureName("startertests:mediumglass"); /* use the mediumglass.mcstructure file */
这行代码在 StarterTests
测试组中建立了一个名为 simpleMobTest
的新测试。
它添加了一个额外的参数 (maxTicks
),表示这个测试可能需要 410 个节拍(20.5 秒)来运行。
最后,游戏测试指定了一个 MCStructure (startertests:mediumglass
)。 按照惯例,这会使《我的世界》使用行为包文件夹中的 MCStructure 文件,位于 /structures/startertests/mediumglass.mcstructure
。
JavaScript 的其余部分使用游戏测试 Helper 类在 simpleMobTest
函数中实际表达测试。
测试函数
测试函数将实际执行测试。 测试函数既为要运行的测试设置初始条件,又返回一个评估标准的附加测试函数。
示例测试:
import * as GameTest from "mojang-gametest";
import { BlockLocation } from "mojang-minecraft";
function simpleMobTest(test) {
const attackerId = "fox";
const victimId = "chicken";
test.spawn(attackerId, new BlockLocation(5, 2, 5));
test.spawn(victimId, new BlockLocation(2, 2, 2));
test.assertEntityPresentInArea(victimId, true);
// Succeed when the victim dies
test.succeedWhen(() => {
test.assertEntityPresentInArea(victimId, false);
});
};
在这个测试函数中需要注意几点:
- 您可以使用
spawn
方法在您的测试中创建新的生物。 - 在诸如 spawn 的 API 中使用的坐标是相对于 .MCStructure 的结构方块的坐标。
assert
如果方法中描述的条件不成立,assert 函数会导致代码停止执行。 其中,此代码断言鸡实体不再存在于结构中(assertEntityPresentInArea 方法中的false
通知函数,断言该实体不再存在于该处)。 如果在结构中的任何方块中找到一个,assert
代码将抛出错误。 但是,如果没有找到 chicken,我们将转到 test.succeed 代码行,并且测试通过。
完整的 JavaScript StarterTests.js 文件如下所示:
import * as GameTest from "mojang-gametest";
import { BlockLocation } from "mojang-minecraft";
function simpleMobTest(test) {
const attackerId = "fox";
const victimId = "chicken";
test.spawn(attackerId, new BlockLocation(5, 2, 5));
test.spawn(victimId, new BlockLocation(2, 2, 2));
test.assertEntityPresentInArea(victimId, true);
// Succeed when the victim dies
test.succeedWhen(() => {
test.assertEntityPresentInArea(victimId, false);
});
};
// Registration Code for our test
GameTest.register("StarterTests", "simpleMobTest", simpleMobTest)
.maxTicks(410)
.structureName("startertests:mediumglass"); /* use the mediumglass.mcstructure file */
要完成示例,您将需要使用结构方块来定义测试。
为此,请打开《我的世界》并以创造模式开始一个新世界来构建您的环境。 这是一个由玻璃方块构建的简单玻璃笔,专为我们的游戏测试构建:
接下来,您需要将其导出为结构。 在《我的世界》中运行以下命令:
/give @s structure_block
这将为您提供一个可以使用的结构方块。 在您的创作旁边放置一个结构方块,并使用结构方块弹出框来包围您的创作。 将其导出为 mediumglass.mcstructure
。
在您的行为包中,转到您的结构文件夹并创建一个名为 startertests 的子文件夹。
将此 mediumglass.mcstructure 文件放在名为 startertests 的子文件夹中。 确保匹配您在 JavaScript 代码中指定的大小写,因此将其全部小写。 将 mediumglass.mcstructure 文件复制到该文件夹。 您的文件夹应如下所示:
在游戏中运行测试
完成游戏测试行为包后,您想要在《我的世界》中尝试一下。 为此,请创建一个新的《我的世界》的世界。 对于这个新世界,您需要从创造模式开始,并开启游戏测试框架的实验。 您需要在您的世界中添加游戏测试行为包。 如果一切正常,您应该在创造世界时看到 Start Hello World 游戏测试行为包:
点击 Starter Hello World 行为包磁贴以将其激活。
重要
您还可能希望在您的环境中指定一些其他更改:
- 选择一个平坦的世界
- 保持一般难度(在完全和平的世界中,生物的工作方式不同)
加载世界后,使用 /gametest
命令运行测试。
要运行特定测试,请使用 /gametest run <classname>:<testName>
,如:
/gametest run startertests:simpleMobTest
下一步内容?
您已经创建了您的第一个游戏测试框架测试。 游戏测试允许您作为创建者扩展内容、运行实体并验证游戏机制。 您可以查看下方的游戏测试 API 以了解有关游戏测试框架中包含的内容的更多信息。