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件の簡単なEdit Modeテストを作る
- Test Runnerに表示されることを確認する
- そのテストだけを実行する
- 成功状態になることを確認する
- わざと期待値を変え、失敗時の表示も確認する
- 必要になった段階で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では原因と対策が異なるため、別々に確認してください。
- PlayerPrefsが消える場合: Unity Test RunnerでPlayerPrefsが消える原因|DeleteAllに注意
- Saveが書き換わる場合: Unity Test Runnerで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へ到達していないか確認し、テスト専用の保存先へ切り替えてください。