Unity Test Runner は、スタンドアロン、Android、iOS などのターゲットプラットフォーム上で行うのと同様に、編集 モードと 再生 モードでコードをテストします。
このページのドキュメントは、Unity Test Runner でテストを作成し実行する方法について説明しています。これらの説明は、スクリプティング と Unity Test Runner の両方を理解していることを前提としています。
Unity はテスト結果を XML 形式で提供します。詳細は、Test Result XML Format に関する NUnit のドキュメント (英語) を参照してください。
UnityTestAttribute では、 IEnumerator
を返す必要があります。再生 モードでは、テストを コルーチン として実行します。編集 モードでは、テストから null
を返して現在のフレームをスキップすることができます。
ノート: WebGL と WSA プラットフォームは UnityTestAttribute
をサポートしません。
[Test]
public void GameObject_CreatedWithGiven_WillHaveTheName()
{
var go = new GameObject("MyGameObject");
Assert.AreEqual("MyGameObject", go.name);
}
[UnityTest]
public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics()
{
var go = new GameObject();
go.AddComponent<Rigidbody>();
var originalPosition = go.transform.position.y;
yield return new WaitForFixedUpdate();
Assert.AreNotEqual(originalPosition, go.transform.position.y);
}
[UnityTest]
public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess()
{
var utility = RunEditorUtilityInTheBackground();
while (utility.isRunning)
{
yield return null;
}
Assert.IsTrue(utility.isSuccess);
}
UnityPlatformAttribute を使用して、実行プラットフォームに基づいてテストをフィルタリングします。これは NUnitPlatformAttribute のように動作します。
[Test]
[UnityPlatform (RuntimePlatform.WindowsPlayer)]
public void TestMethod1()
{
Assert.AreEqual(Application.platform, RuntimePlatform.WindowsPlayer);
}
[Test]
[UnityPlatform(exclude = new[] {RuntimePlatform.WindowsEditor })]
public void TestMethod2()
{
Assert.AreNotEqual(Application.platform, RuntimePlatform.WindowsEditor);
}
指定のプラットフォームでのみエディターテストを実行するには、UnityPlatform
を使うこともできます。
テストを開始する前に追加の設定を行う必要がある場合は、PrebuildSetupAttribute を使用します。これを行うには、IPrebuildSetup インターフェースを実装するクラスのタイプを指定します。クラス全体の設定コードを実行する必要がある場合 (例えば、アセットの準備や特定のテストに必要な設定など、テストを開始する前にコードを実行したい場合)、テストのクラスに IPrebuildSetup
インターフェースを実装します。
public class TestsWithPrebuildStep : IPrebuildSetup
{
public void Setup()
{
// テストを行う前にこのコードを実行します
}
[Test]
//同じクラスに実装されるため、PrebuildSetupAttribute は省略可能。
[PrebuildSetup(typeof(TestsWithPrebuildStep))]
public void Test()
{
(...)
}
}
再生モードに入る前に IPrebuildSetup
コードを実行するか、プレイヤーをビルドします。Setup は UnityEditor 名前空間とその関数を使用できますが、コンパイルエラーを回避するために、Editor フォルダーに置くか、#if UNITY_EDITOR
ディレクティブで囲います。
Unity が通常のログメッセージや警告メッセージ以外のメッセージをログに出力すると、テストは失敗します。LogAssert クラスを使用して、ログに期待されるメッセージを作成するようにします。そうすると、Unity がそれらのメッセージを出力してもテストは失敗しません。
また、期待されるメッセージが表示されない場合、または Unity が通常のログメッセージや警告メッセージを出力しない場合は、テストは失敗と報告されます。
[Test]
public void LogAssertExample()
{
//通常のログメッセージを期待
LogAssert.Expect(LogType.Log, "Log message");
//ログメッセージを期待するため、
//以下の行がない場合はテストが失敗します
Debug.Log("Log message");
//エラーログを出力
Debug.LogError("Error message");
//エラーログを期待していないため、テストは失敗します
LogAssert.Expect(LogType.Error, "Error message");
}
MonoBehaviourTest は コルーチン で、MonoBehaviour テストのヘルパーです。 UnityTest 属性から MonoBehaviourTest
を取得し、指定された MonoBehaviour をインスタンス化し、実行が完了するのを待ちます。テストがいつ行われるかを示すため、IMonoBehaviourTest インターフェースを実装します。
[UnityTest]
public IEnumerator MonoBehaviourTest_Works()
{
yield return new MonoBehaviourTest<MyMonoBehaviourTest>();
}
public class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest
{
private int frameCount;
public bool IsTestFinished
{
get { return frameCount > 10; }
}
void Update()
{
frameCount++;
}
}
再生 モードでは、指定のプラットフォームでテストを実行できます。ターゲットプラットフォームは常に Build Settings (File > Build Settings) で選択されている現在のプラットフォームです。Run all in the player をクリックして、現在アクティブなターゲットプラットフォームでテストをビルドして実行します。
現在のプラットフォームはボタンの括弧 () 内に表示されます。例えば、下のスクリーンショットでは、現在のプラットフォームが Windows であるため、ボタンに Run all in player (StandaloneWindows) と表示されています。
テストが完了すると、テスト結果がビルドに表示されます。
プラットフォームからテストを実行するエディターにテスト結果を取得するには、両方とも同じネットワーク上にある必要があります。プラットフォーム上で実行されているアプリケーションは、テスト結果を報告し、実行されたテストを表示し、シャットダウンします。
プラットフォームによっては、Application.Quit でアプリケーションをシャットダウンすることをサポートしていない場合があります。そのようなプラットフォームはテスト結果を報告した後も実行し続けます。
Unity が接続をインスタンス化できない場合は、実行中のアプリケーションでテストの成功を目視で確認できます。この状態で引数を持つプラットフォームのテストを実行しても、XML 形式のテスト結果は得られないことに注意してください。
コマンドラインからの実行を行うには、Unity を以下の コマンドライン引数 で実行します。
runTests
- プロジェクトのテストを実行します
testPlatform
- テストを実行したいプラットフォーム
使用可能プラットフォーム:
playmode
か editmode
を指定します。もし指定がなければ、テストはデフォルトの editmode
で実行されます。
Platform/Type の規則は BuildTarget enum のものです。テスト済みの公式サポートプラットフォームは以下の通り。
testResults
- Unity が結果ファイルを保存する場所を示すパス。デフォルトでは、Project のルートフォルダーに保存されます。
次の例は、Windows のコマンドライン引数を示しています。オペレーティングシステムによって部分的に異なる場合があります。
>Unity.exe -runTests -projectPath PATH_TO_YOUR_PROJECT -testResults C:\temp\results.xml -testPlatform editmode
ヒント: Windows では、実行されたコマンドの結果コードを読み込むために、以下を実行します。
start /WAIT Unity.exe ARGUMENT_LIST
.
UnityEngine.TestTools.Utils 名前空間にはユーティリティークラスがあり、NUnit 型を使用して Vector2、Vector3、Vector4、Quaternion、Color、 float
と比較します。