技术干货分享|Unity 断言库


Unity 5.1


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

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



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


//Make sure the player GameObject is active
Assert.IsTrue(playerGameObject.isActive, “Player GameObject is not active”);

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



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


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


极有可能您是首次在单元测试框架中遇到断言。举例:让我们试试 NUnit,NUnit 是一个用于断言测试有着非常丰富并已用于大量实践的库。那么,问题来了,为什么你仅仅想要利用这个库去测试你的产品代码呢?


NUnit 断言允许你去测试许多东西。从最简单的对比状态测试到复杂的搜集测试传递异常。但是问题是运行花费时间很长。低阶的断言需要尽可能的精简,不花费额外的耗费。断言库就是用来帮助您减少额外的耗费和不必要的运行。


一个断言库最好能从发布包外调用。因为断言在产品发布周期对开发者很有用处,但是结束之后断言库对于用户毫无意义。当你在打包最终版本时你会想要去除所有的断言调用。你可能会采取注释所有的代码,但是这实在不是一个聪明的办法。还好,.NET有一个条件编译机制。断言库只会在符合条件玩家使用的开发包里调用断言。但是,仍有可能包含被编译选项采用的断言。


最后但也是很重要的,通常单元测试的断言库是建立在异常的基础上的。一个异常出现在一次运行的失败时。显然,这针对运行阶段时的代码并不理想。断言库已经集成到 Unity Log 系统,错误发生时,一条消息就会被记录。断言库通用于所有的 Unity 支持平台。这就意味着即使在不支持异常反馈的 AOT 平台上也能运行断言。


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


该库提供了多种不同类型的比对方法和一个对等比较器。以下举列一些断言方法:. AreEqual -一般比较器,用来最基础的对等比较。默认的对等比较器。. AreApproximatelyEqual - 近似比较器,它可以默许一些比较错误。常用来比较浮点数。. IsTrue - 快速简易的布尔变量检查。


所有的方法都收录在断言文档中。


最酷的是这个断言库的设计跳出固定思维,它与Unity测试工具是兼容的。无需任何额外的动作,任何被保护的调用代码集成测试,断言都是会失败的。


断言库的延伸性


当你想要获得一个新功能,最好的方法自然是扩展它。前面提到的 AreEqual 方法允许你传递一个你自己的特定类型比较器,这个比较器必须在 IEqualityComparer 的界面上执行。

该库提供用于比较浮点数的 FloatComparer,它可以允许你去做一些相对误差的比较。这个比较器收录在AreApproximatellyEqual 方法。


总结


使用断言库来找出代码里的 Bug 以及非预期的状态是很有效的。你现在就可以开始使用,Unity 5.1 也会持续提升断言库的内容,开发者们在使用中有任何建议都可以去 Unity 网站反映哦!


// share