Unity Test Runnerとは?基本と使い方

確認環境

Unity
Unity 6
対象
Unity Editor / Edit Mode・Play Modeテスト
関連Package
Unity Test Framework

Unity Test Runnerとは

Unity Test Runnerは、Unityプロジェクト内のコードやゲーム処理を自動で確認するための機能です。

Unity Test Frameworkに含まれており、主に次の2種類のテストを実行できます。

  • Edit Modeテスト: Play Modeに入らず、計算処理やデータ変換、Editor拡張などを確認する
  • Play Modeテスト: Play Modeでフレーム進行やGameObject、シーン上の処理を確認する

人が毎回同じ操作をして確認する代わりに、コードで「期待した結果になったか」を判定できます。

何に使う機能か

例えば、次のような確認を自動化できます。

  • 計算結果が正しいか
  • Saveデータを正しく読み書きできるか
  • ボタン操作後に状態が変わるか
  • GameObjectが生成されるか
  • 一定時間後に処理が完了するか
  • 修正前に動いていた機能が壊れていないか

特に、同じ確認を何度も繰り返す機能や、変更の影響を受けやすい機能に向いています。

Edit ModeとPlay Modeの違い

Edit Modeテスト

Edit Modeテストは、ゲームを再生せずに実行します。

向いている例は次のとおりです。

  • 数値計算
  • 文字列やJSONの変換
  • データの検証
  • ScriptableObjectの処理
  • Editor専用コード

Play Modeへの切り替えがないため、一般に短時間で実行しやすいテストです。

Play Modeテスト

Play Modeテストは、Unityを再生状態にして実行します。

向いている例は次のとおりです。

  • GameObjectやMonoBehaviourの動作
  • フレームをまたぐ処理
  • Coroutine
  • 物理演算
  • シーン上で動くゲーム処理
  • OnApplicationQuitなどのPlay Modeライフサイクル

実際のゲームに近い状態を確認できますが、Edit Modeテストより実行時間が長くなる場合があります。

Test Runnerの開き方

Unity Editorのメニューから次を開きます。

Window > General > Test Runner

Test Runnerウィンドウには、Edit ModeとPlay Modeのテスト一覧が表示されます。

テストを選択して実行するほか、表示されているテストをまとめて実行できます。Unityのバージョンによって、ボタン名や配置が少し異なる場合があります。

テストを置く場所

テストコードは、通常のゲームコードと分けて管理します。

一般的には次のような構成にします。

Assets/
  Scripts/
  Tests/
    EditMode/
    PlayMode/

テスト用フォルダーにはAssembly Definitionを用意し、Inspectorでテスト用Assemblyとして設定します。テスト対象のコードが別のAssembly Definitionにある場合は、そのAssemblyへの参照も追加します。

テストがTest Runnerに表示されない場合は、次を確認してください。

  • プロジェクトにコンパイルエラーがないか
  • テスト用Assembly Definitionになっているか
  • テスト対象Assemblyへの参照があるか
  • Edit Mode用とPlay Mode用の設定が合っているか

最初のEdit Modeテスト

次は、単純な計算結果を確認するテストです。

using NUnit.Framework;

public class CalculationTests
{
    [Test]
    public void Add_TwoAndTwo_ReturnsFour()
    {
        int result = 2 + 2;

        Assert.AreEqual(4, result);
    }
}

[Test]が付いたメソッドが1件のテストとして認識されます。

Assert.AreEqualは、期待値と実際の値が一致するかを確認します。一致すれば成功し、一致しなければ失敗します。

最初のPlay Modeテスト

フレームをまたいで確認したい場合は[UnityTest]を使います。

using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

public class GameObjectTests
{
    [UnityTest]
    public IEnumerator GameObject_RemainsActive_AfterOneFrame()
    {
        var gameObject = new GameObject("TestObject");

        yield return null;

        Assert.IsTrue(gameObject.activeSelf);
        Object.Destroy(gameObject);
    }
}

[UnityTest]では戻り値をIEnumeratorにし、yield return nullで次のフレームまで待てます。

フレーム進行、Coroutine、非同期に近い処理を確認するときに使用します。

テストの実行方法

Test RunnerでEdit ModeまたはPlay Modeを選び、実行したいテストを選択します。

最初は次の流れで確認すると分かりやすいです。

  1. 1件の簡単なEdit Modeテストを作る
  2. Test Runnerに表示されることを確認する
  3. そのテストだけを実行する
  4. 成功状態になることを確認する
  5. わざと期待値を変え、失敗時の表示も確認する
  6. 必要になった段階でPlay Modeテストを追加する

テスト失敗時は、Test Runnerに表示されるメッセージとConsoleの内容から原因を確認します。

[Test]と[UnityTest]の使い分け

基本的には、フレームを待つ必要がなければ[Test]を使います。

次のような場合は[UnityTest]を検討します。

  • yield return nullで次のフレームを待ちたい
  • WaitForSecondsやWaitForFixedUpdateを使いたい
  • Play ModeでMonoBehaviourの動作を確認したい
  • Coroutineの完了を待ちたい

すべてをPlay Modeテストにすると実行時間が長くなりやすいため、計算やデータ処理はEdit Modeへ分けると管理しやすくなります。

実データを変更しないための注意

Unity Test Runnerは、PlayerPrefsやSaveファイルをテスト専用の保存領域へ自動で隔離しません。

次の処理には注意してください。

  • PlayerPrefs.DeleteAll()
  • PlayerPrefs.SetIntなどで通常キーを変更する処理
  • Application.persistentDataPathへのSave
  • Play Mode終了時の自動保存
  • OnApplicationQuitから実行されるSave

PlayerPrefsとSaveでは原因と対策が異なるため、別々に確認してください。

よくあるつまずき

Test Runnerにテストが表示されない

Assembly Definitionの設定、参照関係、コンパイルエラーを確認します。

Edit Modeでは成功するがPlay Modeで失敗する

Play Modeではシーン、フレーム進行、初期化順序の影響を受けます。テスト開始時の状態を明示し、生成したGameObjectを終了時に破棄します。

単体では成功するが一括実行で失敗する

別のテストがPlayerPrefs、static変数、シーン、Singletonなどの状態を残している可能性があります。各テストが単独で開始できる状態に戻します。

テスト後にPlayerPrefsが消える

Test RunnerがPlayerPrefsを自動隔離するわけではありません。PlayerPrefs.DeleteAll()や通常キーへの書き込みを確認してください。

テスト後にSaveが変わる

Play Mode終了時のOnApplicationQuitや自動保存が実Saveへ到達していないか確認し、テスト専用の保存先へ切り替えてください。

参考資料