Version: 2018.1
Unity Test Runner
IL2CPP

Unity Test Runner でのテストの作成と実行

Unity Test Runner は、スタンドアロン、Android、iOS などのターゲットプラットフォーム上で行うのと同様に、編集 モードと 再生 モードでコードをテストします。

このページのドキュメントは、Unity Test Runner でテストを作成し実行する方法について説明しています。これらの説明は、スクリプティング と Unity Test Runner の両方を理解していることを前提としています。

Unity はテスト結果を XML 形式で提供します。詳細は、Test Result XML Format に関する NUnit のドキュメント (英語) を参照してください。

UnityTestAttribute

UnityTestAttribute では、 IEnumerator を返す必要があります。再生 モードでは、テストを コルーチン として実行します。編集 モードでは、テストから null を返して現在のフレームをスキップすることができます。

ノート: WebGL と WSA プラットフォームは UnityTestAttribute をサポートしません。

通常の NUnit テスト (編集モードと再生モードで使用可)

[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 = RunEditorUtilityInTheBackgroud();

    while (utility.isRunning)
    {
        yield return null;
    }

    Assert.IsTrue(utility.isSuccess);
}

UnityPlatformAttribute

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 を使うこともできます。

PrebuildSetupAttriubte

テストを開始する前に追加の設定を行う必要がある場合は、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 ディレクティブで囲います。

LogAssert

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

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 - テストを実行したいプラットフォーム

  • 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 と比較します。


Unity Test Runner
IL2CPP