RuntimeUnitTestToolk it 2017/03/04 – Yoshifumi Kawai / neuecc
RuntimeUnitTestToolkit
2017/03/04 – Yoshifumi Kawai / neuecc
Self IntroductionWorkYoshifumi Kawai - Grani, Inc Director/CTOhttp://grani.jp/Grani is Top C# Mobile Game Studio in JapanC# 6.0 + .NET Framework 4.6 + UnityPrivateMicrosoft MVP for Visual C# since 2011Web http://neue.cc/Twitter @neueccUniRx(Reactive Extensions for Unity) - https://github.com/neuecc/UniRx (★1310)
UnitTest
MSTest or xUnit.net長らく Visual Studio に同梱されてきた MSTest が優勢最近は .NET Core によるクロスプラットフォーム・ Visual Studio 非依存化もあり xUnit.net もよく使われる
xUnit.netMicrosoft の人間の開発しているツールRoslyn(C# Compiler) なども xUnit であったり、 MS 社内ではxUnit 中心VS 2017 では標準テンプレートにも入ってきたし主流になりそう
NUnitMono では主流、現在も使われてないことはない。
.NET のユニットテスト事情
UI は Visual Studio でNuGet 経由で入れるだけで VS 統合( 別途 VS 拡張インストールも不要で楽 )より多機能パラメタライズドテストは必須Fixture 周りもセンス良くまとまってるもう MSTest は投げ捨てて良さ気少なくとも私は投げ捨てます
xUnit.net is better than MSTest
NUnit ベースのが標準にのったね!良かったね!シーンを動かしながらとか実行しながらとかで、ゲーム的なテストのしづらさもカバーエディタ拡張によるテストウィンドウなども便利
が、しかしUnity Editor 上でしか動かないUnity Editor 上でしか動かないUnity Editor 上でしか動かない
Unity のユニットテスト事情
これがクリティカル!!!
IL2CPP で動かしたいじゃろ?ライブラリ開発 (UniRx, ZeroFormatter, MessagePack for C#などなど ) をよくやるIL2CPP 対応したいIL2CPP 起因で動かないことが非常によくある!!!- 派手なジェネリクス使用- C# の仕様限界をギリギリ突いたやらしい最適化コード- むしろ IL 生成も ( 許されてる環境では ) やる- リフレクションも IL2CPP のギリギリを攻めてやる
欲しいのはむしろ実機テスト
RuntimeUnitTestToolkit
Demo…
ボタンを押して成功したら Green失敗したら Red (ログウィンドウ
にはそれなりな情報が出る)
Unity のシーンとして構築してあるので、 Unity Editor のゲーム
ウィンドウの他、実機転送しての確認も可能
// make unit test on plain C# classpublic class SampleGroup{ // all public methods are automatically registered in test group public void SumTest() { var x = int.Parse("100"); var y = int.Parse("200");
// using RuntimeUnitTestToolkit; // 'Is' is Assertion method, same as Assert(actual, expected) (x + y).Is(300); }}
Write Unit test on plain class and plain public method
public class SampleGroup{ // return type 'IEnumerator' is marked as async test method public IEnumerator AsyncTest() { var testObject = new GameObject("Test");
// wait asynchronous coroutine(UniRx coroutine runnner) yield return MainThreadDispatcher.StartCoroutine(MoveToRight(testObject));
// assrtion testObject.transform.position.x.Is(60);
GameObject.Destroy(testObject); }
IEnumerator MoveToRight(GameObject o) { for (int i = 0; i < 60; i++) { var p = o.transform.position; p.x += 1; o.transform.position = p; yield return null; } }}
also supports asynchronous test
public static class UnitTestLoader{ [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] public static void Register() { // setup created test class to RegisterAllMethods<T> UnitTest.RegisterAllMethods<SampleGroup>(); // and add other classes }}
New Group is added on playtime
finally register test classes on test manager
Conclusion
既に大量に投下済みUnity Cloud Build でビルド→ iOS で動かす → All Green 確認安心して IL2CPP 対応を謳える色々シビアなバランスで動かなくなったりたまによくあるけれど、ちゃんと検出できてホッと一安心今後は自動起動・終了時通知と AWS Device Farm のようなものと組み合わせて機種依存テストの完全自動化をもくろみたい?Released in GitHubhttps://github.com/neuecc/RuntimeUnitTestToolkit.unitypackages として Releases に置いてあります
UniRx を支えるユニットテスト
実行時テストにフォーカスUnity Editor でもいいので、 Play 時にフォーカスすべき(初手で Editor 環境で動かすことに固執したのは誤りでは)
非同期テストというか IEnumerator( コルーチンの受け入れ ) ができないとリソース読み込みや、 xxx が終わった時待機でチェックとかしたい
実機転送テストUnity Edtor 上に構築されたテストエクスプローラーはいい感じなので、それと同じふいんきのものが実機に転送できて動かしたい最終的にそれをテストファームで大量に動かしたりしたいよね
Unity のユニットテストに求めること
実行時テストにフォーカスUnity Editor でもいいので、 Play 時にフォーカスすべき(初手で Editor 環境で動かすことに固執したのは誤りでは)
非同期テストというか IEnumerator( コルーチンの受け入れ ) ができないとリソース読み込みや、 xxx が終わった時待機でチェックとかしたい
実機転送テストUnity Edtor 上に構築されたテストエクスプローラーはいい感じなので、それと同じふいんきのものが実機に転送できて動かしたい最終的にそれをテストファームで大量に動かしたりしたいよね
Unity のユニットテストに求めること 現状の Unity のテストツールはほぼ出来て
ない(実行時には Integration Test Framework が用意されてるけど、それ
じゃない感
ので、「現時点」段階だと正直求めているものでは全然ないので使えない
Unity 5.6(Beta) では大分改善されてきたらすぃ、ので待ってればそのう
ちよくなる期待はある