测试(Testing)
基于 Unity的测试自动化框架(更多信息可参见 Unity documentation),我们为客户集成了一个测试扩展。所有测试场景都在一个脚本化资源中定义,允许您根据需要添加额外场景来扩展测试。
我们提供两个标准测试工具:
- 统计 Sink 上已销毁的 MU(Movable Unit):验证在 Sink 上销毁的模块化单元(MU(Movable Unit))数量。
- 统计通过传感器的 MU(Movable Unit):统计通过传感器的 MU(Movable Unit)数量。
请注意,物理行为可能因计算机而异,因此测试结果可能因您的机器与我们的测试环境而不同。
realvirtual.io 测试扩展允许您定义测试而无需编写自定义脚本或逻辑。
前提条件
默认情况下,测试未启用,因为它需要额外的 Unity包。要启用测试:
- 安装 Unity Test Framework:
- 通过 Unity Package Manager 安装 Unity Test Framework Version 1.1.33。

- 设置编译器定义:
- 导航到 Project Settings > Player。
- 在 Scripting Define Symbols 下,添加
REALVIRTUAL_TESTS。

测试窗口
按照上述描述启用测试后,按照以下步骤运行和管理您的测试:
- 打开测试窗口:
- 从 realvirtual.io 主菜单中选择 Testing。这将打开一个显示所有已定义测试的新窗口。

- 查看测试状态:
- 已成功通过的测试将以绿色按钮指示。
- 已失败的测试将以红色按钮显示,并且消息将提供附加信息。

- 运行测试:
- 点击 "Run Tests" 按钮执行所有已定义的测试。
- 如果测试失败,您可以选择测试按钮打开与该测试关联的场景。
- 筛选测试:
- 您可以定义筛选器来缩小显示的测试范围。
- 当应用筛选器时,只有筛选后的测试会在您选择 "Run Tests" 时执行。
定义您自己的测试
要定义您自己的测试,请按照以下步骤操作:
- 创建测试场景列表:
- 在 Unity Project 窗口中,在所需项目文件夹中右键单击。
- 从上下文菜单中选择 Create > realvirtual > TestScenes。
- 默认测试场景:
- 提供的默认测试场景位于
realvirtual > private > Resources > Testing下。
添加您希望在测试设置中包含的每个测试场景。对于列出的每个场景,确保 "Run Scene" 复选框设置为 true。此设置指定场景应作为测试过程的一部分执行。
测试窗口将自动检测项目中的所有 Test Scene List 资源。

为测试准备场景
要为测试准备场景,您需要在每个测试场景中包含一个 Test Model Controller。您可以通过使用位于 realvirtual > private > Resources > Testing 下的预制体将此控制器添加到项目中。
Test Model Controller
Test Model Controller 管理多个测试参数:
- Run Test:确定是否应执行测试。
- TimeScale:调整测试运行的速度,允许比实时更快或更慢地运行。
- Test Time:以秒为单位指定测试的持续时间。
- Fixed Timestep:设置测试期间使用的固定时间步长。
您可以通过选择 Run Test 手动启动测试(这仅适用于当前场景)。Test Model Controller 还将调用所有实现 ITestCheck 接口的方法。
标准 ITestCheck 实现
我们提供两个 ITestCheck 接口的标准实现:
- TestSensorCount:统计通过附有
TestSensorCount的传感器的模块化单元(MU(Movable Unit))。Test Model Controller 自动检查场景中的所有TestSensorCount组件。 - TestSinkCount:统计由附有
TestSinkCount的 Sink 销毁的 MU(Movable Unit)。Test Model Controller 自动检查场景中的所有TestSinkCount组件。
实现您自己的 ITestCheck
要创建自定义的 ITestCheck 实现,请按照以下步骤操作:
- 创建新的 MonoBehaviour:在新的 MonoBehaviour 脚本中实现
ITestCheck接口。 - 实现
Check方法:定义Check方法,如果测试成功返回空字符串,如果测试失败返回描述性消息。
以下是用于统计传感器事件的自定义 ITestCheck 示例实现:
namespace realvirtual
{
using NaughtyAttributes;
using UnityEngine;
public class TestSensorCount : MonoBehaviour, ITestCheck
{
[InfoBox("This is just for internal realvirtual.io Development and Test automation", EInfoBoxType.Warning)]
public int DueSensorCount; // Expected count of MUs passing the sensor
public int Tolerance = 0; // Allowed tolerance in the count
public string Check()
{
// Get the current count of MUs passing the sensor
var counter = GetComponent<Sensor>().Counter;
// Calculate the difference between the expected and actual count
int difference = Mathf.Abs(counter - DueSensorCount);
// Check if the count is within the allowed tolerance
if (difference <= Tolerance)
{
return ""; // Test passed
}
else
{
// Return a descriptive failure message
if (Tolerance == 0)
return "Sensor count at " + this.name + " is " + counter + " but should be " + DueSensorCount;
else
return "Sensor count at " + this.name + " is " + counter + " but should be within " + Tolerance + " of " + DueSensorCount;
}
}
}
}
要点
- 附加到组件:您可以将此脚本附加到场景中的任何相关组件。
- 自动调用:一旦测试时间结束,
Check方法将由Test Model Controller自动调用。 - 成功和失败:成功测试返回空字符串,如果测试失败返回描述性消息。
通过实现您自己的 ITestCheck 类,您可以扩展测试能力以满足您的特定需求。