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完全攻略ガイド』サンプルプロジェクトにマージ済みです。 下記リンク先を参照してください。
また、SetUp/TearDown属性を付与したメソッドにもasyncキーワードを指定して非同期化することができます。 こちらもサンプルコードを参照してください。
[2023/1/29追記] 非同期テストでできること/ できないことを確認してまとめました
参考
*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