【技術共有】Unity Test Toolsで単体テストを自動化

こんにちは、開発ブログです。

今回の技術共有は、Unity Test Toolsを使用して、
単体テストを自動化する方法について紹介します。

Unity Test Toolsとは、アセットストアで配布されている
Unityのテスト用アセットです。
下記URLからダウンロードして使用することができます。
http://u3d.as/65h

それでは、早速Unity Test Toolsで単体テストを行う
手順を見てみましょう。

A.アセットストアからダウンロードしてプロジェクトに取り込む

Unityを起動し、アセットストアからUnity Test Toolsを
ダウンロードしてプロジェクトに取り込みます。

B.単体テスト用のコードを作成する

次に、単体テスト用のコードを作成します。
単体テスト用コードを紹介する前に、まずはテストされる側の
コードを紹介します。
今回はMyClassというクラスを作成しました。

/// <summary>
///   被単体テスト用クラス.
/// </summary>
public class MyClass {

	public int X { private set; get; }
	public int Y { private set; get; }

	// XとYを引数で初期化します
	public MyClass (int initX, int initY) {
		X = initX;
		Y = initY;
	}

	// Xと引数を比べて、numberの方が小さければtrue、そうでなければfalseを返す
	public bool LessThanX (int number) {
		if (number < X) {
			return true;
		}

		return false;
	}

	// XとYの和を返す
	public int XPlusY () {
		return X + Y;
	}
}

続いて、単体テスト用のコードです。
単体テスト用コードは、Editorフォルダ内に作る必要がありますので、
まずは任意のフォルダにEditorフォルダを作成します。
そして、作成したEditorフォルダ内にコードを追加します。
今回は以下の様なコードを追加しました。

using NUnit.Framework;

[TestFixture]
public class MyTest {
	[Test]
	[TestCase(1, 2)]
	[TestCase(-1, -100)]
	public void InitializeTest (int x, int y) {
		MyClass myClass = new MyClass (x, y);
		Assert.AreEqual(x, myClass.X);
		Assert.AreEqual(y, myClass.Y);
	}

	[Test]
	public void LessThanXTest ([Values(-1,0,1)] int x, [Values(-2,0,2)]int a) {
		MyClass myClass = new MyClass(x, 0);

		bool xLess = a &lt; myClass.X;
		Assert.AreEqual(xLess, myClass.LessThanX(a));
	}

	[Test]
	public void XPlusYTest ([Range(1, 10, 2)] int x, [Range(1,2,1)] int y) {
		MyClass myClass = new MyClass(x, y);

		Assert.AreEqual(x + y, myClass.XPlusY());
	}
}

各属性の意味は以下の通りです。

Test
テスト用メソッドであることを示します。

TestCase
引数にテストしたい値を渡します。
テストケースの数だけ属性を記述します。

Values
引数に与える値を並べて指定することができます。

Range
引数に与える値を範囲で指定することができます。
例えば、[Range(1, 10, 2)]とすると、1、3、5、…、9というように、
1〜10の間で、1から2ずつカウントアップした値を指定したことになります。

これで、単体テストの準備が整いました。

C.単体テストを実行する

メニューの「Unity Test Tools」から「Unit Test Runner」を
選択し、単体テスト用のウィンドウを表示します。
次に、「Run All Tests」(下図の赤丸で囲われた部分)を
押すことで全テストを1度に行うことができます。

Unit Test Runner

Unit Test Runner

「Run All Tests」を押した後、しばらく待つとテストが終了し、
結果が表示されます。
今回のテストでは、以下のように全て緑色のチェックがつきました。
これは、テストが成功した印です。

全テスト成功

全テスト成功

また、テストが失敗すると赤いマークが付きます。
MyClassのLessThanXを以下のように書き換え、
テストを実行してみます。

// Xと引数を比べて、numberの方が小さければtrue、そうでなければfalseを返す
public bool LessThanX (int number) {
	if (number &lt;= X) {
		return true;
	}

	return false;
}
LessThanXが失敗

LessThanXが失敗

MyClassを書き換えた結果、LessThanXがXと等しい時もtrueを返すように
なってしまい、テストで失敗します。
このように、失敗するテストケースは赤い印が付くので、すぐにわかります。

最後に、メリットとデメリットを紹介します。

<メリット>
・単体テストの時間が大幅に短縮される。
・正確なテストができる。

<デメリット>
・単体テストのコードを作成する時間がかかる。
・テスト自体にもバグが含まれる可能性がある。

変更や修正が多い場合にテストを手動で行うと、
手間が非常にかかりますので、テストを自動化することで
テスト時間を大きく短縮できることと思います。

以上、技術共有でした。

This entry was posted in 技術共有. Bookmark the permalink.