Top Banner
RuntimeUnitTestToolk it 2017/03/04 – Yoshifumi Kawai / neuecc
17

RuntimeUnitTestToolkit for Unity

Apr 11, 2017

Download

Technology

Yoshifumi Kawai
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: RuntimeUnitTestToolkit for Unity

RuntimeUnitTestToolkit

2017/03/04 – Yoshifumi Kawai / neuecc

Page 2: RuntimeUnitTestToolkit for Unity

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)

Page 3: RuntimeUnitTestToolkit for Unity

UnitTest

Page 4: RuntimeUnitTestToolkit for Unity

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 のユニットテスト事情

Page 5: RuntimeUnitTestToolkit for Unity

UI は Visual Studio でNuGet 経由で入れるだけで VS 統合( 別途 VS 拡張インストールも不要で楽 )より多機能パラメタライズドテストは必須Fixture 周りもセンス良くまとまってるもう MSTest は投げ捨てて良さ気少なくとも私は投げ捨てます

xUnit.net is better than MSTest

Page 6: RuntimeUnitTestToolkit for Unity

NUnit ベースのが標準にのったね!良かったね!シーンを動かしながらとか実行しながらとかで、ゲーム的なテストのしづらさもカバーエディタ拡張によるテストウィンドウなども便利

が、しかしUnity Editor 上でしか動かないUnity Editor 上でしか動かないUnity Editor 上でしか動かない

Unity のユニットテスト事情

これがクリティカル!!!

Page 7: RuntimeUnitTestToolkit for Unity

IL2CPP で動かしたいじゃろ?ライブラリ開発 (UniRx, ZeroFormatter, MessagePack for C#などなど ) をよくやるIL2CPP 対応したいIL2CPP 起因で動かないことが非常によくある!!!- 派手なジェネリクス使用- C# の仕様限界をギリギリ突いたやらしい最適化コード- むしろ IL 生成も ( 許されてる環境では ) やる- リフレクションも IL2CPP のギリギリを攻めてやる

欲しいのはむしろ実機テスト

Page 8: RuntimeUnitTestToolkit for Unity

RuntimeUnitTestToolkit

Page 9: RuntimeUnitTestToolkit for Unity

Demo…

Page 10: RuntimeUnitTestToolkit for Unity

ボタンを押して成功したら Green失敗したら Red (ログウィンドウ

にはそれなりな情報が出る)

Unity のシーンとして構築してあるので、 Unity Editor のゲーム

ウィンドウの他、実機転送しての確認も可能

Page 11: RuntimeUnitTestToolkit for Unity

// 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

Page 12: RuntimeUnitTestToolkit for Unity

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

Page 13: RuntimeUnitTestToolkit for Unity

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

Page 14: RuntimeUnitTestToolkit for Unity

Conclusion

Page 15: RuntimeUnitTestToolkit for Unity

既に大量に投下済みUnity Cloud Build でビルド→ iOS で動かす → All Green 確認安心して IL2CPP 対応を謳える色々シビアなバランスで動かなくなったりたまによくあるけれど、ちゃんと検出できてホッと一安心今後は自動起動・終了時通知と AWS Device Farm のようなものと組み合わせて機種依存テストの完全自動化をもくろみたい?Released in GitHubhttps://github.com/neuecc/RuntimeUnitTestToolkit.unitypackages として Releases に置いてあります

UniRx を支えるユニットテスト

Page 16: RuntimeUnitTestToolkit for Unity

実行時テストにフォーカスUnity Editor でもいいので、 Play 時にフォーカスすべき(初手で Editor 環境で動かすことに固執したのは誤りでは)

非同期テストというか IEnumerator( コルーチンの受け入れ ) ができないとリソース読み込みや、 xxx が終わった時待機でチェックとかしたい

実機転送テストUnity Edtor 上に構築されたテストエクスプローラーはいい感じなので、それと同じふいんきのものが実機に転送できて動かしたい最終的にそれをテストファームで大量に動かしたりしたいよね

Unity のユニットテストに求めること

Page 17: RuntimeUnitTestToolkit for Unity

実行時テストにフォーカスUnity Editor でもいいので、 Play 時にフォーカスすべき(初手で Editor 環境で動かすことに固執したのは誤りでは)

非同期テストというか IEnumerator( コルーチンの受け入れ ) ができないとリソース読み込みや、 xxx が終わった時待機でチェックとかしたい

実機転送テストUnity Edtor 上に構築されたテストエクスプローラーはいい感じなので、それと同じふいんきのものが実機に転送できて動かしたい最終的にそれをテストファームで大量に動かしたりしたいよね

Unity のユニットテストに求めること 現状の Unity のテストツールはほぼ出来て

ない(実行時には Integration Test Framework が用意されてるけど、それ

じゃない感

ので、「現時点」段階だと正直求めているものでは全然ないので使えない

Unity 5.6(Beta) では大分改善されてきたらすぃ、ので待ってればそのう

ちよくなる期待はある