やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity Test Framework v1.3で非同期テスト

Unity公式のユニットテストレームワークであるUnity Test Frameworkパッケージのバージョン1.3がリリースされました。

v1.2はスキップされ、v2.0での実装を予定されていた非同期テストのサポートが実装されています。

アップグレード方法

Package Managerウィンドウにv1.3が表示されれば*1そのままアップグレード可能です。 v1.3が表示されない場合、Packages/manifest.jsonファイルを直接開き、com.unity.test-frameworkのバージョンを1.3.0に書き換えます。

なお、前提UnityバージョンがUnity 2019.2から2019.4に上がっています。 依存パッケージであるcom.unity.ext.nunitも、v1.0.6からv2.0.3に上がっています*2

また以下の注意事項があります。現時点でのアップグレードは自己責任で。

  • 廃止されたAPIがあるため、例えばGraphics Test Frameworkコンパイルエラーを起こしています。これは意図的なものかどうか疑問で、今後修正される可能性もありそうです
  • Package Managerでエラーが出る(Unityバージョンによる?)。いくつかのバージョンで試しましたが、Samplesの表示が行われておらず、何らかの問題は出ていそうです*3

非同期テスト

これまでは非同期処理のテストはUnityTest属性をつけたコルーチンしかサポートされていませんでした。 v1.3からは、次のようにTest属性のテストとしてasyncメソッドを呼び出すことができます。

[Test]
public async Task 非同期テストの例_Taskをawaitできる()
{
    await Foo(1);
    var actual = await Bar(2);
    Assert.That(actual, Is.EqualTo(3));
}

private static async Task Foo(int id)
{
    await Task.Delay(200);
}

private static async Task<int> Bar(int id)
{
    await Task.Delay(200);
    return id + 1;
}

もちろんUniTaskも使用できます。

[Test]
public async Task 非同期テストの例_UniTaskをawaitできる()
{
    await UniTaskFoo(1);
    var actual = await UniTaskBar(2);
    Assert.That(actual, Is.EqualTo(3));
}

private static async UniTask UniTaskFoo(int id)
{
    await UniTask.Delay(200);
}

private static async UniTask<int> UniTaskBar(int id)
{
    await UniTask.Delay(200);
    return id + 1;
}

今回試したコードは、『Unity Test Framework完全攻略ガイド』サンプルプロジェクトにマージ済みです。 下記リンク先を参照してください。

github.com

また、SetUp/TearDown属性を付与したメソッドにもasyncキーワードを指定して非同期化することができます。 こちらもサンプルコードを参照してください。

github.com

github.com

[2023/1/29追記] 非同期テストでできること/ できないことを確認してまとめました

www.nowsprinting.com

参考

www.nowsprinting.com

www.nowsprinting.com

*1:されないこともあり謎。v1.3は実験的バージョンではないのですが…

*2:Unity Test Framework v2.0.1-exp.1ではv2.0.2でした

*3:v1.3.2で修正されました。see: https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-23368