unity Test Tools 测试

2015年09月22日 11:47 0 点赞 1 评论 更新于 2025-11-21 19:03

作者与原文链接

作者:孙广东 原文:http://www.taidous.com/forum.php?mod=viewthread&tid=33405&_dsign=b4c35b5c

相关资源链接

模型驱动测试框架

NUnit 和 NSubstitute 库

每个软件系统都包含多个功能单位。在面向对象的编程语言中,功能的最小单位是方法。这些方法通常依赖于其他方法和类,因此在测试方法时会面临一些挑战:

  1. 外部依赖项设置困难:某些对象可能需要复杂的初始化过程,这使得在测试时难以设置这些外部依赖项。
  2. 测试验证复杂:测试验证要求获取其他类中特定执行路径的某些行为,这增加了测试的复杂性。
  3. 环境变化不可回滚:调用外部类的方法可能会导致环境发生变化,且这些变化在某些环境中可能无法回滚,例如从数据库中删除一条真实记录。

单元测试是在孤立的环境中对单元功能进行测试,即与所有依赖关系隔离开来。这意味着测试是在特定的环境中进行的,只有一条执行路径是有效的。

测试双模式有五种:模拟虚拟对象(Dummy object)、测试桩(Test stub)、测试间谍(Test spy)、模拟对象(Mock)和伪对象(Fake)。

单元测试(Unit Tests)

单元测试的定义

在本文的上下文中,单元测试被定义为满足以下条件的测试:

  • 用代码编写。
  • 专注于单一的“事物”(方法/类)。
  • 没有“外部依赖项(external dependencies)”,例如不依赖于 Unity 编辑器,也不需要连接到在线服务数据库。

编写单元测试

要创建单元测试,该包使用 NUnit 框架,这是一个非常受欢迎的框架,可帮助创建和执行单元测试。此外,还包含 NSubstitute 框架,它用于模拟执行(例如在没有网络的情况下模拟网络执行),可以创建“假”对象。当“真实”对象由于依赖外部资源(文件、数据库、远程服务器等)而无法用于测试时,这些“假”对象会被传递给测试方法。

以下是一个简单的脚本来管理玩家生命值:

// A simple component that keeps track of health for game objects.
public class HealthComponent : MonoBehaviour
{
public float healthAmount;

public void TakeDamage(float damageAmount)
{
healthAmount -= damageAmount;
}
}

对应的单元测试示例(需放在 Editor 文件夹下):

using NUnit.Framework;

[TestFixture]
public class HealthComponentTests
{
[Test]
public void TakeDamage_PositiveAmount_HealthUpdated()
{
// Create a health component with initial health = 50.
HealthComponent health = new HealthComponent();
health.healthAmount = 50f;

health.TakeDamage(10f); // 要测试的方法

// assert (verify) that healthAmount was updated.
Assert.AreEqual(40f, health.healthAmount); // (预期,当前值)
}
}

从这个单元测试示例中可以看出:

  1. 包含测试的类应具有 [TestFixture] 特性。
  2. 单元测试方法应具有 [Test] 特性。
  3. 测试构建的类,与要测试的类进行交互(调用 TakeDamage 方法),并使用 NUnit 的 Assert 类验证预期结果。

单元测试运行程序

添加单元测试后,我们可以使用单元测试运行程序来运行这些测试。从工具栏菜单中打开包含的单元测试运行程序,它允许执行单个测试、项目中的所有测试或所有以前失败的测试。此外,还有更高级的选项,如设置为代码编译时自动运行。测试运行程序窗口会显示所有测试项目,并按定义组织它们,还可以显示执行日志消息或异常类。

我们可以通过命令行调用代码来运行所有测试,命令如下:

Unity.exe -projectPath PATH_TO_YOUR_PROJECT -batchmode -quit -executeMethod UnityTest.Batch.RunUnitTests -resultFilePath=C:\temp\results.xml

其中,ResultFilePath 参数是可选的,用于指定存储所有测试运行生成的报表的路径。

集成测试(Integration Tests)

集成测试的必要性

有时,单元测试的级别过低,需要测试多个组件、对象以及它们之间的相互作用。该软件包包含集成测试框架,允许在单独的“测试”场景中使用真正的游戏对象和组件来创建和执行测试。

编写集成测试

集成测试与单元测试不同,它不是在代码中编写的。相反,需要向项目中添加一个新的场景,该场景将包含测试对象,每个测试对象定义一个单一的集成测试。

编写集成测试的步骤

  1. 创建一个新的场景用于测试(可以有命名约定,方便在构建游戏时删除这些场景)。
  2. 从工具栏菜单中打开运行集成测试。

断言组件(Assertion component)

断言组件用于设置游戏对象的不变量。设置该组件无需编写任何代码,一切都可以在编辑器用户界面中完成。它易于扩展、定制,可以根据自己的需求进行配置。

单元测试运行程序

在编辑器中集成的 NUnit 框架允许在 Unity 内部执行单元测试,这意味着可以实例化游戏对象,而这些操作在 Unity 外部是无法完成的。我们提供了综合的测试运行程序来运行测试并报告结果。

NSubstitute 库

NSubstitute 库用于模拟执行,可创建“假”对象,帮助解决测试中外部依赖项的问题。

作者信息

洞悉

洞悉

共发布了 3994 篇文章