UnityでUnit Testを行う

先日、勉強会でUnity Tests Runnerというのものがあることを知りました。

もともと、Unity Test Toolsというものの一部だったのが、Unity5.3から組み込みになったらしいです。

docs.unity3d.com

というわけで使ってみました。

使い方は簡単で、図のように

f:id:wkpn:20160925160828p:plain

「create」 -> 「Editor Test C# Script」

を選び、スクリプトファイルを作ります。スクリプトはEditorフォルダ以下に置いて置きます。

Editorフォルダ以下に置いておかないと、

The type or namespace name `NUnit' could not be found. Are you missing a using directive or an assembly reference?

というエラーが出ますのでご注意を。

できたスクリプトは、以下のようになっています。EditorTest()の中身がテストコードになっています。

using UnityEngine;
using UnityEditor;
using NUnit.Framework;

public class NewEditorTest {

	[Test]
	public void EditorTest()
	{
		//Arrange
		var gameObject = new GameObject();

		//Act
		//Try to rename the GameObject
		var newGameObjectName = "My game object";
		gameObject.name = newGameObjectName;

		//Assert
		//The object has a new name
		Assert.AreEqual(newGameObjectName, gameObject.name);
	}
}

EditorTestを書き換えて、自分のテストしたい内容に書き換えても良いですが、テスト項目が増えるたびに新たに関数を作ったほうが良いでしょう。頭に[Test]属性をつけておくと、それがテストコードになります。

例えば、自分は以下のようなテストを書いています。ちなみにclass名は何でも良いみたいです。

public class WKLibraryTest {
    [Test]
    public void SwapTest()
    {
        int i1 = 0;
        int i2 = 1;
        Utils.Swap< int >( ref i1, ref i2 );
        Debug.Assert( i1 == 1 && i2 == 0 );
    }

    [Test]
    public void Tuple2Test()
    {
        MyTuple2 tuple_test2 = new MyTuple2( "tuple2", 0 );

        Debug.Assert( tuple_test2.Item1 == "tuple2" );
        Debug.Assert( tuple_test2.Item2 == 0 );
    }
}

できたテストはエディター上から走らせることができます。

「Window」->「Editor Tests Runner」を選びます。

f:id:wkpn:20160925161157p:plain

すると以下のような窓が出てきます。

f:id:wkpn:20160925161214p:plain

「Run All」を押すと、全部、「Run Selected」だと選択しているもの、「Rerun Failed」だと前のテストで失敗したものをテストします。

成功すると以下のように緑のチェックが付き、

f:id:wkpn:20160925161236p:plain

失敗すると赤いチェックが付きます。

f:id:wkpn:20160925161252p:plain

テスト書くの面倒くさいので、あんまりやりたくはないのですが、ちょっとしたオレオレUtilityをチェックするのに使おうと思います。