Unity 5.1为开发者带来了全新的断言库。本篇文章中,我们将为您阐述何为断言库(ASSERTION LIBRARY),以及您如何用它以提升游戏中运行错误的诊断效率。

断言是什么?为何要用它?

一个断言就是一种检查状态的方法,如果这个状态为True,那么执行就会继续下去。若有任何突发异常或期望状态没有出现,一条显示用户自定义的信息就会被印出在调用堆栈。让我们看如下这个范例:
 

0?wx_fmt=jpeg.jpg


如果范例中的GameObject没有激活,那么一条错误提醒就会显示在调用栈并印出信息:Player GameObject is not active
 

0?wx_fmt=jpeg.jpg


如很多开发者所知,断言源于单元测试。在单元测试中采用“ Arrange-Act-Assert“来对比所期待的结果和真实结果是测试的最后一个环节(https://msdn.microsoft.com/en-us/library/hh694602.aspx#BKMK_Writing_your_tests),断言不仅仅是测试,你还可以利用它检测在运行过程中不变量被修改时获得警示。但是,并不是所有的断言只能被运用在运行(Runtime)代码中。

单元测试框架中的断言库是适用的吗?

极有可能您是首次在单元测试框架中遇到断言。举例:让我们试试NUnit,NUnit是一个用于断言测试有着非常丰富并已用于大量实践的库。那么,问题来了,为什么你仅仅想要利用这个库去测试你的产品代码呢?NUnit断言允许你去测试许多东西。从最简单的对比状态测试到复杂的搜集测试传递异常。但是问题是运行花费时间很长。低阶的断言需要尽可能的精简,不花费额外的耗费。断言库就是用来帮助您减少额外的耗费和不必要的运行。一个断言库最好能从发布包外调用。因为断言在产品发布周期对开发者很有用处,但是结束之后断言库对于用户毫无意义。当你在打包最终版本时你会想要去除所有的断言调用。你可能会采取注释所有的代码,但是这实在不是一个聪明的办法。还好,.NET有一个条件编译机制。断言库只会在符合条件玩家使用的开发包里调用断言。但是,仍有可能包含被编译选项采用的断言。最后但也是很重要的,通常单元测试的断言库是建立在异常的基础上的。一个异常出现在一次运行的失败时。显然,这针对运行阶段时的代码并不理想。断言库已经集成到Unity Log系统,错误发生时,一条消息就会被记录。断言库通用于所有的Unity支持平台。这就意味着即使在不支持异常反馈的AOT平台上也能运行断言。

那么,这个断言库里都包含了什么内容?

该库提供了多种不同类型的比对方法和一个对等比较器。以下举列一些断言方法:. AreEqual -一般比较器,用来最基础的对等比较。默认的对等比较器。. AreApproximatelyEqual - 近似比较器,它可以默许一些比较错误。常用来比较浮点数。. IsTrue - 快速简易的布尔变量检查。所有的方法都收录在断言文档中:http://docs.Unity3d.com/ScriptReference/Assertions.Assert.html最酷的是这个断言库的设计跳出固定思维,它与Unity测试工具是兼容的。无需任何额外的动作,任何被保护的调用代码集成测试,断言都是会失败的。

断言库的延伸性

当你想要获得一个新功能,最好的方法自然是扩展它。上文提到的AreEqual方法允许你传递一个你自己的特定类型比较器,这个比较器必须在 IEqualityComparer的界面上执行。该库提供用于比较浮点数的 FloatComparer,它可以允许你去做一些相对误差的比较。这个比较器收录在AreApproximatellyEqual方法。

总结

使用断言库来找出代码里的Bug以及非预期的状态是很有效的。你现在就可以开始使用,我们也会持续提升断言库的内容,我们欢迎您多多提出任何建议!