先日Unity公式のテストフレームワークが公開された。
機能はUnit Test(単体テスト)とIntegration Test(統合テスト)の2種類で、Unit Testはメソッド単位の挙動の確認、Integration Testはアプリ挙動のテストを行える。
特にIntegration Testは実際にゲームを再生し値を検証するので、かなりそれっぽい挙動のテストが出来るかもしれない。(サンプルは玉を生成し接触判定云々のテストをしていた)
Unit Test
Unit Testを行う場合、Editorフォルダ以下にテストコードを作成し、メニュー>Unity Test Tool>Unit Test RunnerからUnit Test Runnerを開き、緑色の三角ボタンを押してテストを行う。
その際、テストコードは以下のフォーマットで記述する。
要するに、こんな感じ。
- publicかつ戻り値がvoid
- [Test]属性を持つ
[Test]
public void Test1 ()
{
int answer = 1 * 2; // 何か適当な式
Assert.AreEqual (2, answer, "message"); // 2以外ならテスト失敗
}
メソッドが最後まで特に問題なく実行されれば合格、exceptionやassertに失敗すればテスト失格となる。
ちなみにUnit Test RunnerはUnity上で実行されるのでWWWクラスのような特殊なクラスでも動作する。ただしyield returnは使えないので、[MaxTime(n)]でタイムアウト時間を指定しつつ無限ループで処理の完了を待機するといった実装が必要になる。
また、namespaceでグルーピングされるので、テスト毎にnamespaceを分けておくと実行するテストと実行しないテストが簡単に切り分けられる。(namespaceは4.xくらいからサポートしてたと思う)
実際のコードの記述方法は「SampleTests.cs」を確認するのお勧め。
Integration Test
Integration Testを行うのは若干面倒くさい。
まず、メニュー>Unity Test Tool>Integration Test Runnerでテストウィンドウを開き、「+」ボタンを押してテストケースのオブジェクトを追加する。
テスト方法は大きく分けて3種類の確認方法がある。
- Success on assersionにチェックが入った状態で、AssersionComponentの条件が成立する。
- Expect ExceptionとSuccess when exceptionにチェックが入った状態で指定の名前のExceptionが発生する。
- テストコードを記述し、IntegrationTest.Pass を呼ぶ。
失敗させたい場合、Exceptionを投げたりIntegrationTest.Failを呼んだり、後はタイムアウト等で失敗にするらしい。
AssersionComponent
AssersionComponentはテストコードを書くのが面倒な人向けの汎用的なテスト用コンポーネント。Intやfloat、Vector3といった値の比較に使える。
Compare toで指定しているオブジェクトのフィールドがpublicだった場合、比較対象に選択できるらしい。比較のタイミングは特定のイベントが呼ばれるタイミングからn秒後といった挙動まで指定できる。つまり、privateな変数はアクセス出来ないので、その辺りをやりたい場合は調整してやる必要がある。
あとマニュアルによればObjectCompareBaseを継承する形でこの項目も拡張出来る。期待する画面と実際の画面を比較するテストとか面白いかも。(時間があれば作ってみるか・・・)
意外と落としてきたアセットの動作検証に使うのも悪くない感
参考:
Unity Test Tools Released
Unity Test Tools を使ってみる
覚えておくと良い単語
Assert:主張する、断定する(値を)
expect:期待(する値)
actual:実際(の値)
ignore:無視する(テストしない)
compare:比較 (equal→同じ、grater→大きい、less→小さい)