こんにちは、開発ブログです。
今回の技術共有は、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 < 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度に行うことができます。
「Run All Tests」を押した後、しばらく待つとテストが終了し、
結果が表示されます。
今回のテストでは、以下のように全て緑色のチェックがつきました。
これは、テストが成功した印です。
また、テストが失敗すると赤いマークが付きます。
MyClassのLessThanXを以下のように書き換え、
テストを実行してみます。
// Xと引数を比べて、numberの方が小さければtrue、そうでなければfalseを返す public bool LessThanX (int number) { if (number <= X) { return true; } return false; }
MyClassを書き換えた結果、LessThanXがXと等しい時もtrueを返すように
なってしまい、テストで失敗します。
このように、失敗するテストケースは赤い印が付くので、すぐにわかります。
最後に、メリットとデメリットを紹介します。
<メリット>
・単体テストの時間が大幅に短縮される。
・正確なテストができる。
<デメリット>
・単体テストのコードを作成する時間がかかる。
・テスト自体にもバグが含まれる可能性がある。
変更や修正が多い場合にテストを手動で行うと、
手間が非常にかかりますので、テストを自動化することで
テスト時間を大きく短縮できることと思います。
以上、技術共有でした。