Unity断言库
Unity 5.1 为开发者带来了全新的断言库。在本篇文章中,我们将详细阐述什么是断言库(ASSERTION LIBRARY),以及如何利用它提升游戏运行错误的诊断效率。
断言是什么?为何要用它?
断言是一种检查状态的方法。当检查的状态为 True 时,程序执行会继续;若出现突发异常或期望状态未出现,调用堆栈将显示一条用户自定义的信息。以下是一个示例:
// 示例代码
if (!GameObject.activeSelf)
{
Debug.LogError("Player GameObject is not active");
}
在上述示例中,如果 GameObject 未激活,调用栈会显示错误提醒并输出信息 “Player GameObject is not active”。
很多开发者知道,断言源于单元测试。在单元测试中,采用 “Arrange - Act - Assert” 模式来对比预期结果和实际结果,断言是测试的最后一个环节(详细介绍)。断言不仅用于测试,还能在运行过程中检测不变量被修改时发出警示。不过,并非所有断言都只能用于运行(Runtime)代码中。
单元测试框架中的断言库是否适用?
你可能首次在单元测试框架中接触到断言。以 NUnit 为例,它是一个功能丰富且经过大量实践检验的断言测试库。然而,为什么仅想用这个库来测试产品代码呢?NUnit 断言可以测试很多内容,从简单的状态对比测试到复杂的集合测试并传递异常。但问题是,其运行耗时较长。低阶的断言应尽可能精简,避免额外开销。
断言库的作用是帮助减少额外开销和不必要的运行。理想情况下,断言库应能在发布包外被调用。因为在产品发布周期内,断言对开发者很有用,但发布后对用户则毫无意义。在打包最终版本时,你可能想去除所有的断言调用,若采用注释代码的方式,显然不是明智之举。好在 .NET 有条件编译机制,断言库只会在符合条件的开发包中调用断言,但仍可能包含被编译选项采用的断言。
另外,通常单元测试的断言库是基于异常的,运行失败时会抛出异常,这对于运行阶段的代码并不理想。而 Unity 的断言库已集成到 Unity Log 系统,错误发生时会记录一条消息,并且该断言库适用于所有 Unity 支持的平台,即使在不支持异常反馈的 AOT 平台上也能运行。
断言库包含哪些内容?
该库提供了多种不同类型的比对方法和一个对等比较器。以下是一些断言方法的示例:
AreEqual:一般比较器,用于最基础的对等比较,是默认的对等比较器。AreApproximatelyEqual:近似比较器,允许一定的比较误差,常用于比较浮点数。IsTrue:用于快速简易的布尔变量检查。
所有方法的详细信息可参考断言文档:http://docs.Unity3d.com/ScriptReference/Assertions.Assert.html。
值得一提的是,这个断言库的设计独具匠心,它与 Unity 测试工具兼容。无需额外操作,任何被保护的调用代码在集成测试时,若断言不成立就会失败。
断言库的扩展性
若你想为断言库添加新功能,最好的方式是对其进行扩展。前面提到的 AreEqual 方法允许传递一个自定义的特定类型比较器,该比较器必须实现 IEqualityComparer 接口。库中提供了用于比较浮点数的 FloatComparer,可进行相对误差比较,此比较器在 AreApproximatelyEqual 方法中使用。
总结
使用断言库来查找代码中的 Bug 和检测非预期状态非常有效。你现在就可以开始使用这个断言库,我们也会持续对其进行优化和改进,欢迎你提出宝贵的建议!