Unity6でテストコードを書くときの注意点
この記事は「PY - PARTY TECH STUDIO Advent Calendar 2025」の16日目の記事です。
最近初めて、Unity6でUnitTestを書きました。そのときにいくつかハマった点があったのでまとめました。
Assembly Definitionは不要
UnityでのUnitTestのコードを書こうと調べると、高確率で「Assembly Definitionを作成してテスト用の依存関係を設定する」、という情報にたどり着きます。
また2025年12月15日現在、ChatGPT5.2に「Unity6でUnitTestのコードを書く手順を教えて。」ときくと、下記のような回答が含まれました。
- Assembly Definition(asmdef)を作る(推奨)
テストの依存関係を綺麗にするため asmdef を作るのが定石です。
しかし、これは必要ありません。
Unity6ではテスト用に作ったクラスのメソッドに [Test] 属性をつけるだけでテストコードとして認識されます。クラスの配置場所や名前空間の制限も特にありません。
using NUnit.Framework;
using UnityEngine;
public class TestSample
{
[Test] //これをつけるだけ
public void TestWithoutAssemblySettings()
{
Debug.Log("This is a sample test.");
}
}
画像のようにテストコードを配置する場所も自由です。
ただし、Editorディレクトリに入っているものはEditMode、それ以外はPlayModeのテストとして認識される点には注意してください。

Window > General > Test Runner からテストランナーを開くと、テストコードがない場合は下記のような表示になっているのでややこしいですが、それを無視して [Test] 属性をつけたメソッドを作成すればOKです。

テストコードがあると、自動的に認識されて一覧に表示されます。

非同期テストはUniTask.ToCoroutineを使う
UniTask前提になりますが、非同期のテストは UnityTest 属性をつけて、UniTask.ToCoroutine を使うと簡単に書けます。
using System.Collections;
using Cysharp.Threading.Tasks;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
public class TestSample
{
[UnityTest] //非同期テストはUnityTest属性をつける
public IEnumerator TestWithoutAssemblySettingsAsync() => UniTask.ToCoroutine(async () =>
{
await UniTask.Delay(1000);
Debug.Log("This is a sample test.");
});
}
これも調べると「Assembly Definition」を設定する情報にたどり着きやすいですが、通常のテストと同様にやはり不要です。
Debug.LogError、Debug.LogExceptionはテストが失敗する
Unity Test Frameworkでは、Debug.LogError や Debug.LogException が実行されると、そのテストは失敗扱いになります。
個人的にはログ出力は Debug.Log を使い、例外としたい場合は明示的にエラーとして扱ったほうが良いと思いますが、どうしても Debug.LogError や Debug.LogException を使いたい場合は下記の記事で紹介されているように LogAssert を使って検証するのが良さそうです。
UniTask.ToCoroutine 内ではクラッシュする
なんと非同期処理内で Debug.LogError がある場合、それを通すために LogAssert を使うと UniTask.ToCoroutine 内でクラッシュしてしまいます。
情報を探ってもそれらしい事例が見つからなかったので、自分の場合は諦めて Debug.LogError を使わないようにしてテストを通しました。
Discussion