Unityテストツール ドキュメンテーション
目次
Unityテストツール
インテグレーションテストフレームワーク
アサーションコンポーネント
ユニットテストランナー
NSubstituteライブラリ
サンプル
Q&A
フレームワーク同梱のサンプル
サンプルシーン
NUnitサンプル
インテグレーションテストフレームワークの使い方
インテグレーションテストランナーの開き方
インテグレーションテストランナーの構造
テストフローの制御方法(テストの開始/終了方法)
インテグレーションテストランナー
シンプルなテストを作成する
アセットをテストする
プラットフォーム上でテストを実行する
結果をレポートする
CUIからの実行(バッチモード)
アサーションコンポーネントの使い方
アサーションコンポーネントの概要
アサーションコンポーネントのセットアップ
コードからアサーションを作成する
アサーションコンポーネントの機能
始め方
アサーションエクスプローラー
よくある質問 - FAQ
ユニットテストランナーの使い方
ユニットテストランナーの開き方
NUnit を使う
ユニットテストランナーの仕組み
ユニットテストランナーウィンドウ
結果をレポートする
外部のライブラリからのUnity Testを含める
CUIからの実行(バッチモード)
備考
インテグレーションテストでアサーションコンポーネントを使用する
実際の手順
Unityテストツール
インテグレーションテストフレームワーク
インテグレーション(統合/結合)テストは、シーン中でアセットを直接検証するプロセスを自動化します。このフレームワークは、エディター上か
ら直接既存のコンテンツに対して使用することを想定して設計されており、各アセットの挙動と、アセット間の実装の両方を検証するテストを構築で
きます。
インテグレーションテストフレームワークの使い方
アサーションコンポーネント
アサーションコンポーネント(アサーションコンポーネント)はゲームオブジェクトの不変条件を設定する際に使用します。このコンポーネントのセ
ットアップはエディター UI で完結するため、コードを書く必要が一切ありません。拡張やカスタマイズも容易で、ニーズに合わせて構成できます。
アサーションコンポーネントの使い方
ユニットテストランナー
NUnit Framework がエディターに統合されているため、Unity 上からユニットテストを実行できます。つまりゲームオブジェクトをインスタンス化し
て、それらに対して処理を行なえます。これは Unity 外では困難な処理です。またテストを実行して結果を報告するテスト実行機能も統合してありま
す。
ユニットテストランナーの使い方
NSubstituteライブラリ
NSubstitute は Unity Test Framework に同梱されているライブラリです。詳細についてはライブラリのドキュメントを参照してくださ
い:http://nsubstitute.github.io/help.html
サンプル
フレームワークにはサンプルも同梱されています。
Q&A
互換性のあるUnityバージョンは何ですか?
このフレームワークはUnity4.xで動作します。
C#のみでユニットテストを書くことは可能ですか?
私達はC#で書くことに注力していますが、UnityScriptやBooでも問題なく書けるようにしています。
いくつかのサブフォルダにこのツールを移動させることは可能ですか?
はい、可能です。
なぜこのツールを「Standard Assets」フォルダに移動させた時、動作しなくなるのですか?
現在のフォルダ構成では「Standard Assets」フォルダで動作するように設計されていません。ですが、少しの修正を行うだけで移動すること
が可能です。Editorのコードを「Standard Assets/Editor」へ移動し残りを「Standard Assets」フォルダ配下に移動してください。
既知の問題と制限はなにかありますか?
フレームワーク同梱の NSubstitute はスレッドセーフではありません。
フレームワーク同梱のサンプル
サンプルシーン
サンプルは Examples フォルダに格納されています。
IntegrationTestsExample.unity シーン
このシーンは Game Tests Runner の機能を紹介するものです。使用するには Game Tests Runner を開く必要があります(メニュー内から
[Tests] > [Game Test Runner]、または CTRL + ALT + SHIFT + T)。サンプルは合計 6 個用意されています。またシーンには、全テストで共用
されるオブジェクト(プレハブ)が 2 つ存在します(CubeTriggerFailure、CubeTriggerSuccess)。これらのプレハブはシンプルな構造をして
おり、それぞれコライダと Testing.Fail() および Testing.Succeed() を呼び出すスクリプトを持ちます。これらテストはフレームワークの技術的
な側面に焦点を当てたものであり、大掛かりなテストではありません。 各テストの目的は次のとおりです:
Test1 - Success(成功)
球体が、テストの成功をトリガーするキューブに向けて落ちていきます。テストの結果は成功となります。
Test2 - Timeout(タイムアウト)
テストに設定されているタイムアウト値が小さすぎる(0.1 秒)場合は、球体がキューブに落ちる前にタイムアウトします。
Test3 - FailurePlayerReceivesDamageWhenSpiderExplodes(失敗)
球体が、テストの失敗をトリガーするキューブに向けて落ちていきます。テストの結果は失敗となります。
Test4 - Ignored(無視)
[ignore](無視する)チェックボックスをオンにした状態でテストします。全テストを実行しても、このテストは無視されます。
Test with Assertions(アサートあり)
[Succeed after all assertions are executed](全アサートが実行されたら成功)チェックボックスをオンにした状態でテストします。この
テストでは球体に 2 つのアサートがセットされています。
最初のアサートは OnStart コールバック時に設定されており、sphere(球体)のレンダラがカメラによってレンダリングされて
いるかどうかをチェックします。
2番目のアサートは sphere(球体)と camera(カメラ)の親オブジェクトが同一かどうかをチェックします。
Test with Assertion Fails(アサートあり、失敗)
最初のアサートは OnStart コールバック時に設定されており、レンダラが camera(カメラ)によってレンダリングされているか
どうかをチェックします。
2番目のアサートは sphere(球体)の transform.position が camera(カメラ)の transform.position と同一であるかどうかをチェ
ックします。この条件は真ではないため、テストは失敗します。
Test throwing exception(例外をスローするテスト)
例外がスローされた時に成功とみなされるテストです。ここでの例外は CustomException またはその派生タイプである必要があ
ります。
AssertionExampleScene.unity シーン
アサーションコンポーネントを使用したデバッグ作業の簡単なサンプルです。このシーンでは、球体が平面に向けて落下していき、その後平面
から転がり落ちます。アサートは球体に 2 つ設定されています。 最初のアサートは、球体が OnUpdate の呼び出し時に必ずカメラでレンダリ
ングされることを確認するものです。2 番目のアサートは球体の位置ベクトルの Y 値が常に平面の位置ベクトルの Y 値よりも大きいことを確
認します。これは、球体が平面よりも下に行かない、ということです。
AngryBotsTests/TestScene.unity シーン
このサンプルは Unity のサンプルプロジェクトである Angry Bots のアセットを使用しています。使用されている Angry Bots のアセットは 2 個
のプレハブ、PlayerPrefab、EnemySpider です。最初のプレハブは標準的なプレイヤーコントローラー、もう一方のプレハブは敵スパイダー
で、こちらはプレイヤーが近づくと覚醒するようになっています。このテストシーンの目的は、次の 3 点をテストすることです:
プレイヤーとの距離が一定以下になるとスパイダーが覚醒してプレイヤーに近づいていく
プレイヤーとの距離が離れている場合、スパイダーは覚醒しない
スパイダーは爆発時に、プレイヤーにダメージを与える
このシーンでは手順を自動化するために Game Tests を使用しています。このシーンに対するテストは以下のとおりです:
Test_PlayerReceivesDamageWhenSpiderExplodes
スパイダーがプレイヤーを攻撃して爆発します。プレイヤーがダメージを受け、healthが特定の値より低いかを検証します。
Test_SpiderSleepsWhenPlayerNotInRange
プレイヤーをスパイダーの視認範囲外に位置させ、スパイダーが覚醒して攻撃してこないことを確認します。このテストでは、スパイダ
ーとプレイヤーの間に CubeCollisionFailure を設定し、スパイダーがそれに接触するとテスト失敗と判定する方法で検証を行ないます。
また一定時間経過でトリガーされるアサートを含むゲームオブジェクトもあり、こちらはスパイダーの攻撃行動コントローラーが無効で
あること(スパイダーが休眠モードであること)をチェックします。このアサートがチェックされるとテストは成功となります。
Test_SpiderWakesWhenPlayerInRange
プレイヤーがスパイダーの視認範囲内に位置されると、スパイダーは覚醒してプレイヤーに近づいてきます。スパイダーとプレイヤーの
間には、接触時に Testing.Succeed() を呼び出す CubeCollisionSuccess が存在します。スパイダーがプレイヤーに近づいていくと途中で
トリガーに接触し、テスト成功となります。
NUnitサンプル
SampleTests.cs には NUnit の基本的な使い方を示すサンプルが含まれています。
public void ExceptionTest() - 例外がスローされるため失敗します。
public void IgnoredTest() - ignore(無視)属性の用途を示します。
public void SlowTest() - 実行に 1 秒かかるテストで、[Notify when test is slow](テストが遅い時に通知)オプションを設定できます。public
void FailingTest() - アサートの使い方、および Assert.Fail() を呼び出して失敗するケースを実証します。
public void PassingTest() - アサートの使い方、および Assert.Pass() を呼び出して成功するケースを実証します。
ParameterizedTest、RandomTest、RangeTest が nUnit の機能を示します。
NSubstituteDemo.cs に含まれるクラスは、シンプルな条件下で NSubstitute の使い方を実演します。
IGameEvent:抽象ゲームイベントを表すインターフェース。
IGameEventListener:抽象ゲームコンシューマーを表すインターフェース。
GameEventSink:システムからイベントを取得して登録リスナーに渡すオブジェクト。
RegisteredEventListenersGetEventsテスト は、ReceiveEvent メソッドが IGameEventListener を表す登録リスナーで呼び出されたことをチェックしま
す。
IGameEventListener そのものではなく代替物が使用されます。
public void RegisteredEventListenersGetEvents()
{
GameEventSink sink = new GameEventSink();
// IGameEventListenerのプロキシを作成
IGameEventListener listener = Substitute.For<IGameEventListener>();
sink.RegisterListener(listener);
sink.ReceiveEvent(Substitute.For<IGameEvent>());
//In this line a check that the method was called (with any arguments).
// メソッドが呼ばれたかどうかをチェックします。(いくつかの引数と共に)
listener.Received().ReceiveEvent(Arg.Any<IGameEvent>());
}
NSubstitute の機能については NSubstitute のドキュメントを参照してください。
UnityScriptとBooでユニットテスト(id:example-2-1)
UnityScriptの例
class UnityScriptUnitTests
{
@NUnit.Framework.Test()
function UnityScriptTest () {
NUnit.Framework.Assert.Pass();
}
}
Booの例
namespace UnityTest
import NUnit.Framework
class BooUnitTests:
[Test]
def BooTest ():
Assert.Pass();
インテグレーションテストフレームワークの使い方
インテグレーションテストランナーの開き方
インテグレーションテストランナーはメニューバーから [Unity Test Tools] > [Integration Tests] >[Integration Tests Runner]または Shift + Ctrl + Alt + T
で開きます。
インテグレーションテストランナーの構造
インテグレーションテストランナーは、独立したシーンでの利用を想定して設計されています。実施するすべてのテストを集めた、テストスイートの
ようなものを想像して頂ければ分かりやすいでしょう。テストは 1 つのシーンに複数個配置できます。成果物となるシーンにはテストを配置せず、そ
れらのシーンから別途テスト用シーンを作成してください。
テストオブジェクトとは、シーン内にあり、TestComponent がアタッチされたゲームオブジェクトのことです。テストオブジェクトの階層下にある
オブジェクトは、すべて当該テストに属するものとして扱われます。他方、テストオブジェクトの階層下にないオブジェクトは、シーン中の全テスト
の共通オブジェクトとなります(通常は床や壁などの環境要素)。なお、テストオブジェクトを手動で作成する必要はありません。すべての手順は
Test Runner で行われます。テストは階層構造を持つことが出来ます。テストオブジェクトに他のテストオブジェクトを子要素とすることが可能で
す。配下にあるテストオブジェクトはグループとなり個別のテストとして実行はされません。
テストは同時に 1 つしか有効化されません。テストを 1 つ選択すると他のテストは無効化されるため、一度に作業できるテストは 1 つだけです。