1. 程式人生 > >Unity3d官方單元測試外掛學習

Unity3d官方單元測試外掛學習

其實Unity很早就有單元測試支援,從mono編輯器的UnitTest選項,還有安裝目錄中的NUnit.dll都可以看出來。只是國內很少有人研究。

這次拿了AssertStore下的測試外掛研究了一下,總結了一套可行的方案

之前沒有用過單元測試的童鞋可以用vs的單元測試先上手,下載一個vs2012

這個外掛分為2種測試模式,單元測試UnitTest和整合測試Integration

單元測試模式有一個弊端,就是隻能在編輯器狀態下執行。你可以用許多Editor下的東西,但無法再執行狀態下就意味著不支援NGUI,PlayMarker等。

而整合測試它會呼叫Unity的執行函式,然後逐個跑測試用例。相當於實際遊戲執行環境,所以一般都用整合測試來做

整合測試分為2種,動態整合測試和普通整合測試

下面會逐一講解

1.外掛下載之後,Examples第二項則是整合測試例子。

2.會多出一個頁籤,然後開啟整合測試面板

3.每一項整合測試都需要通過斷言的元件的判斷。

4.測試完成之後,在層級面板,測試面板也會有標註。(綁了層級顯示的回撥,意味著PlayMarker的'玩'字沒了- -)

這種普通的整合測試一般用於 是否渲染可見,是否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))]
[IntegrationTest.SucceedWithAssertions]
[IntegrationTest.TimeoutAttribute(
1)] [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等許多外掛。無非一些按鈕響應事件利用反射強制呼叫一下。