はじめに
Unity Test Framework
(旧:Unity Test Runner
)で非同期のテストをしようとすると以下のように書く事が主流?でした。
[UnityTest] public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () => { var time = Time.realtimeSinceStartup; Time.timeScale = 0.5f; try { await UniTask.Delay(TimeSpan.FromSeconds(3), ignoreTimeScale: true); var elapsed = Time.realtimeSinceStartup - time; Assert.AreEqual(3, (int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)); } finally { Time.timeScale = 1.0f; } });
GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.
ただUnity Test Framework
のversion2.0
から公式でサポートしてくれたみたいなので、実際に試してみたいと思います。
(追記:よくよく調べたらv1.3
からぽいです。)
↓非同期テストについて触れた公式ドキュメントの箇所
docs.unity3d.com
バージョンの上げ方
現時点(2022/11/11, Unity2021.3.0f1)ではデフォルトではversion1
が入っているので、Package Manager
による操作が必要です。(もしくはmanifest.json
)

Version2.0
はまだpre-release
なので、Project Settings/Package Manager
のEnable Pre-release Packages
を有効にしてアップグレードを行う必要があります。
(一度UnInstall
してからUpgrade
)


コード
[Test] public async Task TestSimplePasses() { var tmp = 0; await Task.Delay(1000); tmp++; await Task.Delay(100); Assert.That(tmp, Is.EqualTo(1)); }
実際に実行してもちゃんといけました。
ちなみにv2
以前では以下のようなエラーが出てきます。
Method has non-void return value, but no result is expected
さいごに
神機能です。ありがとうUnity。
追記
v2
からではなくて、v1.3
からかもです。
[1.3.0] - 2022-10-11
- Async test support with documentation and support for SetUp and TearDown.
Changelog | Test Framework | 1.3.0
間違っててすいません....。
補足
追記を書くためにChange Log
を見ていたら面白そうなことが書かれていました。
[2.0.0] - 2021-07-21
Made the TestRunnerWindow public, allowing other windows to reference it.
Changelog | Test Framework | 2.0.1-exp.2
外部からTestRunnerWindow
にアクセスできるようになった(リフレクションを使ったりすれば関係ないけれども)とのことで、何か面白そうな事ができたりしそう?かも。