由於工作關系,要了解Unity上的測試工具,該工具基於Nunit框架。通過查閱資料了解到在Unity5.3中做出了一些改變,自帶的僅僅剩下單元測試工具,假設想用其它的工具比方斷言、集成測試,就須要前往Unity的應用商店搜索UnityTestTools進行進行下載,期待之后的版本號整合很多其它更強大的功能。
 
測試工具包括:
集成測試框架Integration Test Framework
 集成測試同意您在一個場景自己主動驗證過程。
在現有內容里直接在編輯器中構建測試驗證報告。
斷言組件Assertion component
 斷言組件能夠讓你的游戲對象給予你所期望的狀態。這是一個可視化工具,不須要編寫不論什么代碼。它被設計為可擴展的,適應項目的內容和您的須要。
單元測試執行器Unit Test Runner
 NUnit框架的集成編輯器同意從Unity里執行單元測試。
這意味着你能夠實例化GameObjects和在Unity里面操作。
官方提供了一個集成的測試執行器,便於查看測試和執行的報告結果。
PS:
通過文檔我們了解到Unity的測試工具一定要求在Editor目錄下才干夠使用。
 
測試的結果有下面幾種:
1.Success成功,又分為本身測試的通過,或我們在這之前就了解將會拋出的異常,也算測試通過。
2.Timeout超時。測試沒有在我們要求的時間內達成。
3.Fail失敗。測試的失敗。作為QA測試的同學最好在檢查源碼之前,再三查看是否是自己的測試代碼出現故障。
4.Ignored忽略錯誤。執行測試時忽略一些測試
 
斷言組件
 
通過文字並非那么好了解到詳細的用法,以下我們通過一些案例來了解怎樣使用Unity中的測試工具。
在Unity測試工具中有個場景叫AssertionExampleScene,描寫敘述的是一個球體自由落體掉落在平面上。

 
我們在Sphere上找到了兩個斷言組件,為了便於觀察,我們來看第二個斷言組件。看之前我們先了解一下斷言組件中都有什么功能。
PS:測試組件在Inspector中點擊Add Component選擇Scripts--Unity Test下就能夠找到了。

 
1.比較方式選擇器,定義應該怎樣比較兩個值。它決定了斷言的結果。
2.測試的頻率,你能夠明白指定斷言什么時候開始。或者在什么條件下開始。
3.自己定義菜單頻率選項,平時是看不到的,詳細要依據2的選擇,才會開啟這里。
3a.多少秒以后第一次觸發。
3b.是否須要反復測試。
3c.多久反復測試一次。
4.一樣也是自己定義菜單頻率選項。可是他和3並不沖突,當你同一時候選擇了After Period Of Time與Update的時候,就會出現兩個自己定義頻率菜單。功能同樣。
4a.在多少幀以后測試應該做的。
4b.是否須要反復測試。
4c.多久反復測試一次。
第一個用於比較的GameObject。
6.自己定義選擇比較器,他們定義操作類型和精度。比方當比較兩個浮點數時,可選操作類型有相等,不相等,大於,小於,而且能夠確定他們的精度,比方在Floating Point Error中,輸入0.01。則就是精確到小數點的后兩位。
7.用於比較的第二個GameObject對象,能夠與另外一個GameObject比較,或者是一個靜態值,或者Null值。
8.依據7中你所選擇的不同而改變,當7中為GameObejct選項時。這里讓您拖入另外一個GameObject。假設7中為Constant Value時。這里則讓您輸入詳細的參數,當7選擇Null則消失。
相信看完以上描寫敘述以后,對於下面的這幅圖大致了解是什么意思了吧,比較的是球體對象與平面對象的Y軸值。我們斷言球體的Y軸一定大於平面,說人話就是球比平面高。假設球小於平面就拋異常,我們就RUN一下來測試一些斷言組件吧,在這之前記得先關閉另外一個斷言組件噢。
 
        點擊播放以后我們能夠查看球體做自由落體而且向平面的邊緣滾去。當往下滾的時候,這時候球體的Y比平面小了,所以這時候場景停住了。停住的原因是由於在Unity的Console窗體中的Error Pause選項被選中。個人認為這樣更便於觀察出錯的那一刻的場景表現。
假設關閉Error Pause又一次播放場景。假設出現拋異常后不會再暫停。
我們來查看一下都報了什么錯誤。

 
相信了解測試的同學都看出來了。Expected為我們的期望值,Actual為實際值。實際值小於期望值,所以拋異常了。
 
集成測試:
 
說完了斷言組件就不得不提一下集成測試,正是由於能夠拋出異常,所以斷言組件和集成測試能夠配合使用。
我們來看一些場景ExampleABTests
ExampleABTests這個案例我們想測試三件事:
當角色足夠近(觸發碰撞)的時候,蜘蛛喚醒。走向角色
當角色的距離不滿足(沒有觸發碰撞)的時候,蜘蛛不會喚醒
觸發爆炸而且傷害角色
所以場景中三個測試,所使用兩個預制PlayerPrefab EnemySpider。
一個是一個角色。
另外一個預制是一個蜘蛛敵人。
首先我們來看Test_PlayerReceivesDamageWhenSpiderExplodes這個測試,通過在Hierarchy下查看到除了兩個預制另一個GameObject上面綁定着一個斷言組件,
斷言所描寫敘述的是2秒內還沒有讓HP低於75的話就算測試失敗。
PS:蜘蛛自爆須要一定的時間,通過測試發現蜘蛛爆炸大概須要4秒時間。

 
我們來執行一下這個測試,點擊Unity菜單條中的UnityTestTools。然后點擊Integration Test Runner打開集成測試窗體,因為我們僅僅測試這一個測試,所以我們就選中Test_PlayerReceivesDamageWhenSpiderExplodes測試,然后點擊窗體中的Run Selected,能夠看到測試失敗了。由於玩家的HP並沒有在2秒內受到傷害,從下圖能夠看到HP並沒有改變。依然是75,所以測試失敗。

 
我們改變一下斷言中的時間把2秒設置為5秒,這樣蜘蛛就有充分的時間來引爆,改動以后保存。我們再執行一次,這次能夠看到蜘蛛爆炸把人物炸飛了而且HP也扣了。所以測試自然也通過了。

 
其它兩個測試:
Test_SpiderSleepsWhenPlayerNotInRange---角色在蜘蛛可觸發攻擊的視野范圍以外,確保它不會攻擊玩家
我們打開發現當中多了一個立方體上綁定着一個代碼Call Testing。依據描寫敘述能夠知道當碰撞盒觸發的時候則算是失敗,失敗則為假(False)。
驗證是通過假設蜘蛛觸發了物體CubeCollisionFailure的碰撞器則說明測試失敗。由於觸發了說明它會跑向角色。這不是我們想要的,所以斷言中我們採用了布爾類型,我們斷言蜘蛛不會開啟(不開啟則為False)移動攻擊控制器(跑向玩家並攻擊)。測試證明它確實不會。由於斷言的兩個對象都為False。


 
Test_SpiderWakesWhenPlayerInRange
由於幾乎相同所以我們就不再多說。
 玩家在蜘蛛的視野范圍以內。蜘蛛醒來,開始朝着這名玩家。在蜘蛛和玩家之間有一個叫Testing.Succeed()的碰撞。
當蜘蛛走向這個立方體的時候成功碰撞
 球員,踩上了觸發器Trigger,測試通過。
 
單元測試
下載的插件中案例Sample.cs包括顯示主要的NUnit使用方法演示樣例。學習Nunit的同學能夠前往http://www.36sign.com/nunit/setup.html,這個是中文的文檔。相比起看英文easy的多。
因為我更新到了Unity5.3,單元測試被集成到系統中,點擊菜單條中的Windows找到Editor Test Runner就是單元測試工具了!
官方的樣例Sample.cs已經有了非常多的樣例,由於文字太多不太好看,我們做一個簡單的樣例。
在Asset下創建目錄Editor。然后右鍵在目錄下創建Editor Test C#Scripts,名字我們就默認的NewEditorTest就好了。
代碼例如以下,
using UnityEngine;
using UnityEditor;
using NUnit.Framework;
public class NewEditorTest {
    [Test]
    public void EditorTest()
    {
        int i = 2;
        int j = i + 1;
        Assert.AreEqual(3, j);
    }
}事實上就是斷言J是否等於3,我們打開單元測試窗體(Editor Test Runner)。能夠看到里面就有我們剛剛輸入的代碼了我們執行一下,發現全綠了。通過。 
         
        
那這時候我們回到代碼,把3改成4。能夠看到拋異常了。例如以下圖:

 
理想的答案是4,可是J等於3呀。所以拋異常,我們接着改動代碼。來測試一下已知的拋異常。
using UnityEngine;
using UnityEditor;
using NUnit.Framework;
using System;
public class NewEditorTest {
    [Test]
    [ExpectedException(typeof(ArgumentException), ExpectedMessage = "expected message")]
    public void ExpectedExceptionTest()
    {
        throw new ArgumentException("expected message");
    }
}
通過測試也通過了,很多其它的須要同學們去學習Nunit才知道噢。 
         
        
 
測試輸出XML
最后我們來說說如何輸出測試XML,我們打開場景ExampleABTests。
這三個測試都是通過的。為了更直觀,我們把Test_SpiderSleepsWhenPlayerNotInRange下的GameObject中的斷言改為True,已知蜘蛛敵人是不會觸發碰撞盒的。所以測試肯定是失敗咯。
我們點擊菜單條中的Unity Test Tools--Platform Runner--Run On Platform

 
我這里直接選擇測試平台為Windows方便查看,點擊build and run tests,程序會自己主動執行。而且執行測試。
依據提示能夠了解哪個場景出現故障,而且是哪一個GameObject,期望值是什么,實際值是什么。

 
因為我剛才設置輸出文檔為項目的根目錄目錄。前往目錄就能夠看到了

 打開就能夠看到剛才三個測試的結果報告以及平台和版本號以及時間和期望值與實際值和拋異常的位置。

 
 
最后總結一下,Unity測試工具的長處把。
通過幾天的琢磨,這個工具的長處在於非常多地方不須要去編譯不論什么一句代碼便能夠實現我們所須要的測試行為,比方這個函數所表現的是怪在不進入視野范圍內是不會觸發攻擊的,可是卻啟用了攻擊函數。這就證明了代碼是有缺陷的。單元測試盡管小。可是把一個個模塊分開來化繁為簡,早一些發現問題,不至於在之后慌不擇路,測試是一門非常深的學問,所想的東西甚至比開發所想的要很多其它,加油吧。
 
 
 
