Unity5.6で非同期テストするときの基本的人権が保護されそう


概要

今はまだβなんだけど、Unity5.6には複数の機能が追加されそう。


・テストをPlay時に実行することができる

・IEnumeratorを返り値とする非同期なテストができる


という感じでいろいろ革新がある感じ。


これをディズニーランドの城ジェクションマッピング待ってる間に書いてる現在のverはβ11。

https://unity3d.com/jp/unity/beta



TestRunnerがPlayModeに対応

今までのモードはEditModeとしてそのままに、

PlayMode という「実行するとPlay開始し、完了するとPlay終了する」というテストモードが増えた。

スクリーンショット 2017-03-09 18.55.43.png


Enable playmode testsボタンを押すと、「エディタ再起動してね!」って言われるのがすごくbeta感ある。


再起動するとボタンは「テストを作成する」ボタンに変わるので、押すと雛形として「NewPlayModeTest.cs」がAssets/フォルダに直に吐かれる。



コード

こんな感じのコード。


using UnityEngine;

using UnityEngine.TestTools;

using NUnit.Framework;

using System.Collections;


public class NewPlayModeTest {


[Test]

public void NewPlayModeTestSimplePasses() {

// Use the Assert class to test conditions.

}


// A UnityTest behaves like a coroutine in PlayMode

// and allows you to yield null to skip a frame in EditMode

[UnityTest]

public IEnumerator NewPlayModeTestWithEnumeratorPasses() {

// Use the Assert class to test conditions.

// yield to skip a frame

yield return null;

}

}


Test attributeのほうはまあいつも通りのなんの面白みもないテストなんだけど、

UnityTest attributeの方が素晴らしくて。


・IEnumeratorを返すユニットテスト

・yieldを使ってテストの終了を遅延させることができる

= 非同期テストができる


という素晴らしい特性を獲得している。これが欲しかったのでMiyamasuとか作ってたんだけど。



例えば1000frame待つという簡単なテスト

こんな感じになる。

using UnityEngine;

using UnityEngine.TestTools;

using System.Collections;


public class NewPlayModeTest {


    int frame = 0;


    [UnityTest] public IEnumerator NewPlayModeTestWithEnumeratorPasses () {

        while (true) {

            if (frame == 1000) {

                Debug.Log("1000 frame passed.");

                break;

            }

            yield return null;

            frame++;

        }

    }

}


うーーーん簡単。ちゃんとPlayモードで動作する。



テスト完了時にチラッと見える「N件成功!」的なビューがあるんだけど

なんかじっくり見るにはどうすればいいんだろう。もうちょい調べる。



残る課題というかやりたいこと

実機で動かしたいので、なんらかランタイムのコードからこれらを着火する方法を見つけたい。


あと、実機でのテストの結果とかを集計したいねっていうのがこないだの春の自作Unityテストツール祭りで話題に出てたので、

そのへんも叶えたい。