はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Unity Test Framework v1.3からUniTaskを使わなくても簡単に非同期処理のテストができるようになった

はじめに

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.

www.hanachiru-blog.com

ただUnity Test Frameworkversion2.0から公式でサポートしてくれたみたいなので、実際に試してみたいと思います。
(追記:よくよく調べたらv1.3からぽいです。)

↓非同期テストについて触れた公式ドキュメントの箇所
docs.unity3d.com

バージョンの上げ方

現時点(2022/11/11, Unity2021.3.0f1)ではデフォルトではversion1が入っているので、Package Managerによる操作が必要です。(もしくはmanifest.json)

デフォルトで入っているTest Framework

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

Enable Pre-release Packages
v2.0.1

コード

[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にアクセスできるようになった(リフレクションを使ったりすれば関係ないけれども)とのことで、何か面白そうな事ができたりしそう?かも。