测试(Testing)

基于 Unity的测试自动化框架(更多信息可参见 Unity documentation),我们为客户集成了一个测试扩展。所有测试场景都在一个脚本化资源中定义,允许您根据需要添加额外场景来扩展测试。

我们提供两个标准测试工具:

  1. 统计 Sink 上已销毁的 MU(Movable Unit):验证在 Sink 上销毁的模块化单元(MU(Movable Unit))数量。
  2. 统计通过传感器的 MU(Movable Unit):统计通过传感器的 MU(Movable Unit)数量。

请注意,物理行为可能因计算机而异,因此测试结果可能因您的机器与我们的测试环境而不同。

realvirtual.io 测试扩展允许您定义测试而无需编写自定义脚本或逻辑。

前提条件

默认情况下,测试未启用,因为它需要额外的 Unity包。要启用测试:

  1. 安装 Unity Test Framework
  • 通过 Unity Package Manager 安装 Unity Test Framework Version 1.1.33
通过 Unity Package Manager 安装 Unity Test Framework
  1. 设置编译器定义
  • 导航到 Project Settings > Player
  • Scripting Define Symbols 下,添加 REALVIRTUAL_TESTS
在 Project Settings 中启用测试

测试窗口

按照上述描述启用测试后,按照以下步骤运行和管理您的测试:

  1. 打开测试窗口
  • realvirtual.io 主菜单中选择 Testing。这将打开一个显示所有已定义测试的新窗口。
测试成功的测试窗口
  1. 查看测试状态
  • 已成功通过的测试将以绿色按钮指示。
  • 已失败的测试将以红色按钮显示,并且消息将提供附加信息。
有失败的测试窗口
  1. 运行测试
    • 点击 "Run Tests" 按钮执行所有已定义的测试。
    • 如果测试失败,您可以选择测试按钮打开与该测试关联的场景。
    • 筛选测试
    • 您可以定义筛选器来缩小显示的测试范围。
    • 当应用筛选器时,只有筛选后的测试会在您选择 "Run Tests" 时执行。

定义您自己的测试

要定义您自己的测试,请按照以下步骤操作:

  1. 创建测试场景列表
    • 在 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 实现,请按照以下步骤操作:

  1. 创建新的 MonoBehaviour:在新的 MonoBehaviour 脚本中实现 ITestCheck 接口。
  2. 实现 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 类,您可以扩展测试能力以满足您的特定需求。