2016/11/27更新:官方的測試工具有許多問題,我修改了一個版本 https://git.oschina.net/Hont/UnitTest_Modifyed
支持切場景,異常不失敗等
其實Unity很早就有測試支持,從mono編輯器的UnitTest選項,還有安裝目錄中的NUnit.dll都可以看出來。
這次拿了AssertStore下的測試插件研究了一下,總結了一套可行的方案
https://www.assetstore.unity3d.com/#/content/13802
之前沒有用過單元測試的童鞋可以用vs的單元測試先上手,下載一個vs2012
這個插件分為2種測試模式,單元測試UnitTest和集成測試Integration
單元測試模式有一個弊端,就是只能在編輯器狀態下運行。你可以用許多Editor下的東西,但無法再運行狀態下就意味着不支持NGUI,PlayMarker等。
而集成測試它會調用Unity的運行函數,然后逐個跑測試用例。相當於實際游戲運行環境,所以一般都用集成測試來做
集成測試分為2種,動態集成測試和普通集成測試
下面會逐一講解
1.插件下載之后,Examples第二項則是集成測試例子。
2.然后打開集成測試面板Integration Test Runner
3.每一項集成測試都需要通過斷言的組件的判斷。
4.測試完成之后,在層級面板,測試面板也會有標注。
這種普通的集成測試一般用於 是否渲染可見,是否y坐標小於5。但有許多的約束性
調用函數很麻煩,無法像vs那樣Assert.IsTrue(...)。所以要用到動態集成測試
5.有關動態集成測試的例子在這里,可以看一下DynamicIntegrationTest.cs腳本怎么寫的
using System; using System.Collections.Generic; using UnityEngine; [IntegrationTest.DynamicTestAttribute("ExampleIntegrationTests")]//綁定的場景名 // [IntegrationTest.Ignore] 忽略這個測試 [IntegrationTest.ExpectExceptions(false, typeof(ArgumentException))]//期望異常,當ArgumentException時,測試返回成功 [IntegrationTest.SucceedWithAssertions]//根據所有斷言來判斷是否成功 [IntegrationTest.TimeoutAttribute(1)]//當超時返回失敗,如果不設置,默認時限5秒 [IntegrationTest.ExcludePlatformAttribute(RuntimePlatform.Android, RuntimePlatform.LinuxPlayer)]//忽略掉的平台 public class DynamicIntegrationTest : MonoBehaviour { public void Start() { IntegrationTest.Pass(gameObject); } }
6.測試腳本,第一個特性DynamicTestAttribute("..")是綁定的場景名。如果在該場景名下,動態測試腳本會自動掛載到測試面板中。

[IntegrationTest.DynamicTestAttribute("ExampleIntegrationTests")] [IntegrationTest.ExcludePlatformAttribute(RuntimePlatform.Android, RuntimePlatform.LinuxPlayer)] public class Test1 : MonoBehaviour { public void Start() { IntegrationTest.Assert(gameObject); } } [IntegrationTest.DynamicTestAttribute("ExampleIntegrationTests")] [IntegrationTest.ExcludePlatformAttribute(RuntimePlatform.Android, RuntimePlatform.LinuxPlayer)] public class Test2 : MonoBehaviour { public void Start() { IntegrationTest.Assert(gameObject); } }
7.這樣一個.cs文件里,創建若干個測試類。再針對不同模塊,分成不同測試場景,進行測試。即可
這樣也能支持NGUI等許多插件。無非一些按鈕響應事件利用反射強制調用一下。