2015年9月1日 星期二

淺談Unity的斷言庫(Assertion Library)

作者:TOMEK PASZEK
原文:http://blogs.unity3d.com/2015/08/25/the-unity-assertion-library/

Unity 5.1為開發者帶來了全新的斷言庫。本篇文章中,我們將為您闡述何為斷言庫,以及您如何用它以提升遊戲中執行錯誤的診斷效率。

斷言是什麼?為何要用它?


一個斷言就是一種檢查狀態的方法,如果這個狀態為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台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊